Add basic change for v1453

Change-Id: I9497a61bbc3717f66413794a4e7dee0347c0bc33
diff --git a/mbtk/Make.defines b/mbtk/Make.defines
new file mode 100755
index 0000000..9967897
--- /dev/null
+++ b/mbtk/Make.defines
@@ -0,0 +1,74 @@
+# Common make definitions, customized for each platform

+

+# Definitions required in all program directories to compile and link

+# C programs using gcc.

+

+# static / shared

+BUILD_LIB_TYPE = shared

+# gcc-4.9 / gcc-8.4

+BUILD_PLATFORM = gcc-8.4

+ROOT = $(BUILD_ROOT)

+OUT_DIR = $(ROOT)/out

+BUILD_TOOLCHAIN_DIR = $(ROOT)/toolchain/linux64

+LOCAL_PATH=.

+

+export STAGING_DIR=

+

+ifeq ($(BUILD_PLATFORM), gcc-4.9)

+CC=$(BUILD_TOOLCHAIN_DIR)/bin/arm-openwrt-linux-muslgnueabi-gcc

+AR=$(BUILD_TOOLCHAIN_DIR)/bin/arm-openwrt-linux-muslgnueabi-ar

+else ifeq ($(BUILD_PLATFORM), gcc-8.4)

+CC=$(BUILD_TOOLCHAIN_DIR)/bin/arm-openwrt-linux-muslgnueabi-gcc

+AR=$(BUILD_TOOLCHAIN_DIR)/bin/arm-openwrt-linux-muslgnueabi-ar

+else

+CC=gcc

+AR=ar

+endif

+

+MAKE=make

+

+$(info BUILD_LIB_TYPE=$(BUILD_LIB_TYPE))

+$(info BUILD_PLATFORM=$(BUILD_PLATFORM))

+$(info ROOT=$(ROOT))

+$(info CC=$(CC))

+$(info AR=$(AR))

+

+# -Werror=non-virtual-dtor

+#CFLAGS= --sysroot=$(BUILD_TOOLCHAIN_DIR) -Os -pipe -rdynamic -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -mfloat-abi=hard -fno-exceptions -Wno-multichar -ffunction-sections -fdata-sections -funwind-tables -Wa,--noexecstack -fno-short-enums -no-canonical-prefixes -fno-canonical-system-headers -mfpu=neon -fno-builtin-sin -fno-strict-volatile-bitfields -Wno-psabi -mthumb-interwork -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith  -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop -frename-registers -mthumb -fomit-frame-pointer -fno-strict-aliasing -Werror=format-security -Werror=return-type -Werror=address -Werror=sequence-point -ffunction-sections -Wl,--gc-sections -Wl,--no-undefined -Wno-sign-compare -Wno-pointer-arith

+CFLAGS = --sysroot=$(BUILD_TOOLCHAIN_DIR) -Os -pipe -rdynamic -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -Wall -Werror -g

+

+CFLAGS_TEST = --sysroot=$(BUILD_TOOLCHAIN_DIR) -Os -pipe -rdynamic -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -mfloat-abi=hard -fno-exceptions -Wno-multichar -ffunction-sections -fdata-sections -funwind-tables -Wa,--noexecstack -fno-short-enums -no-canonical-prefixes -fno-canonical-system-headers -mfpu=neon -fno-builtin-sin -fno-strict-volatile-bitfields -Wno-psabi -mthumb-interwork -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith  -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop -frename-registers -mthumb -fomit-frame-pointer -fno-strict-aliasing -Werror=format-security -Werror=return-type -Werror=address -Werror=sequence-point -ffunction-sections -Wl,--gc-sections -Wl,--no-undefined -Wno-sign-compare -Wno-pointer-arith

+

+AWK=awk

+

+#CFLAGS += -Wno-error=format-truncation -Wno-error=format-overflow= -Wno-error=stringop-overread -Wno-error=deprecated-declarations

+

+INC_DIR = \

+	-I$(LOCAL_PATH)/ \

+	-I$(LOCAL_PATH)/inc \

+	-I$(BUILD_ROOT)/include \

+	-I$(BUILD_ROOT)/include/mbtk \

+	-I$(BUILD_ROOT)/include/lynq \

+	-I$(BUILD_ROOT)/include/mqtt \

+	-I$(BUILD_ROOT)/include/ql_v2

+

+# -DCONFIG_AB_SYSTEM

+DEFINE = \

+	-DMBTK_SUPPORT \

+	-DMARVELL_EXTENDED \

+	-DPXA1826_AUDIO \

+	-D__USE_GNU \

+	-DNOT_DROPPED_FLAGS_TEST \

+	-DNDEBUG \

+	-UDEBUG \

+	-D_FORTIFY_SOURCE=2 \

+	-D_GNU_SOURCE

+

+# 	-L$(OUT_DIR)/lib

+LIB_DIR = \

+	-L$(BUILD_ROOT)/rootfs/lib

+

+LIBS = -lpthread -lstdc++ -lwpa_client

+

+# Common temp files to delete from each directory.

+TEMPFILES=core core.* *.o temp.* *.out

diff --git a/mbtk/Makefile b/mbtk/Makefile
new file mode 100755
index 0000000..94a406f
--- /dev/null
+++ b/mbtk/Makefile
@@ -0,0 +1,24 @@
+BUILD_ROOT = $(shell pwd)
+include Make.defines
+
+DIRS = liblynq_lib_rilv2 libql_lib_v2_rilv2 test helloworld
+
+all:
+	@echo $(ROOT)
+	@echo $(CC)
+	@echo $(OUT_DIR)
+	@rm -rf $(OUT_DIR)
+	@ [ ! -d out/bin ] && mkdir -p out/bin
+	@ [ ! -d out/lib ] && mkdir -p out/lib
+	@for i in $(DIRS); do \
+		if [ -d $$i ];then \
+			(cd $$i && echo "making $$i" && $(MAKE) ) || exit 1; \
+		fi \
+	done
+	@echo "Success"
+
+clean:
+	@for i in $(DIRS); do \
+		(cd $$i && echo "Cleaning $$i" && $(MAKE) clean) || exit 1; \
+	done
+	rm -rf $(OUT_DIR)
\ No newline at end of file
diff --git a/mbtk/device_info_generate b/mbtk/device_info_generate
new file mode 100755
index 0000000..5d7e738
--- /dev/null
+++ b/mbtk/device_info_generate
Binary files differ
diff --git a/mbtk/helloworld/Makefile b/mbtk/helloworld/Makefile
new file mode 100755
index 0000000..6f25aa9
--- /dev/null
+++ b/mbtk/helloworld/Makefile
@@ -0,0 +1,44 @@
+BUILD_ROOT = $(shell pwd)/..
+include $(BUILD_ROOT)/Make.defines
+
+LOCAL_PATH=$(BUILD_ROOT)/helloworld
+
+INC_DIR += \
+		-I$(LOCAL_PATH)/inc
+	
+LIB_DIR +=
+
+LIBS += 
+
+CFLAGS += 
+
+DEFINE +=
+
+MY_FILES_PATH:=$(LOCAL_PATH)/src
+#ifeq ($(CONFIG_MBTK_QL_SUPPORT),y)
+#MY_FILES_PATH += $(LOCAL_PATH)/ql
+#endif
+
+#ifeq ($(CONFIG_MBTK_PLATFORM),linux)
+#MY_FILES_PATH += $(LOCAL_PATH)/platform/linux
+#endif
+
+MY_FILES_SUFFIX:=%.c %.cpp
+My_All_Files := $(foreach src_path,$(MY_FILES_PATH), $(shell find "$(src_path)" -type f))
+MY_SRC_LIST  := $(filter $(MY_FILES_SUFFIX),$(My_All_Files))
+MY_SRC_LIST  := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%)
+LOCAL_SRC_FILES += $(MY_SRC_LIST)
+$(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES))
+
+dtarget := $(OUT_DIR)/bin/helloworld
+
+all: $(dtarget)
+
+$(dtarget):
+	@echo "  BIN     $@"
+	$(CC) $(CFLAGS) $(LOCAL_SRC_FILES) -o $@ $(DEFINE) $(INC_DIR) $(LIB_DIR) $(LIBS)
+	#cp $@ $(BUILD_ROOT)/bin
+
+clean:
+	
+
diff --git a/mbtk/helloworld/inc/helloworld.h b/mbtk/helloworld/inc/helloworld.h
new file mode 100755
index 0000000..3ba512c
--- /dev/null
+++ b/mbtk/helloworld/inc/helloworld.h
@@ -0,0 +1,6 @@
+#ifndef _HELLO_WORLD_H

+#define _HELLO_WORLD_H

+

+#define HELLO_WORLD "Hello World!"

+

+#endif /* _HELLO_WORLD_H */
\ No newline at end of file
diff --git a/mbtk/helloworld/src/main.c b/mbtk/helloworld/src/main.c
new file mode 100755
index 0000000..2dec0e7
--- /dev/null
+++ b/mbtk/helloworld/src/main.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+
+#include "helloworld.h"
+
+int main(int argc, char *argv[])
+{
+	printf("%s\n", HELLO_WORLD);
+	return 0;
+}
\ No newline at end of file
diff --git a/mbtk/include/lynq/liblog.h b/mbtk/include/lynq/liblog.h
new file mode 100755
index 0000000..840b43d
--- /dev/null
+++ b/mbtk/include/lynq/liblog.h
@@ -0,0 +1,41 @@
+#ifndef __LIBLOG_H__
+#define __LIBLOG_H__
+
+#include <unistd.h>
+#include "mbtk_log.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum
+{
+    LOG_UNSET = -1,
+    LOG_VERBOSE = 2,
+    LOG_ERROR = 3, 
+    LOG_WARNING = 4,
+    LOG_INFO = 6,
+    LOG_DEBUG = 7, 
+    LOG_LEVEL_MAX = 9
+}log_level_enum;
+
+void lynq_log_global_output(log_level_enum Level,const char *format,...);
+void lynq_log_configuration_init(const char *log_name);
+const char* lynq_read_log_version();
+
+//log level api
+int lynq_set_log_level(const char * module_name, log_level_enum level);
+int lynq_get_log_level(const char * module_name, log_level_enum *level);
+int lynq_set_special_log_level(const char * exe_name, const char * module_name, log_level_enum level);
+int lynq_get_special_log_level(const char * exe_name, const char * module_name, log_level_enum *level);
+int lynq_notify_recalc_log_level(pid_t pid);
+int lynq_write_log_to_file_now();
+int lynq_stop_record_log(int value);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif  //__LOG_H__
diff --git a/mbtk/include/lynq/liblynq-at-common.h b/mbtk/include/lynq/liblynq-at-common.h
new file mode 100755
index 0000000..5ca8ca8
--- /dev/null
+++ b/mbtk/include/lynq/liblynq-at-common.h
@@ -0,0 +1,14 @@
+#ifndef LIBLYNQ_AT_COMMON_H
+#define LIBLYNQ_AT_COMMON_H 1
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void ( *lynq_atsvc_incb )( const char *input,const int length);
+typedef void ( *lynq_atsvc_outcb )(char *output, int out_max_size, int mode);
+lynq_atsvc_incb lynq_register_at_common(lynq_atsvc_outcb out_cb);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
\ No newline at end of file
diff --git a/mbtk/include/lynq/libpoweralarm.h b/mbtk/include/lynq/libpoweralarm.h
new file mode 100755
index 0000000..4110fba
--- /dev/null
+++ b/mbtk/include/lynq/libpoweralarm.h
@@ -0,0 +1,36 @@
+/*******************************************************

+* 

+* @brief:   none

+* @details:  add libpoweralarm api

+* @author:   l.yang

+* @date:     2023.8.21

+* @version:  V1.0

+* @copyright:Copyright (c) MobileTek 

+*

+*********************************************/

+

+#ifndef _LYNQ_POWERALARM_

+#define _LYNQ_POWERALARM_

+#ifdef __cplusplus

+    extern "C" {

+#endif

+

+typedef int (*lynq_wakealarm_add_cb)(unsigned int src_id, int rtc_id);

+int lynq_rtc_service_init(void);

+int lynq_rtc_service_deinit(void);

+ssize_t poweralarm(char *buffer,int src_id);

+ssize_t wakealarm(char *buffer,int src_id,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify );

+ssize_t cancel_wakealarm(int src_id, int rtc_id);

+

+int lynq_set_wakealarm(unsigned long time_sec,int src_id,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify );

+int  lynq_set_poweralarm(unsigned long time_sec,int src_id);

+

+

+

+

+#ifdef __cplusplus

+}

+#endif

+#endif

+

+

diff --git a/mbtk/include/lynq/lynq-adc.h b/mbtk/include/lynq/lynq-adc.h
new file mode 100755
index 0000000..a0051cc
--- /dev/null
+++ b/mbtk/include/lynq/lynq-adc.h
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+// #include <sc_bsp.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum ADC_CHANNEL_ENUM
+{
+    QADC_NONE = 0,
+    ADC0 =1,
+    ADC1 =2,
+    ADC2 =3,
+    QADC_END
+}ADC_CHANNEL_E;
+
+int qser_adc_show(ADC_CHANNEL_E qadc);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/mbtk/include/lynq/lynq-gpio.h b/mbtk/include/lynq/lynq-gpio.h
new file mode 100755
index 0000000..39eed04
--- /dev/null
+++ b/mbtk/include/lynq/lynq-gpio.h
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+//#include <sc_bsp.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_GPIO_NUM        (200)
+// static void *test_gpio_handle[MAX_GPIO_NUM]={NULL};
+
+int lynq_gpio_init(int gpio, int direction, int value, int pullsel);
+
+int lynq_gpio_deinit(int gpio);
+
+int lynq_gpio_direction_set(int gpio, int direction);
+
+int lynq_gpio_value_set(int gpio, int value);
+
+int lynq_gpio_value_get(int gpio);
+
+int lynq_gpio_pullsel_set(int gpio, int pullsel);
+
+int lynq_gpio_pullsel_get(int gpio);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/mbtk/include/lynq/lynq-irq.h b/mbtk/include/lynq/lynq-irq.h
new file mode 100755
index 0000000..4ad03c5
--- /dev/null
+++ b/mbtk/include/lynq/lynq-irq.h
@@ -0,0 +1,177 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+struct sc_irq_info {
+	unsigned int	line;
+	unsigned int	type;
+};
+
+#define SC_IRQ_IOC_MAGIC            'I'
+
+/*ioctl cmd usd by device*/
+#define SC_IRQ_INSTALL              _IOW(SC_IRQ_IOC_MAGIC, 1, char *)
+#define SC_IRQ_SET_TYPE             _IOW(SC_IRQ_IOC_MAGIC, 2, char *)
+#define SC_IRQ_SET_WAKE             _IOW(SC_IRQ_IOC_MAGIC, 3, char *)
+#define SC_IRQ_GET_WAKE             _IOW(SC_IRQ_IOC_MAGIC, 4, char *)
+#define SC_IRQ_UNINSTALL            _IOW(SC_IRQ_IOC_MAGIC, 5, char *)
+
+#define SC_IRQ_GET_STATUS           _IOW(SC_IRQ_IOC_MAGIC, 6, char *)
+#define SC_IRQ_CLEAR_STATUS         _IOW(SC_IRQ_IOC_MAGIC, 7, char *)
+
+#define SC_IRQ_DEV                  "/dev/sc_irq"
+
+
+
+/*----------------------------------------------------------*/
+struct sc_pm_info {
+	unsigned int	sleep_time;		/* ms */
+	unsigned int	wake_event;
+};
+
+#define SC_PM_WL_EVENT_EXT0         ((unsigned int)1 << 0)
+#define SC_PM_WL_EVENT_EXT1         ((unsigned int)1 << 1) 
+#define SC_PM_WL_EVENT_EXT2         ((unsigned int)1 << 2)
+#define SC_PM_WL_EVENT_EXT3         ((unsigned int)1 << 3)
+#define SC_PM_WL_EVENT_EXT4         ((unsigned int)1 << 4)
+#define SC_PM_WL_EVENT_EXT5         ((unsigned int)1 << 5)
+#define SC_PM_WL_EVENT_EXT6         ((unsigned int)1 << 6)
+#define SC_PM_WL_EVENT_EXT7         ((unsigned int)1 << 7)
+
+#define SC_PM_IOC_MAGIC             'P'
+
+/*ioctl cmd usd by device*/
+#define SC_PM_WL_SET                _IOW(SC_PM_IOC_MAGIC, 1, char *)
+#define SC_PM_WL_CLEAR              _IOW(SC_PM_IOC_MAGIC, 2, char *)
+#define SC_PM_WL_GET                _IOW(SC_PM_IOC_MAGIC, 3, char *)
+
+#define SC_PM_DEV                   "/dev/sc_pm"
+
+
+typedef void (*irq_handler)(void);
+
+#define SC_LIBIRQ_EXT0						(0)
+#define SC_LIBIRQ_EXT1						(1)
+#define SC_LIBIRQ_EXT2						(2)
+#define SC_LIBIRQ_EXT3						(3)
+#define SC_LIBIRQ_EXT4						(4)
+#define SC_LIBIRQ_EXT5						(5)
+#define SC_LIBIRQ_EXT6						(6)
+#define SC_LIBIRQ_EXT7						(7)
+#define SC_LIBIRQ_EXT8						(8)
+#define SC_LIBIRQ_EXT9						(9)
+#define SC_LIBIRQ_EXT10						(10)
+#define SC_LIBIRQ_EXT11						(11)
+#define SC_LIBIRQ_EXT12						(12)
+#define SC_LIBIRQ_EXT13						(13)
+#define SC_LIBIRQ_EXT14						(14)
+#define SC_LIBIRQ_EXT15						(15)
+#define SC_LIBIRQ_MAX						(200)
+
+#define SC_LIBIRQ_TYPE_RISING				(0)
+#define SC_LIBIRQ_TYPE_FALLING				(1)
+#define SC_LIBIRQ_TYPE_LEVEL_HIGH			(2)
+#define SC_LIBIRQ_TYPE_LEVEL_LOW			(3)
+#define SC_LIBIRQ_TYPE_MAX					(4)
+
+/*
+ *  Add a handler for an interrupt line.
+ *
+ *  line      		:  The interrupt line
+ *  handler         :  Function to be called when the IRQ occurs.
+ *  trig_type		:  rising edge or fallling edge
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_install(unsigned int line, irq_handler handler, int trig_type);
+
+/*
+ *  free an interrupt allocated with sc_irq_install.
+ *
+ *  line      		:  The interrupt line
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_uninstall(unsigned int line);
+
+/*
+ *  set the irq trigger type for an irq.
+ *
+ *  line      		:  The interrupt line
+ *  trig_type		:  rising edge or fallling edge
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_set_type(unsigned int line, int trig_type);
+
+/*
+ *  get the irq trigger type for an irq.
+ *
+ *  line      		:  The interrupt line
+ *  trig_type		:  edge or level type
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_get_type(unsigned int line, int *trig_type);
+
+/*
+ *  control irq power management wakeup.
+ *
+ *  line      		:  The interrupt line
+ *  en				:  enable/disable power management wakeup
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_set_wake(unsigned int line, int en);
+
+/*
+ *  get the irq awake status for an irq.
+ *
+ *  line      		:  The interrupt line
+ *  en				:  enable/disable power management wakeup
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_get_wake(unsigned int line, int *en);
+
+typedef enum 
+{
+    Rising_edge_trigger = 0,//:上升沿触发
+    Falling_edge_trigger = 1,//:下降沿触发
+    High_level_trigger = 2,//:高电平触发
+    Low_level_trigger = 3,//:低电平触发
+
+}trig_type_e;
+
+
+//int line_gpio[15]={-1,48,49,50,51,52,53,54,119,128,129,-1,131,-1,125};//this is the line match gpio
+int line_gpio[4]={21, 22, 23 ,24};//this is the line match gpio
+
+typedef void (*irq_handler)(void);
+
+int lynq_irq_install(int line, irq_handler irq_handler, trig_type_e trig_type);
+
+int lynq_irq_uninstall(int line);
+
+int lynq_irq_set_type(int line, int trig_type);
+
+int lynq_irq_get_type(int line);
+
+int lynq_irq_set_wake(int line, int en);
+
+int lynq_irq_get_wake(int line);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/mbtk/include/lynq/lynq-qser-audio.h b/mbtk/include/lynq/lynq-qser-audio.h
new file mode 100755
index 0000000..d5a6f20
--- /dev/null
+++ b/mbtk/include/lynq/lynq-qser-audio.h
@@ -0,0 +1,44 @@
+/*******************************************************
+*
+* @brief: Add audio api
+* @details:  add liblynq-qser-audio api
+* @author:   yu.dong
+* @date:     2023.9.28
+* @version:  V1.0
+* @copyright:Copyright (c) MobileTek
+*
+*********************************************/
+#ifndef LYNQ_QSER_AUDIO
+#define LYNQ_QSER_AUDIO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*_cb_onPlayer)(int);
+
+int qser_AudPlayer_Open(char* device, _cb_onPlayer cb_fun);
+int qser_AudPlayer_PlayFrmFile(int hdl, const char *fd, int offset);
+int qser_AudPlayer_PlayPcmBuf(const unsigned char *pcm_data, int data_size, int period_size,
+                                int period_count, int num_channels, int sample_rate, int ownerid);
+int qser_AudPlayer_Pause(int hdl);
+int qser_AudPlayer_Resume(int hdl);
+void qser_AudPlayer_Stop(int hdl);
+void qser_AudPlayer_Close(int hdl);
+
+int qser_AudRecorder_Open(char* device, _cb_onPlayer cb_fun);
+int qser_AudRecorder_StartRecord(int hdl, const char *fd, int offset);
+int qser_AudRecorder_StartRecord_Custom(char *file, int period_size, int period_count,
+            int num_channels, int sample_rate);
+int qser_AudRecorder_Pause(void);
+int qser_AudRecorder_Resume(void);
+void qser_AudRecorder_Stop(void);
+void qser_AudRecorder_Close(void);
+
+void qser_Audio_Deinit(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/mbtk/include/lynq/lynq-qser-autosuspend.h b/mbtk/include/lynq/lynq-qser-autosuspend.h
new file mode 100755
index 0000000..118f7ac
--- /dev/null
+++ b/mbtk/include/lynq/lynq-qser-autosuspend.h
@@ -0,0 +1,81 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <pthread.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_LOCK_NUM 128
+
+#define E_READ -2
+#define E_WRITE -3
+#define E_TABLE_FULL -4
+#define E_LOCK_EXIST -5
+#define E_INPUT_ERROR -6
+
+typedef enum
+{
+    E_QL_LPM_FALLING = 0, /* Falling, Means wakeupin falling to wakeup the module, or wakeupout falling to wakeup mcu
+. */
+    E_QL_LPM_RISING = 1, /* Rising, Means  wakeupin rising to wakeup the module,  or wakeupout rising to wakeup  mcu.
+*/
+}qser_lpm_edge_t;
+
+typedef int qser_lpm_pin_t;
+
+
+typedef struct{
+    qser_lpm_pin_t wakeupin_pin;
+    qser_lpm_edge_t wakeupin_edge;
+}qser_lpm_wakeupin_data_t;
+
+typedef struct{
+    qser_lpm_pin_t wakeupout_pin;
+    qser_lpm_edge_t wakeupout_edge;
+}qser_lpm_wakeupout_data_t;
+
+
+typedef void (*qser_lpm_Handler_t)
+(
+    qser_lpm_edge_t lpm_edge
+);
+
+typedef struct{
+    qser_lpm_wakeupin_data_t wakeupin;
+    qser_lpm_wakeupout_data_t wakeupout;
+}qser_pm_cfg_t;
+
+
+typedef struct
+{
+    char lock_name[MAX_LOCK_NUM][64];
+    int lock_pid[MAX_LOCK_NUM];
+} LOCK_TABLE;
+
+typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
+
+int read_lock_table(void);
+int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg);
+int qser_lpm_deinit(void);
+int qser_autosuspend_enable(char enable);
+int qser_wakelock_create(const char *name, size_t len);
+int qser_wakelock_lock(int fd);
+int qser_wakelock_unlock(int fd);
+int qser_wakelock_destroy(int fd);
+
+int qser_whitelist_set(char *whitelist);
+int qser_whitelist_get(char *whitelist);
+
+//static void* suspend_timer_thread_run(void* arg);
+//int suspend_timer_timer_init(void);
+int qser_suspend_timer_set(int time, mbtk_info_callback_func cb);
+
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/mbtk/include/lynq/lynq-qser-fota.h b/mbtk/include/lynq/lynq-qser-fota.h
new file mode 100755
index 0000000..bbc674c
--- /dev/null
+++ b/mbtk/include/lynq/lynq-qser-fota.h
@@ -0,0 +1,36 @@
+/*******************************************************

+* 

+* @brief:

+* @details:  add fota upgrade api

+* @author:   l.yang

+* @date:     2023.8.3

+* @version:  V1.0

+* @copyright:Copyright (c) MobileTek 

+*

+*********************************************/

+#ifndef LYNQ_QSER_FOTA

+#define LYNQ_QSER_FOTA 

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+

+/*******************************************************************************

+* @brief get reboot upgrade status 

+  @param 

+    NULL

+  @return 

+        if reboot the other system successfully return 1, else return 0

+ *******************************************************************************/

+int lynq_get_reboot_upgrade_status(void);

+int lynq_get_upgrade_status(void);

+int lynq_fota_set_addr_value(char        *value,int size);

+int lynq_fota_nrestart(void);

+int lynq_rock_main(int first_run);

+int lynq_read_process(void);

+

+#ifdef __cplusplus

+}

+#endif

+#endif

+

diff --git a/mbtk/include/lynq/lynq-qser-usb.h b/mbtk/include/lynq/lynq-qser-usb.h
new file mode 100755
index 0000000..97428d4
--- /dev/null
+++ b/mbtk/include/lynq/lynq-qser-usb.h
@@ -0,0 +1,25 @@
+/*******************************************************
+* 
+* @brief: Add usb api
+* @details:  add liblynq-qser-usb api
+* @author:   wz.wang
+* @date:     2024.2.18
+* @version:  V1.0
+* @copyright:Copyright (c) MobileTek
+*
+*********************************************/
+#ifndef LYNQ_QSER_USB
+#define LYNQ_QSER_USB
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int  qser_get_usb_usermode_net_state(void);
+int  qser_get_usb_usermode_adb_state(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/mbtk/include/lynq/lynq-qser-voice.h b/mbtk/include/lynq/lynq-qser-voice.h
new file mode 100755
index 0000000..668d6ce
--- /dev/null
+++ b/mbtk/include/lynq/lynq-qser-voice.h
@@ -0,0 +1,218 @@
+/**
+ *@file     qser_voice.h
+ *@date     2017-11-30
+ *@author
+ *@brief
+ */
+
+
+#ifndef __LYNQ_QSER_VOICE_H__
+#define __LYNQ_QSER_VOICE_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "mbtk_type.h"
+
+typedef enum
+{
+    E_QSER_VCALL_EXTERNAL_SLOT_1,
+    E_QSER_VCALL_EXTERNAL_SLOT_2,
+    E_QSER_VCALL_EMBEDDED,
+    E_QSER_VCALL_REMOTE,
+    E_QSER_VCALL_ID_MAX
+}E_QSER_VCALL_ID_T;
+
+typedef enum
+{
+    E_QSER_VOICE_CALL_STATE_INCOMING      = 0x0000, /**< MT incoming; CC setup. */
+    E_QSER_VOICE_CALL_STATE_DIALING       = 0x0001, /**< Dialing state. */
+    E_QSER_VOICE_CALL_STATE_ALERTING      = 0x0002, /**< MT call waiting; MO alterting. */
+    E_QSER_VOICE_CALL_STATE_ACTIVE        = 0x0003, /**< Call is active. */
+    E_QSER_VOICE_CALL_STATE_HOLDING       = 0x0004, /**< Call is on hold. */
+    E_QSER_VOICE_CALL_STATE_END           = 0x0005, /**< Call is disconnected. */
+    E_QSER_VOICE_CALL_STATE_WAITING       = 0x0006, /**< Call is waiting. */
+}qser_voice_call_state_t;
+
+typedef enum
+{
+    E_QSER_VOICE_CALL_WAITING_VOICE_ENABLED       = 0, /**<  Voice call waiting enabled. */
+    E_QSER_VOICE_CALL_WAITING_DISABLED            = 1, /**<  Voice call waiting disabled. */
+}E_QSER_VOICE_CALL_WAITING_SERVICE_T;
+
+typedef struct
+{
+    E_QSER_VOICE_CALL_WAITING_SERVICE_T   waiting_service;
+}qser_voice_call_waiting_service_t;
+
+typedef qser_voice_call_state_t E_QSER_VOICE_CALL_STATE_T;
+
+typedef uint32_t voice_client_handle_type;
+
+/* Callback function registered via QSER_Voice_Call_AddStateHandler;
+   This will be called if any stated changed of call_id
+*/
+typedef void (*QSER_VoiceCall_StateHandlerFunc_t)
+(
+    int                     caLOCAL_C_INCLUDESll_id,
+    char*                   phone_num,
+    E_QSER_VOICE_CALL_STATE_T state,
+    void                    *contextPtr
+);
+
+/* Init voice module and return h_voice, this should be called before any other APIs */
+int qser_voice_call_client_init(voice_client_handle_type  *ph_voice);
+
+/* DeInit voice module and release resources, this should be called at last */
+int qser_voice_call_client_deinit(voice_client_handle_type h_voice);
+
+/* Add callback function, if any call state changed, handlerPtr will be called to notify App */
+int qser_voice_call_addstatehandler(voice_client_handle_type          h_voice,
+                                  QSER_VoiceCall_StateHandlerFunc_t   handlerPtr,
+                                  void*                             contextPtr);
+
+/* Remove callback function, won't receive any notify anymore */
+int qser_voice_call_removestatehandle(voice_client_handle_type       h_voice);
+
+/* Start call and return call_id, this can be used in the later */
+int qser_voice_call_start(voice_client_handle_type    h_voice,
+                        E_QSER_VCALL_ID_T             simId,
+                        char*                       phone_number,   ///< [IN] Destination identifier for the voice
+                        int                         *call_id);       ///< [OUT] call id
+
+/* End call of call_id, which returned by QSER_Voice_Call_Start or callback func register via QSER_Voice_Call_AddStateHandler */
+int qser_voice_call_end(  voice_client_handle_type    h_voice,
+                        int                         call_id);        ///< [IN] call id, return by QSER_Voice_Start
+
+/* Answer the call of call_id, which returned by callback func register via QSER_Voice_Call_AddStateHandler */
+int qser_voice_call_answer(voice_client_handle_type    h_voice,
+                         int                         call_id );
+
+int qser_voice_call_switch_waiting_or_holding_and_active(voice_client_handle_type h_voice);
+
+//set voice speech volume
+int qser_voice_set_speech_volume(const int volume);
+
+//Get voice speech volume
+int qser_voice_get_speech_volume(int *volume);
+
+//Set voice call waiting
+int qser_voice_call_setwaiting
+(
+    int                                 h_voice,
+    qser_voice_call_waiting_service_t e_service
+);
+
+//Get voice call waiting status
+int qser_voice_call_getwaitingstatus
+(
+    int                                 h_voice,
+    qser_voice_call_waiting_service_t *pe_service
+);
+
+
+int qser_voice_set_dtmf(const char callnum);
+
+/*
+Usage 1 (register callback and wait for new call in, then answer):
+1, QSER_Voice_Call_Client_Init
+2, QSER_Voice_Call_AddStateHandler(pf_cb)
+3, wait for new call arrive, pf_cb will pass the call_id to app.
+4, QSER_Voice_Call_Answer(call_id)
+5, QSER_Voice_Call_End
+6, QSER_Voice_Call_Client_Deinit
+
+
+Usage 2 (call out):
+1, QSER_Voice_Call_Client_Init
+2, QSER_Voice_Call_AddStateHandler(pf_cb)
+3, QSER_Voice_Call_Start
+4, QSER_Voice_Call_End
+5, QSER_Voice_Call_Client_Deinit
+
+
+*/
+
+#ifdef ECALL_SUPPORT
+
+#define QSER_MSD_MAX_LENGTH  140
+
+typedef enum{ 
+    E_QSER_VOICE_ECALL_SET_NUMBER = 0,     /* Set Number */
+    E_QSER_VOICE_ECALL_SET_URI = 1,      /* Set Uri */   
+}E_QSER_VOICE_ECALL_SET_TYPE_T; 
+
+typedef enum{
+    E_QSER_VOICE_ECALL_CAT_MANUAL = 0,      /* Manual Emergency eCall */
+    E_QSER_VOICE_ECALL_CAT_AUTO = 1,     /*  Automatic Emergency eCall */
+}E_QSER_VOICE_ECALL_CATEGORY_T;
+
+
+typedef enum{
+    E_QSER_VOICE_ECALL_TEST = 0,     /* Test eCall */
+    E_QSER_VOICE_ECALL_EMERGENCY = 1,      /* Emergency eCall */
+    E_QSER_VOICE_ECALL_RECONFIG = 2,     /*  Reconfiguration eCall */
+}E_QSER_VOICE_ECALL_VARIANT_T;
+
+typedef enum{
+    E_QSER_VOICE_ECALL_IND_SENDING_START = 1,
+    E_QSER_VOICE_ECALL_IND_SENDING_MSD = 2,
+    E_QSER_VOICE_ECALL_IND_LLACK_RECEIVED = 3,
+    E_QSER_VOICE_ECALL_IND_ALACK_POSITIVE_RECEIVED = 4,
+    E_QSER_VOICE_ECALL_IND_ALACK_CLEARDOWN_RECEIVED = 5,
+    E_QSER_VOICE_ECALL_IND_DAILING = 9,
+    E_QSER_VOICE_ECALL_IND_ALERTING = 10,
+    E_QSER_VOICE_ECALL_IND_ACTIVE = 11,
+    E_QSER_VOICE_ECALL_IND_DISCONNECTED = 12,
+    E_QSER_VOICE_ECALL_IND_IMS_ACTIVE = 13,
+    E_QSER_VOICE_ECALL_IND_IMS_DISCONNECTED = 14,
+    E_QSER_VOICE_ECALL_IND_ABNORMAL_HANGUP=15,
+    E_QSER_VOICE_ECALL_IND_IMS_MSD_ACK = 20,
+    E_QSER_VOICE_ECALL_IND_IMS_UPDATE_MSD = 21,
+    E_QSER_VOICE_ECALL_IND_IMS_IN_BAND_TRANSFER = 22,
+    E_QSER_VOICE_ECALL_IND_IMS_MSD_NACK = 23,
+    E_QSER_VOICE_ECALL_IND_IMS_SRVCC = 24,
+    E_QSER_VOICE_ECALL_IND_ONLY_DEREGISTRATION = 31,
+    E_QSER_VOICE_ECALL_IND_MAY_DEREGISTER = 32,
+    E_QSER_VOICE_ECALL_IND_PSAP_CALLBACK_START = 40,
+    E_QSER_VOICE_ECALL_IND_PSAP_CALLBACK_IMS_UPDATE_MSD = 41,
+    E_QSER_VOICE_ECALL_IND_SENDING_START_IN_VOICE=8000,    
+    E_QSER_VOICE_ECALL_IND_T2_TIMER_OUT = 9000,
+    E_QSER_VOICE_ECALL_IND_T5_TIMER_OUT = 9001,
+    E_QSER_VOICE_ECALL_IND_T6_TIMER_OUT = 9002,
+    E_QSER_VOICE_ECALL_IND_T7_TIMER_OUT = 9003,
+    E_QSER_VOICE_ECALL_IND_REDIAL_TIMER_OUT = 9004,    
+    E_QSER_VOICE_ECALL_IND_AUTO_ANS_TIMER_OUT = 9005,
+    E_QSER_VOICE_ECALL_IND_AUTO_ANS_IMS_TIMER_OUT = 9006,
+    E_QSER_VOICE_ECALL_IND_UNSPECIFIED = 0xffff,
+}E_QSER_VOICE_ECALL_INDICATION_T;
+
+typedef void (*QSER_ECall_IndHandlerFunc_t)
+(
+    int                     callid,   
+    E_QSER_VOICE_ECALL_INDICATION_T ind,
+    void                    *contextPtr
+);
+
+int qser_voice_set_test_num(voice_client_handle_type*       h_voice,E_QSER_VOICE_ECALL_SET_TYPE_T type, const char *test_num, int test_num_length);
+int qser_voice_fast_ecall(voice_client_handle_type*       h_voice,
+                        int                         *call_id,
+                        E_QSER_VOICE_ECALL_CATEGORY_T cat,
+                        E_QSER_VOICE_ECALL_VARIANT_T variant,
+                        const char *addr, 
+                        int addr_length, 
+                        const unsigned char *msd_data,
+                        int msd_length);  //msd_length should <= QSER_MSD_MAX_LENGTH
+int qser_voice_set_msd( int callid, const unsigned char *msd_data, int msd_length); // msd_length should <= QSER_MSD_MAX_LENGTH
+int qser_voice_add_ecall_indhandler(voice_client_handle_type*          h_voice,
+                                  QSER_ECall_IndHandlerFunc_t   handlerPtr,
+                                  void*                             contextPtr);
+
+#endif
+    
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __QSER_VOICE_H__
+
diff --git a/mbtk/include/lynq/lynq_alarm.h b/mbtk/include/lynq/lynq_alarm.h
new file mode 100755
index 0000000..b9a9d02
--- /dev/null
+++ b/mbtk/include/lynq/lynq_alarm.h
@@ -0,0 +1,23 @@
+/*
+* qser_alarm.h
+*
+* QSER alarm header.
+*
+* Author : lb
+* Date   : 2023/11/23 10:45:44
+*/
+#ifndef _QSER_ALARM_H
+#define _QSER_ALARM_H
+#include "mbtk_type.h"
+
+typedef int (*lynq_wakealarm_add_cb)(unsigned int src_id, int rtc_id);
+int lynq_rtc_service_init(void);
+int lynq_rtc_service_deinit(void);
+ssize_t poweralarm(char *buffer,int src_id);
+ssize_t wakealarm(char *buffer,int src_id,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify );
+ssize_t cancel_wakealarm(int src_id, int rtc_id);
+
+int lynq_set_wakealarm(unsigned long time_sec,int src_id,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify );
+int  lynq_set_poweralarm(unsigned long time_sec,int src_id);
+
+#endif /* _QSER_ALARM_H */
diff --git a/mbtk/include/lynq/lynq_autosuspend.h b/mbtk/include/lynq/lynq_autosuspend.h
new file mode 100755
index 0000000..efd1219
--- /dev/null
+++ b/mbtk/include/lynq/lynq_autosuspend.h
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct time_info_t
+{
+    long sleep_start_time;
+    long wakeup_time;
+};
+
+int lynq_autosleep_enable(void);
+int lynq_autosleep_disable(void);
+int lynq_wait_wakeup_event(long *sleep_start_time, long * wakeup_time);
+
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+int lynq_set_lpmode(int lp_mode);
+int release_wake_lock(char *name);
+int acquire_wake_lock(int lock, char *name);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/mbtk/include/lynq/lynq_call.h b/mbtk/include/lynq/lynq_call.h
new file mode 100755
index 0000000..3bb398f
--- /dev/null
+++ b/mbtk/include/lynq/lynq_call.h
@@ -0,0 +1,181 @@
+#ifndef LYNQ_CALL_H

+#define LYNQ_CALL_H 1

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define LYNQ_PHONE_NUMBER_MAX 32

+#define INDEX_IS_NUMBER( alpha_char )   \

+   ( ( (alpha_char >= '0') && (alpha_char <= '9') ) ? 1 : 0 )

+#define LYNQ_CALL_MAX 3

+#define LYNQ_CALL_FAIL_VENDOR_CAUSE 64

+#define MAX_IP_LENGTH 128

+#define MAX_VLAN_INFO_LENGTH 32

+#define MAX_SSRC_INFO_LENGTH 10   /*2^32=4294967296, 10 digit*/

+

+typedef enum {

+    LYNQ_CALL_FAIL_UNOBTAINABLE_NUMBER = 1,

+    LYNQ_CALL_FAIL_NORMAL = 16,

+    LYNQ_CALL_FAIL_BUSY = 17,

+    LYNQ_CALL_FAIL_CONGESTION = 34,

+    LYNQ_CALL_FAIL_ACM_LIMIT_EXCEEDED = 68,

+    LYNQ_CALL_FAIL_CALL_BARRED = 240,

+    LYNQ_CALL_FAIL_FDN_BLOCKED = 241,

+    LYNQ_CALL_FAIL_IMSI_UNKNOWN_IN_VLR = 242,

+    LYNQ_CALL_FAIL_IMEI_NOT_ACCEPTED = 243,

+    LYNQ_CALL_FAIL_DIAL_MODIFIED_TO_USSD = 244, /* STK Call Control */

+    LYNQ_CALL_FAIL_DIAL_MODIFIED_TO_SS = 245,

+    LYNQ_CALL_FAIL_DIAL_MODIFIED_TO_DIAL = 246,

+    LYNQ_CALL_FAIL_CDMA_LOCKED_UNTIL_POWER_CYCLE = 1000,

+    LYNQ_CALL_FAIL_CDMA_DROP = 1001,

+    LYNQ_CALL_FAIL_CDMA_INTERCEPT = 1002,

+    LYNQ_CALL_FAIL_CDMA_REORDER = 1003,

+    LYNQ_CALL_FAIL_CDMA_SO_REJECT = 1004,

+    LYNQ_CALL_FAIL_CDMA_RETRY_ORDER = 1005,

+    LYNQ_CALL_FAIL_CDMA_ACCESS_FAILURE = 1006,

+    LYNQ_CALL_FAIL_CDMA_PREEMPTED = 1007,

+    LYNQ_CALL_FAIL_CDMA_NOT_EMERGENCY = 1008, /* For non-emergency number dialed

+                                            during emergency callback mode */

+    LYNQ_CALL_FAIL_CDMA_ACCESS_BLOCKED = 1009, /* CDMA network access probes blocked */

+    LYNQ_CALL_FAIL_ERROR_UNSPECIFIED = 0xffff

+} lynq_last_call_fail_cause_t;

+typedef struct

+{

+    lynq_last_call_fail_cause_t cause_code;

+    char vendor_cause[LYNQ_CALL_FAIL_VENDOR_CAUSE];

+}lynqLastCallFailCause;

+int lynq_init_call(int uToken);

+int lynq_deinit_call();

+int lynq_call(int *handle,char addr[]);

+int lynq_call_answer();

+int lynq_call_hungup(int*handle);

+int lynq_call_hungup_all();

+int lynq_set_auto_answercall(const int mode);

+int lynq_get_mute_mic(int *status);

+int lynq_set_mute_mic(const int enable);

+int lynq_get_speech_volume(int *volume);

+int lynq_set_speech_volume(const int volume);

+int lynq_incall_record_start(const char* file_path);

+int lynq_incall_record_stop();

+int lynq_set_DTMF(const char callnum);

+int lynq_set_DTMF_volume(const int volume);

+int lynq_get_current_call_state(int *handle,    int *call_state,int *toa,int *direction,char addr[]);

+/*lei add for T8TSK-17 2022/7/20*/

+int lynq_switch_waiting_or_holding_and_active(void);

+int lynq_hangup_waiting_or_background(void);

+int lynq_hangup_foreground_resume_background(void);

+

+/* add for T106bug-213 2023/9/18 */

+void lynq_release_wait_call();

+

+/*lei add for API-163/API-164 2023/1/3*/

+/**

+ * @brief                  wait_call_state_change

+ *                        

+ * @param  handle            call_id            

+ * @return int

+ */

+int lynq_wait_call_state_change(int *handle);

+/*lei add for API-163/API-164 2023/1/3*/

+/*lei add for T8TSK-17 2022/7/20*/

+

+#ifdef ECALL_SUPPORT

+typedef enum{

+    LYNQ_ECALL_SET_NUMBER = 0,     /* Set Number */

+    LYNQ_ECALL_SET_URI = 1,      /* Set Uri */   

+}LYNQ_ECall_Set_Type;

+

+typedef enum{

+    LYNQ_EMER_CAT_MANUAL_ECALL = 0,      /* Manual Emergency eCall */

+    LYNQ_EMER_CAT_AUTO_ECALL = 1,     /*  Automatic Emergency eCall */

+}LYNQ_ECall_Category;

+

+typedef enum{

+    LYNQ_ECALL_TEST = 0,     /* Test eCall */

+    LYNQ_ECALL_EMERGENCY = 1,      /* Emergency eCall */

+    LYNQ_ECALL_RECONFIG = 2,     /*  Reconfiguration eCall */

+    LYNQ_ECALL_MO_MAX=3,

+    LYNQ_ECALL_CALLBACK = 3,     /*  Callback eCall */

+    LYNQ_ECALL_VAR_MAX, 

+    LYNQ_ECALL_VAR_NONE=LYNQ_ECALL_VAR_MAX,

+}LYNQ_ECall_Variant;

+

+typedef enum{

+    LYNQ_ECALL_SENDING_START = 1,

+    LYNQ_ECALL_SENDING_MSD = 2,

+    LYNQ_ECALL_LLACK_RECEIVED = 3,

+    LYNQ_ECALL_ALACK_POSITIVE_RECEIVED = 4,

+    LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED = 5,

+    LYNQ_ECALL_DAILING = 9,

+    LYNQ_ECALL_ALERTING = 10,

+    LYNQ_ECALL_ACTIVE = 11,

+    LYNQ_ECALL_DISCONNECTED = 12,

+    LYNQ_ECALL_IMS_ACTIVE = 13,

+    LYNQ_ECALL_IMS_DISCONNECTED = 14,

+    LYNQ_ECALL_ABNORMAL_HANGUP=15,

+    LYNQ_ECALL_IMS_MSD_ACK = 20,

+    LYNQ_ECALL_IMS_UPDATE_MSD = 21,

+    LYNQ_ECALL_IMS_IN_BAND_TRANSFER = 22,

+    LYNQ_ECALL_IMS_MSD_NACK = 23,

+    LYNQ_ECALL_IMS_SRVCC = 24,

+    LYNQ_ECALL_ONLY_DEREGISTRATION = 31,

+    LYNQ_ECALL_MAY_DEREGISTER = 32,

+    LYNQ_ECALL_PSAP_CALLBACK_START = 40,

+    LYNQ_ECALL_PSAP_CALLBACK_IMS_UPDATE_MSD = 41,

+    LYNQ_ECALL_SENDING_START_IN_VOICE=8000,    

+    LYNQ_ECALL_T2_TIMER_OUT = 9000,

+    LYNQ_ECALL_T5_TIMER_OUT = 9001,

+    LYNQ_ECALL_T6_TIMER_OUT = 9002,

+    LYNQ_ECALL_T7_TIMER_OUT = 9003,

+    LYNQ_ECALL_REDIAL_TIMER_OUT = 9004,    

+    LYNQ_ECALL_AUTO_ANS_TIMER_OUT = 9005,

+    LYNQ_ECALL_AUTO_ANS_IMS_TIMER_OUT = 9006,

+    LYNQ_ECALL_UNSPECIFIED = 0xffff,

+}LYNQ_ECall_Indication;

+

+int lynq_set_test_num(LYNQ_ECall_Set_Type type, const char *test_num, int test_num_length);

+int lynq_fast_ecall(int* handle, LYNQ_ECall_Category lynq_ecall_cat, LYNQ_ECall_Variant lynq_ecall_variant,  const char *addr, int addr_length, const unsigned char *msd_data, int msd_length);

+int lynq_set_msd(int* handle, const unsigned char *msd_data, int msd_length);

+int lynq_set_ivs(int enable);

+int lynq_ivs_push_msd();

+int lynq_wait_ecall_indication(int* handle, LYNQ_ECall_Indication *eCall_Indication);

+#endif

+

+/*Audio Path setting begin*/

+typedef enum{

+    AUDIO_MODE_CODEC = 0,     /* Codec */

+    AUDIO_MODE_RTP = 1,      /* RTP */       

+}LYNQ_Audio_Mode;

+

+typedef enum{

+    RTP_CLIENT = 0,     

+    RTP_SERVER =1,

+    RTP_MODE_MAX

+}LYNQ_Rtp_Mode;

+

+typedef enum{

+    Rtp_Ssrc_random = 0,     

+    Rtp_Ssrc_specific =1,   

+}LYNQ_Rtp_Ssrc_Mode;

+

+/*set*/

+int lynq_set_voice_audio_mode(const LYNQ_Audio_Mode audio_mode); 

+int lynq_set_remote_rtp_ip(const char* ip, const int ip_length);

+int lynq_set_vlan_info(const char* vlan_info, const int vlan_info_length);

+int lynq_set_rtp_port(const LYNQ_Rtp_Mode rtp_mode, const int port);

+int lynq_set_rtp_param(const int clock_rate,const int channels,const int latency); //only for client

+int lynq_set_call_rtp_ssrc(const LYNQ_Rtp_Ssrc_Mode ssrc_mode, const unsigned int ssrc);

+

+/*get*/

+LYNQ_Audio_Mode lynq_get_voice_audio_mode();

+int lynq_get_remote_rtp_ip(char* ip, const int ip_length);

+int lynq_get_vlan_info(char* vlan_info, const int vlan_info_length);

+int lynq_get_rtp_port(const LYNQ_Rtp_Mode rtp_mode, int* port);

+int lynq_get_rtp_param(int* clock_rate,int* channels, int* latency);//only for client

+int lynq_get_call_rtp_ssrc(int* ssrc_mod, unsigned int* ssrc);

+/*Audio Path setting end*/

+

+void lynq_set_test_mode(const int test_mode);

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/mbtk/include/lynq/lynq_chip_id.h b/mbtk/include/lynq/lynq_chip_id.h
new file mode 100755
index 0000000..4908ecf
--- /dev/null
+++ b/mbtk/include/lynq/lynq_chip_id.h
@@ -0,0 +1,34 @@
+/**@file lynq-systime.h

+ *

+ * @brief Sync systime form each time source.

+ *

+ * @author sj.zhang

+ *

+ * @date 2023-08-14

+ *

+ * @version V1.0

+ *

+ * @copyright Copyright (c) MobileTek

+ */

+

+#ifndef _LYNQ_CHIP_ID_H_

+#define _LYNQ_CHIP_ID_H_

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+/**@brief get chip id.

+*

+* @param void

+*

+* @return

+*      0:success

+*      other:failure

+*/

+int lynq_get_chip_id(char *chip_id);

+

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/mbtk/include/lynq/lynq_data.h b/mbtk/include/lynq/lynq_data.h
new file mode 100755
index 0000000..1ee15ba
--- /dev/null
+++ b/mbtk/include/lynq/lynq_data.h
@@ -0,0 +1,82 @@
+#ifndef LYNQ_DATA_H
+#define LYNQ_DATA_H 
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define LYNQ_APN_CHANNEL_MAX 10
+#define LYNQ_PDP_TYPE_MAX_LEN 16
+#define LYNQ_IFACE_NAME_MAX_LEN 50
+#define LYNQ_APN_MAX_LEN 50
+#define LYNQ_TYPE_MAX_LEN 50
+#define LYNQ_ADDRESSES_MAX_LEN 100
+#define LYNQ_DNSES_MAX_LEN 256
+#define LYNQ_GATEWAYS_MAX_LEN 50
+#define LYNQ_PCSCF_MAX_LEN 256
+#define LYNQ_APN_TYPE_MAX_LEN 50
+#define LYNQ_PDP_ADDR_MAX_LEN 64
+#define LYNQ_DNS_ADDR_MAX_LEN 256
+#define LYNQ_GETWAYS_ADDR_MAX_LEN 64
+#define LYNQ_POXY_ADDR_MAX_LEN 64
+
+
+typedef struct {
+    int            status;     /* A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no error */
+    int            suggestedRetryTime; /* If status != 0, this fields indicates the suggested retry
+                                           back-off timer value RIL wants to override the one
+                                           pre-configured in FW.
+                                           The unit is miliseconds.
+                                           The value < 0 means no value is suggested.
+                                           The value 0 means retry should be done ASAP.
+                                           The value of INT_MAX(0x7fffffff) means no retry. */
+    int            cid;        /* Context ID, uniquely identifies this call */
+    int            active;     /* 0=inactive, 1=active/physical link down, 2=active/physical link up */
+    char           type[LYNQ_PDP_TYPE_MAX_LEN];       /* One of the PDP_type values in TS 27.007 section 10.1.1.
+                                   For example, "IP", "IPV6", "IPV4V6", or "PPP". If status is
+                                   PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED this is the type supported
+                                   such as "IP" or "IPV6" */
+    char           ifname[LYNQ_IFACE_NAME_MAX_LEN];     /* The network interface name */
+    char           addresses[LYNQ_PDP_ADDR_MAX_LEN];  /* A space-delimited list of addresses with optional "/" prefix length,
+                                   e.g., "192.0.1.3" or "192.0.1.11/16 2001:db8::1/64".
+                                   May not be empty, typically 1 IPv4 or 1 IPv6 or
+                                   one of each. If the prefix length is absent the addresses
+                                   are assumed to be point to point with IPv4 having a prefix
+                                   length of 32 and IPv6 128. */
+    char           dnses[LYNQ_DNS_ADDR_MAX_LEN];      /* A space-delimited list of DNS server addresses,
+                                   e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1".
+                                   May be empty. */
+    char           gateways[LYNQ_GETWAYS_ADDR_MAX_LEN];   /* A space-delimited list of default gateway addresses,
+                                   e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1".
+                                   May be empty in which case the addresses represent point
+                                   to point connections. */
+    char           pcscf[LYNQ_POXY_ADDR_MAX_LEN];    /* the Proxy Call State Control Function address
+                                 via PCO(Protocol Configuration Option) for IMS client. */
+    int            mtu;        /* MTU received from network
+                                   Value <= 0 means network has either not sent a value or
+                                   sent an invalid value */
+} lynq_data_call_response_v11_t;
+
+typedef struct
+{
+    int index;
+    char apn[LYNQ_APN_MAX_LEN];
+    char apnType[LYNQ_APN_TYPE_MAX_LEN];
+}lynq_apn_info;
+
+int lynq_init_data(int uToken);
+int lynq_deinit_data();
+int lynq_setup_data_call(int *handle);
+int lynq_deactive_data_call(int *handle);
+int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol);
+int lynq_setup_data_call_sp_t106(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol);
+//int lynq_deactive_data_call_sp(int *handle,char *apnType);
+int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t *dataCallList);
+int lynq_wait_data_call_state_change(int *handle);
+int lynq_modify_apn_db(const int cmd,char *id,char *mcc,char *mnc,char *apn,char *apntype,char *user,char *password,char *normalprotocol,char *roamingprotocol,char *carrier,char *out);
+int lynq_reset_apn(char *result);
+int lynq_get_apn_table(int *size,lynq_apn_info **list);
+void lynq_release_wait_data_call();
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/mbtk/include/lynq/lynq_deflog.h b/mbtk/include/lynq/lynq_deflog.h
new file mode 100755
index 0000000..fd45185
--- /dev/null
+++ b/mbtk/include/lynq/lynq_deflog.h
@@ -0,0 +1,211 @@
+#ifndef __LYNQ_DEFLOG_H__

+#define __LYNQ_DEFLOG_H__

+#include "liblog.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+typedef void (*LYNQ_WRITE_LOG_PTR)(log_level_enum level, const char *format, ...);

+extern LYNQ_WRITE_LOG_PTR lynq_write_log;

+LYNQ_WRITE_LOG_PTR lynq_log_function_init(const char *log_name);

+

+int lynq_syslog_set_file_size(int value);

+int lynq_syslog_get_file_size(void);

+int lynq_syslog_set_file_rotate(int value);

+int lynq_syslog_get_file_rotate(void);

+

+#ifdef __cplusplus

+}

+#endif

+#define lynq_log_verbose(fmt, args...)  \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define lynq_log_error(fmt, args...)  \

+    do{ \

+		char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define lynq_log_warning(fmt, args...)  \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define lynq_log_info(fmt, args...)  \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define lynq_log_debug(fmt, args...)  \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt "\n", ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LYVERBLOG(fmt, args...)  \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LYERRLOG(fmt, args...)  \

+    do{ \

+		char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LYWARNLOG(fmt, args...)  \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LYINFLOG(fmt, args...)  \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LYDBGLOG(fmt, args...)  \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt "\n", ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+// #define lynq_log_verbose(...)  do { lynq_write_log(LOG_VERBOSE,__VA_ARGS__);} while (0)

+// #define lynq_log_error(...)  do {lynq_write_log(LOG_ERROR,__VA_ARGS__);} while (0)

+// #define lynq_log_warning(...)  do {lynq_write_log(LOG_WARNING,__VA_ARGS__);} while (0)

+// #define lynq_log_info(...)  do {lynq_write_log(LOG_INFO,__VA_ARGS__);} while (0)

+// #define lynq_log_debug(...)  do {lynq_write_log(LOG_DEBUG,__VA_ARGS__);} while (0)

+

+// #define LYVERBLOG(...)  do {lynq_write_log(LOG_VERBOSE,__VA_ARGS__);} while (0)

+// #define LYERRLOG(...)  do {lynq_write_log(LOG_ERROR,__VA_ARGS__);} while (0)

+// #define LYWARNLOG(...)  do {lynq_write_log(LOG_WARNING,__VA_ARGS__);} while(0)

+// #define LYINFLOG(...)  do {lynq_write_log(LOG_INFO,__VA_ARGS__);} while (0)

+// #define LYDBGLOG(...)  do {lynq_write_log(LOG_DEBUG,__VA_ARGS__);} while (0)

+

+// // just for comcompatibility, do nothing

+// #define LYLOGSET(a) do{;}while(0)

+// #define LYLOGEINIT(Y) do{;}while(0)

+

+// #ifndef ALOGV

+// #define ALOGV(...) do {lynq_write_log(LOG_VERBOSE,__VA_ARGS__);} while (0)

+// #endif

+

+// #ifndef ALOGE

+// #define ALOGE(...) do {lynq_write_log(LOG_ERROR,__VA_ARGS__);} while (0)

+// #endif

+

+// #ifndef ALOGW

+// #define ALOGW(...) do {lynq_write_log(LOG_WARNING,__VA_ARGS__);} while (0)

+// #endif

+

+// #ifndef ALOGI

+// #define ALOGI(...) do {lynq_write_log(LOG_INFO,__VA_ARGS__);} while (0)

+// #endif

+

+// #ifndef ALOGD

+// #define ALOGD(...) do {lynq_write_log(LOG_DEBUG,__VA_ARGS__);} while (0)

+// #endif

+

+#define DEFINE_LYNQ_LIB_LOG(tag) \

+    LYNQ_WRITE_LOG_PTR __attribute__ ((visibility ("hidden"))) lynq_write_log = NULL; \

+    void __attribute__((constructor)) tag##_init() \

+    { \

+        lynq_write_log = lynq_log_function_init(#tag); \

+    }

+

+#define DEFINE_LYNQ_EXE_LOG(tag) \

+    LYNQ_WRITE_LOG_PTR __attribute__ ((visibility ("hidden"))) lynq_write_log = NULL; \

+    void __attribute__((constructor)) tag##_init() \

+    { \

+        lynq_write_log = lynq_log_function_init(#tag); \

+        lynq_log_configuration_init(#tag); \

+    }

+

+#endif  //__LYNQ_DEFLOG_H__

diff --git a/mbtk/include/lynq/lynq_gnss.h b/mbtk/include/lynq/lynq_gnss.h
new file mode 100755
index 0000000..893f6a8
--- /dev/null
+++ b/mbtk/include/lynq/lynq_gnss.h
@@ -0,0 +1,120 @@
+/*
+* qser_gnss.h
+*
+* QSER GNSS header file.
+*
+* Author : lb
+* Date   : 2023/11/23 11:13:18
+*/
+#ifndef _QSER_GNSS_H
+#define _QSER_GNSS_H
+#include "mbtk_type.h"
+#include "mbtk_gnss.h"
+#include "mbtk_log.h"
+
+typedef unsigned int Uint_t;
+#define MOPEN_GNSS_NMEA_MAX_LENGTH  255                 /* NMEA string maximum length. */
+
+#define QSER_LEN_MAX 128
+
+typedef enum
+{
+    E_MT_LOC_MSG_ID_LOCATION_INFO = 1, /**< pv_data = & mopen_location_info_t */
+    E_MT_LOC_MSG_ID_NMEA_INFO = 3, /**< pv_data = & mopen_gnss_nmea_info_t */
+} e_msg_id_t;
+
+typedef enum {
+	QSER_GNSS_ERROR_SUCCESS = 0,
+    QSER_GNSS_ERROR_FAIL,
+} qser_gnss_error_e;
+
+typedef void (*gnss_handler_func_t)
+(
+    Uint_t *h_loc,
+    e_msg_id_t e_msg_id, //消息 ID
+    void *pv_data, //消息内容,取决于 ID,如下说明
+    void *context_ptr //用于区分哪个返回的消息
+)/* lynq_AddRxIndMsgHandler_t*/;
+
+typedef void (*gnss_async_func_t)(qser_gnss_error_e state);
+
+typedef struct
+{
+    char host[QSER_LEN_MAX];
+    char id[QSER_LEN_MAX];
+    char passwd[QSER_LEN_MAX];
+}qser_agps_info;
+
+typedef struct
+{
+    int64_t     timestamp;                              /**<   System Timestamp, marked for when got the nmea data */
+    int         length;                                 /**<   NMEA string length. */
+    char        nmea[MOPEN_GNSS_NMEA_MAX_LENGTH + 1];   /**<   NMEA string.*/
+}mopen_gnss_nmea_info_t;  /* Message */
+
+typedef struct
+{
+    uint32_t    size;                   /**<   Set to the size of mcm_gps_location_t. */
+    int flags;                          /**<   Contains GPS location flags bits. */
+    int position_source;                /**<   Provider indicator for HYBRID or GPS. */ //功能暂未实现,可不用添加进结构体
+    double      latitude;               /**<   Latitude in degrees. */
+    double      longitude;              /**<   Longitude in degrees. */
+    double      altitude;               /**<   Altitude in meters above the WGS 84 reference ellipsoid. */
+    float       speed;                  /**<   Speed in meters per second. */
+    float       bearing;                /**<   Heading in degrees. */ //功能暂未实现,可不用添加进结构体
+    float       accuracy;               /**<   Expected accuracy in meters. */ //功能暂未实现,可不用添加进结构体
+    int64_t     timestamp;              /**<   Timestamp for the location fix in UTC million-second base.  */
+    int32_t     is_indoor;              /**<   Location is indoors. */ //功能暂未实现,可不用添加进结构体
+    float       floor_number;           /**<   Indicates the floor number. */
+}mopen_location_info_t;//功能暂未实现,可不用添加进结构体
+
+typedef struct
+{
+    uint32_t year; // 大于 1980
+    uint32_t month; // 1-12
+    uint32_t day; // 1-31
+    uint32_t hour; // 0-23
+    uint32_t minute; // 0-59
+    uint32_t second; // 0-59
+    uint32_t millisecond; // 0-999
+} LYNQ_INJECT_TIME_INTO_T; /* Message */
+
+typedef enum {
+    DELETE_NOTHING = 0, /*不删除数据*/
+    DELETE_EPHEMERIS = 1, /*删除星历*/
+    DELETE_ALMANAC = 2, /*删除历书*/
+    DELETE_POSITION_TIME = 3, /*删除时间和位置信息. */
+    DELETE_UTC = 4, /*删除 UTC 时间*/
+    DELETE_ALL = 5 /*删除所有*/
+} DELETE_AIDING_DATA_TYPE_T;
+
+int qser_Gnss_Init (uint32_t *h_gnss);
+
+int qser_Gnss_Deinit (uint32_t h_gnss);
+
+int qser_AddRxIndMsgHandler (gnss_handler_func_t handler_ptr,uint32_t h_gnss);
+
+int qser_Set_Indications (uint32_t h_gnss,e_msg_id_t type);
+
+int qser_Gnss_Set_Async_Callback(gnss_async_func_t cb);
+
+int qser_Gnss_Start (uint32_t h_gnss);
+
+int qser_Gnss_Start_Async(uint32_t h_gnss);
+
+int qser_Gnss_Stop (uint32_t h_gnss);
+
+int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency);
+
+int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info);
+
+int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags);
+
+int qser_Gnss_Server_Configuration(char *host, char *id, char *password);
+
+int qser_Gnss_download_tle();
+
+int qser_Gnss_injectEphemeris(uint32_t h_gnss);
+
+
+#endif /* _QSER_GNSS_H */
diff --git a/mbtk/include/lynq/lynq_led.h b/mbtk/include/lynq/lynq_led.h
new file mode 100755
index 0000000..c95282b
--- /dev/null
+++ b/mbtk/include/lynq/lynq_led.h
@@ -0,0 +1,12 @@
+#ifndef LYNQ_LED_H

+#define LYNQ_LED_H 1

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+int lynq_set_netled_on(const int test_mode);

+int lynq_set_statusled_on(const int test_mode);

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/mbtk/include/lynq/lynq_network.h b/mbtk/include/lynq/lynq_network.h
new file mode 100755
index 0000000..e878e6b
--- /dev/null
+++ b/mbtk/include/lynq/lynq_network.h
@@ -0,0 +1,147 @@
+#ifndef LYNQ_NETWORK_H

+#define LYNQ_NETWORK_H 

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define MODEM_GEN97 1

+#define CELLINFO_MAX_NUM  10

+#define LY_RECOVER_TIMER_INTERVAL 128

+#define MAX_CELLINFO_ITEM_NUMBER 32

+#define MAX_OOS_CFG_ITEM_NUMBER 32

+/*T800 platform support gsm,wcdma lte,nr */

+typedef struct{

+    int gw_sig_valid; /*1 valid,1 invalid*/

+    int rssi;         /* Valid values are (0-31, 99) as defined in TS 27.007 8.5 */

+    int wcdma_sig_valid;/*1 valid,0 invalid*/

+    int wcdma_signalstrength;

+    int rscp;        /* The Received Signal Code Power in dBm multipled by -1.

+                      * Range : 25 to 120

+                      * INT_MAX: 0x7FFFFFFF denotes invalid value.

+                      * Reference: 3GPP TS 25.123, section 9.1.1.1 */

+    int ecno;        /* Valid values are positive integers.  This value is the actual Ec/Io multiplied

+                      * by -10.  Example: If the actual Ec/Io is -12.5 dB, then this response value

+                      * will be 125.*/

+    int lte_sig_valid;/*1 valid,0 invalid*/

+    int lte_signalstrength;                      

+    int rsrp;        /* The current Reference Signal Receive Power in dBm multipled by -1.

+                      * Range: 44 to 140 dBm

+                      * INT_MAX: 0x7FFFFFFF denotes invalid value.

+                      * Reference: 3GPP TS 36.133 9.1.4 */

+    int rsrq;        /* The current Reference Signal Receive Quality in dB multiplied by -1.

+                      * Range: 20 to 3 dB.

+                      * INT_MAX: 0x7FFFFFFF denotes invalid value.

+                      * Reference: 3GPP TS 36.133 9.1.7 */

+    int rssnr;       /* The current reference signal signal-to-noise ratio in 0.1 dB units.

+                      * Range: -200 to +300 (-200 = -20.0 dB, +300 = 30dB).

+                      * INT_MAX : 0x7FFFFFFF denotes invalid value.

+                      * Reference: 3GPP TS 36.101 8.1.1 */

+    int nr_sig_valid;/*1 valid,0 invalid*/

+    int ssRsrp;      /* SS(Synchronization Signal) reference signal received power, multipled by -1.

+                      * Reference: 3GPP TS 38.215.

+                      * Range [44, 140], INT_MAX means invalid/unreported.*/

+    int ssRsrq;      /* SS reference signal received quality, multipled by -1.

+                      * Reference: 3GPP TS 38.215.

+                      * Range [3, 20], INT_MAX means invalid/unreported.*/

+    int ssSinr;      /* SS signal-to-noise and interference ratio.

+                      * Reference: 3GPP TS 38.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.

+                      * Range [-23, 40], INT_MAX means invalid/unreported.*/

+    int csiRsrp;     /* CSI reference signal received power, multipled by -1.

+                      * Reference: 3GPP TS 38.215.

+                      * Range [44, 140], INT_MAX means invalid/unreported.*/

+    int csiRsrq;     /* CSI reference signal received quality, multipled by -1.

+                      * Reference: 3GPP TS 38.215.

+                      * Range [3, 20], INT_MAX means invalid/unreported.*/

+    int csiSinr;     /* CSI signal-to-noise and interference ratio.

+                      * Reference: 3GPP TS 138.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.

+                      * Range [-23, 40], INT_MAX means invalid/unreported.*/

+}signalStrength_t;

+

+typedef enum { 

+    NETWORK_RADIO_ON_TYPE_CFUN_0=0,  

+    NETWORK_RADIO_ON_TYPE_NORMAL_MODE=1,

+    NETWORK_RADIO_ON_TYPE_FLIGHT_MODE=4,

+}lynq_network_radio_on_type;  

+

+int lynq_network_init(int utoken);

+int lynq_network_deinit(void);

+int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc);

+int lynq_query_network_selection_mode(int *netselMode);

+int lynq_set_network_selection_mode(const char *mode,const char* mccmnc);

+int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus);

+int lynq_query_registration_state(const char *type,int* regState,int* imsRegState,char * LAC,char * CID,int *netType,int *radioTechFam,int *netRejected);

+int lynq_query_prefferred_networktype(int *preNetType);

+int lynq_set_prefferred_networktype(const int preffertype);

+int lynq_query_cell_info(uint64_t cellinfo[CELLINFO_MAX_NUM],int tac[CELLINFO_MAX_NUM],int earfcn[CELLINFO_MAX_NUM],int * realNum);

+int lynq_set_unsol_cell_info_listrate(const int rate);

+int lynq_set_band_mode(const int bandmode);

+int lynq_query_available_bandmode(int availBanMode[]);

+int lynq_radio_on(const lynq_network_radio_on_type type);

+int lynq_query_radio_state(int *radio_state);

+int lynq_query_radio_tech(int* radioTech);

+int lynq_solicited_signal_strength(signalStrength_t *solSigStren);

+int lynq_set_ims(const int ims_mode);

+int lynq_wait_signalchanges(int *handle);

+int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id);

+

+typedef enum {  

+  LYNQ_CELL_INFO_TYPE_GSM    = 2,  

+  LYNQ_CELL_INFO_TYPE_WCDMA  = 3,

+  LYNQ_CELL_INFO_TYPE_LTE    = 4, 

+  LYNQ_CELL_INFO_TYPE_NR    = 5

+} lynq_network_cell_info_type;

+

+int lynq_query_serve_cell_info(int serve_cell_info[MAX_CELLINFO_ITEM_NUMBER], int * valid_number);

+

+typedef enum {

+    NETWORK_STATE_BUFFER_TYPE_VOICE_REG,

+    NETWORK_STATE_BUFFER_TYPE_DATA_REG,

+    NETWORK_STATE_BUFFER_TYPE_IMS_REG,

+    NETWORK_STATE_BUFFER_TYPE_MAX,

+}lynq_network_state_buffer_type;    

+int lynq_set_state_buffer_valid_period_of_network(lynq_network_state_buffer_type type,int valid_period);

+int lynq_get_state_buffer_valid_period_of_network(lynq_network_state_buffer_type type);

+#ifdef MODEM_GEN97

+/**@brief set or get OOS recover timer interval

+* @param mode [IN] <mode>:

+*  0:set

+*  1:get

+* @param interval [IN] <interval>: the recovery timer interval.

+*  field:

+*    T1,T2,...,T23:integer value 0~0xFFFFFFFF

+*    The length of time in seconds.

+*    defualt interval: 20,20,60,60,60,60,90,90,90,90,90,90,180,180,180,180,180,180,360,360,360,360,360

+* @param result [OUT] <result>: the recovery timer interval,when the mode is 1, this parameter is valid.

+

+* @return

+*  0:success

+*  other:failure

+*/

+int lynq_oos_recover_timer_interval(int mode, char interval[LY_RECOVER_TIMER_INTERVAL],char result[LY_RECOVER_TIMER_INTERVAL]);

+/**@brief set deep sleep recover timer interval

+

+* @param recovery_threshold [IN] <recovery_threshold>: valid range 2-10  //After performing several rounds of normal recovery, deep sleep mode optimization will be applied

+

+* @param fullband_timer [IN] <fullband_timer>:valid range 90-360 //fullband intervarl length in deep sleep mode

+

+* @param sniffer_timer [IN] <sniffer_timer>:valid range 10-60 // sniffe intervarl length in deep sleep mode.

+

+* @param inactive_mode [IN] <inactive_mode>:

+*  0 Exit inactive mode 

+*  1 enter inactive mode

+

+* @return

+*  0:success

+*  other:failure

+*/

+int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode);

+#endif

+#if (defined MOBILETEK_TARGET_PLATFORM_T106) || (defined MODEM_GEN97)

+int lynq_set_oos_net_scan_cfg(int config_list[MAX_OOS_CFG_ITEM_NUMBER], int valid_num);

+int lynq_get_oos_net_scan_cfg(int config_list[MAX_OOS_CFG_ITEM_NUMBER], int* valid_num);

+#endif

+void lynq_set_test_mode(const int test_mode);

+#ifdef __cplusplus

+}

+#endif

+

+#endif

diff --git a/mbtk/include/lynq/lynq_qser_data.h b/mbtk/include/lynq/lynq_qser_data.h
new file mode 100755
index 0000000..f2cff6f
--- /dev/null
+++ b/mbtk/include/lynq/lynq_qser_data.h
@@ -0,0 +1,288 @@
+#ifndef __LYNQ_QSER_DATA_H__
+#define __LYNQ_QSER_DATA_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <stdbool.h>
+#include <netinet/in.h>
+
+typedef enum {
+	QSER_DATA_CALL_ERROR_NONE = 0,
+	QSER_DATA_CALL_ERROR_INVALID_PARAMS,
+	QSER_DATA_CALL_ERROR_NO_INIT,
+	QSER_DATA_CALL_ERROR_PDP_ACTIVATE,
+	QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE,
+	QSER_DATA_CALL_ERROR_IDX_NO_EXIST,
+	QSER_DATA_CALL_ERROR_UNKNOWN,
+} qser_data_call_error_e;
+
+typedef enum {
+	QSER_DATA_CALL_DISCONNECTED = 0,            /*!< call is disconnected */
+	QSER_DATA_CALL_CONNECTED,                   /*!< call is connected */
+} qser_data_call_state_e;
+
+typedef enum {
+	QSER_DATA_CALL_TYPE_IPV4 = 0,           /*!< IPv4 call. */
+	QSER_DATA_CALL_TYPE_IPV6,               /*!< IPv6 call. */
+	QSER_DATA_CALL_TYPE_IPV4V6,             /*!< IPv4 and IPv6 call (Only used call start or stop). */
+} qser_data_call_ip_family_e;
+
+typedef enum {
+	QSER_APN_PDP_TYPE_IPV4 = 0,
+	QSER_APN_PDP_TYPE_PPP,
+	QSER_APN_PDP_TYPE_IPV6,
+	QSER_APN_PDP_TYPE_IPV4V6,
+} qser_apn_pdp_type_e;
+
+typedef enum {
+	QSER_APN_AUTH_PROTO_DEFAULT = 0,
+	QSER_APN_AUTH_PROTO_NONE,
+	QSER_APN_AUTH_PROTO_PAP,
+	QSER_APN_AUTH_PROTO_CHAP,
+	QSER_APN_AUTH_PROTO_PAP_CHAP,
+} qser_apn_auth_proto_e;
+
+#define QSER_APN_MAX_LIST 8
+#define QSER_APN_NAME_SIZE 64
+#define QSER_APN_USERNAME_SIZE 32
+#define QSER_APN_PASSWORD_SIZE 32
+#define QSER_APN_TYPE_SIZE 16
+
+struct v4_address_status {
+	struct in_addr ip;                    /*!< Public IPv4 address. */
+	struct in_addr gateway;               /*!< Public IPv4 gateway. */
+	struct in_addr pri_dns;               /*!< Primary Domain Name Service IP address. */
+	struct in_addr sec_dns;               /*!< Secondary Domain Name Service IP address. */
+};
+
+struct v6_address_status {
+	struct in6_addr ip;                   /*!< Public IPv6 address. */
+	struct in6_addr gateway;              /*!< Public IPv6 gateway. */
+	struct in6_addr pri_dns;              /*!< Primary Domain Name Service IPv6 address. */
+	struct in6_addr sec_dns;              /*!< Secondary Domain Name Service IPv6 address. */
+};
+
+typedef struct {
+	char profile_idx;                               /*!< UMTS/CMDA profile ID. */
+	char name[16];                                  /*!< Interface Name. */
+	qser_data_call_ip_family_e ip_family;             /*!< IP version. */
+	qser_data_call_state_e state;                     /*!< The dial status. */
+	qser_data_call_error_e err;                       /*!< The Reason code after data call disconnected. */
+	struct v4_address_status v4;            /*!< IPv4 information. */
+	struct v6_address_status v6;            /*!< IPv6 information. */
+} qser_data_call_state_s;
+
+/*
+ *!< Client callback function used to post event indications.
+ */
+typedef void (*qser_data_call_evt_cb_t)(qser_data_call_state_s *state);
+
+typedef struct {
+	char profile_idx;                        /*!< UMTS/CMDA profile ID. */
+	bool reconnect;                          /*!< Whether to re-dial after disconnecting the network. */
+	qser_data_call_ip_family_e ip_family;      /*!< IP version. */
+	char cdma_username[QSER_APN_USERNAME_SIZE];     /*!< Username used during data network authentication. */
+	char cdma_password[QSER_APN_PASSWORD_SIZE];     /*!< Password to be used during data network authentication. */
+} qser_data_call_s;
+
+struct pkt_stats {
+	unsigned long pkts_tx;              /*!< Number of packets transmitted. */
+	unsigned long pkts_rx;              /*!< Number of packets received. */
+	long long bytes_tx;                 /*!< Number of bytes transmitted. */
+	long long bytes_rx;                 /*!< Number of bytes received. */
+	unsigned long pkts_dropped_tx;      /*!< Number of transmit packets dropped. */
+	unsigned long pkts_dropped_rx;      /*!< Number of receive packets dropped. */
+};
+
+struct v4_info {
+	char name[16];                          /*!< Interface Name. */
+	qser_data_call_state_e state;             /*!< The dial status. */
+	bool reconnect;                         /*!< re-dial flag. */
+	struct v4_address_status addr;          /*!< IPv4 IP Address information. */
+	struct pkt_stats stats;                 /*!< IPv4 statics */
+};
+
+struct v6_info {
+	char name[16];                          /*!< Interface Name. */
+	qser_data_call_state_e state;             /*!< The dial status. */
+	bool reconnect;                         /*!< re-dial flag. */
+	struct v6_address_status addr;          /*!< IPv6 IP Address information. */
+	struct pkt_stats stats;                 /*!< IPv6 statics */
+};
+
+typedef struct {
+	char profile_idx;                        /*!< UMTS/CDMA profile ID. */
+	qser_data_call_ip_family_e ip_family;      /*!< IP version. */
+	struct v4_info v4;                       /*!< IPv4 information */
+	struct v6_info v6;                       /*!< IPv6 information */
+} qser_data_call_info_s;
+
+typedef struct {
+	unsigned char profile_idx;              /*!< UMTS/CDMA profile ID. range: 0 - 7*/
+	qser_apn_pdp_type_e pdp_type;             /*!< Packet Data Protocol (PDP) type specifies the type of data payload
+	                                             exchanged over the airlink when the packet data session is
+	                                             established with this profile. */ 
+	qser_apn_auth_proto_e auth_proto;         /*!< Authentication Protocol. */
+	char apn_name[QSER_APN_NAME_SIZE + 1];        /*!< A string parameter that is a logical name used to select the GGSN
+	                                             and external packet data network. */ 
+	char username[QSER_APN_USERNAME_SIZE + 1];    /*!< Username used during data network authentication. */
+	char password[QSER_APN_PASSWORD_SIZE + 1];    /*!< Password to be used during data network authentication. */
+    char apn_type[QSER_APN_TYPE_SIZE + 1];
+} qser_apn_info_s;
+
+typedef struct {
+	qser_apn_pdp_type_e pdp_type;             /*!< Packet Data Protocol (PDP) type specifies the type of data payload
+						  exchanged over the airlink when the packet data session is
+						  established with this profile. */ 
+	qser_apn_auth_proto_e auth_proto;         /*!< Authentication Protocol. */
+	char apn_name[QSER_APN_NAME_SIZE + 1];        /*!< A string parameter that is a logical name used to select the GGSN
+						  and external packet data network. */ 
+	char username[QSER_APN_USERNAME_SIZE + 1];    /*!< Username used during data network authentication. */
+	char password[QSER_APN_PASSWORD_SIZE + 1];    /*!< Password to be used during data network authentication. */
+    char apn_type[QSER_APN_TYPE_SIZE + 1];
+} qser_apn_add_s;
+
+typedef struct {
+	int cnt;
+	qser_apn_info_s apn[QSER_APN_MAX_LIST];
+} qser_apn_info_list_s;
+
+
+/**
+ * Initialization data call module, and callback function registered.
+ *
+ * @param [in] evt_cb           callback fucntion
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern int qser_data_call_init(qser_data_call_evt_cb_t evt_cb);
+
+/**
+ * Destroy data call module, and unregister callback funciton
+ *
+ * @param 
+ *   None
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern void qser_data_call_destroy(void);
+
+/**
+ * Starts a data call. If profile index is zero, it will call CDMA profile.
+ *
+ * @param [in] data_call        The data call parameters
+ * @param [out] error           Error code returned by data call 
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err);
+
+/**
+ * Starts a data call. If profile index is zero, it will call CDMA profile.
+ *
+ * @param [in] data_call        The data call parameters
+ * @param [out] error           Error code returned by data call 
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err);
+
+/**
+ * Stop a data call.
+ *
+ * @param [in] profile_idx      UMTS/CDMA profile ID
+ * @param [in] ip_family        IP Version
+ * @param [out] error           Error code returned by data call 
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err);
+
+/**
+ * Get a data call information.
+ *
+ * @param [in] profile_idx      UMTS/CDMA profile ID
+ * @param [in] ip_family        IP Version
+ * @param [out] info            The Data Call information
+ * @param [out] error           Error code returned by data call 
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern int qser_data_call_info_get(char profile_idx,
+				 qser_data_call_ip_family_e ip_family,
+				 qser_data_call_info_s *info,
+				 qser_data_call_error_e *err);
+
+/**
+ * Changes the settings in a configured profile. 
+ *
+ * @param [in] apn      the profile information.
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned, such apn not exist.
+ * 
+ */
+extern int qser_apn_set(qser_apn_info_s *apn);
+
+/**
+ * Retrieves the settings from a configured profile.
+ *
+ * @param [in] profile_idx        UMTS/CDMA profile ID
+ * @param [out] apn               the profile information.
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn);
+
+/**
+ * Retrieves the settings from a configured profile.
+ *
+ * @param [in] apn               the profile information.
+ * @param [out] profile_idx        UMTS/CDMA profile ID
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx);
+
+/**
+ * Delete a configured profile.
+ *
+ * @param [in] profile_idx        UMTS/CDMA profile ID
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern int qser_apn_del(unsigned char profile_idx);
+
+/**
+ * Retrieves the settings from a configured profile list.
+ *
+ * @param [out] apn_list          the profile list information.
+ *
+ * @return 
+ *   On success, 0 is returned.  On error, -1 is returned.
+ * 
+ */
+extern int qser_apn_get_list(qser_apn_info_list_s *apn_list);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/mbtk/include/lynq/lynq_qser_gnss.h b/mbtk/include/lynq/lynq_qser_gnss.h
new file mode 100755
index 0000000..9eead07
--- /dev/null
+++ b/mbtk/include/lynq/lynq_qser_gnss.h
@@ -0,0 +1,134 @@
+#ifndef __LYNQ_GNSS_H__
+#define __LYNQ_GNSS_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct mbtk_gnss_handle_t
+{
+    int dev_fd;
+    pthread_t  uart_pthread;
+    pthread_t  gnss_pthread;
+    gnss_handler_func_t gnss_handler_func;
+    int mode; // 0 - stop, 1 - single, 2 - periodic, 3 - start
+    pthread_mutex_t _cond_mutex;
+    int reset_state;
+    int inited;
+    ring_buffer_t ring_buffer;
+    int getap_status;
+    char *rb;
+
+#if TTFF_TEST
+    pthread_t ttff_pid;
+    int location_state;
+#endif
+    /********************
+    save handle's adr
+    phandle = &handle
+    handle  = mbtk_gnss_handle
+    *********************/
+    uint32_t *phandle; // handle's adr
+};
+
+typedef struct 
+{
+    uint32_t    size;                   /**<   Set to the size of mcm_gps_sv_info_t. */
+    int         prn;                    /**<   Pseudo-random number for the SV. */ 
+    float       snr;                    /**<   Signal-to-noise ratio. */ 
+    float       elevation;              /**<   Elevation of the SV in degrees. */ 
+    float       azimuth;                /**<   Azimuth of the SV in degrees. */ 
+}QL_LOC_SV_INFO_T;                      /* Type */
+
+struct login_information  /*Used To Stored User Information*/
+{
+    char*   host;
+    char*   id;
+    char*   password;
+};
+
+static struct login_information *login_information_t = NULL;
+
+#define     QL_LOC_GPS_SUPPORT_SVS_MAX   32  /**  Maximum number of satellites in view. */
+typedef struct 
+{
+    uint32_t            size;                                   /**<   Set to the size of mcm_gps_sv_status_t. */
+    int                 num_svs;                                /**<   Number of SVs currently visible. */
+    QL_LOC_SV_INFO_T    sv_list[QL_LOC_GPS_SUPPORT_SVS_MAX];    /**<   Contains an array of SV information. */
+    uint32_t            ephemeris_mask;                         /**<   Bitmask indicating which SVs have ephemeris data.  */
+    uint32_t            almanac_mask;                           /**<   Bitmask indicating which SVs have almanac data.   */
+    uint32_t            used_in_fix_mask;                       /**<   Bitmask indicating which SVs were used for computing the most recent position fix. */
+}QL_LOC_SV_STATUS_T;  /* Type */
+
+typedef enum 
+{
+    LYNQ_POS_MODE_STANDALONE        = 0, /**<  Mode for running GPS standalone (no assistance).  */
+    LYNQ_POS_MODE_MS_BASED          = 1, /**<  AGPS MS-Based mode.  */
+    LYNQ_POS_MODE_MS_ASSISTED       = 2, /**<  AGPS MS-Assisted mode.  */
+}LYNQ_POS_MODE_T;
+
+typedef enum 
+{
+    LYNQ_POS_RECURRENCE_PERIODIC    = 0, /**<  Receive GPS fixes on a recurring basis at a specified period.  */
+    LYNQ_POS_RECURRENCE_SINGLE      = 1, /**<  Request a single-shot GPS fix.  */
+}LYNQ_POS_RECURRENCE_T;
+
+struct LYNQ_POS_MODE_INFO_T
+{
+    LYNQ_POS_MODE_T       mode;               /*  Position mode.      */
+    LYNQ_POS_RECURRENCE_T recurrence;         /*  Recurrence          */
+};
+
+
+#endif
+typedef struct 
+{
+    uint32_t year; // 大于1980
+    uint32_t month; // 1-12
+    uint32_t day; // 1-31
+    uint32_t hour; // 0-23
+    uint32_t minute; // 0-59
+    uint32_t second; // 0-59
+    uint32_t millisecond; // 0-999
+}LYNQ_INJECT_TIME_INTO_T; /* Message */
+
+
+typedef enum  {
+    LOC_IND_STATUS_INFO_ON,//E_MT_LOC_MSG_ID_STATUS_INFO = 0,
+    LOC_IND_LOCATION_INFO_ON,//E_MT_LOC_MSG_ID_LOCATION_INFO,
+    LOC_IND_SV_INFO_ON,//E_MT_LOC_MSG_ID_SV_INFO,
+    LOC_IND_NMEA_INFO_ON,//E_MT_LOC_MSG_ID_NMEA_INFO,
+    LOC_IND_CAP_INFO_ON,//E_MT_LOC_MSG_ID_CAPABILITIES_INFO,
+    LOC_IND_AGPS_DATA_CONN_CMD_REQ_ON,//E_MT_LOC_MSG_ID_AGPS_STATUS,
+    LOC_IND_NI_NFY_USER_RESP_REQ_ON,//E_MT_LOC_MSG_ID_NI_NOTIFICATION,
+    LOC_IND_XTRA_DATA_REQ_ON,//E_MT_LOC_MSG_ID_XTRA_REPORT_SERVER,
+}msg_t;
+
+typedef enum {
+    DELETE_NOTHING = 0, /**< Delete nothing. */
+    DELETE_EPHEMERIS = 1, /**< Delete ephemeris data. */
+    DELETE_ALMANAC = 2, /**< Delete almanac data. */
+    DELETE_POSITION_TIME = 3, /**< Delete position and time data. */
+    DELETE_UTC = 4, /**< Delete UTC data. */
+    DELETE_ALL = 5, /**< Delete all location data. */
+}DELETE_AIDING_DATA_TYPE_T;
+
+typedef void ( *lynq_atsvc_incb )( const char *input,const int length);
+typedef void ( *lynq_atsvc_outcb )(char *output, int out_max_size, int mode);
+lynq_atsvc_incb lynq_register_gnss(lynq_atsvc_outcb out_cb);
+
+int qser_Gnss_Init(uint32_t *h_gnss);
+int qser_Gnss_Deinit(uint32_t h_gnss);
+int qser_AddRxIndMsgHandler(gnss_handler_func_t handler_ptr,uint32_t h_gnss);
+int qser_Set_Indications(uint32_t h_gnss,e_msg_id_t type);
+int qser_Gnss_Start(uint32_t h_gnss);
+int qser_Gnss_Stop(uint32_t h_gnss);
+int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency);
+int qser_Gnss_Delete_Aiding_Data(uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags);
+int qser_Gnss_Server_Configuration(char *host, char *id, char *password);
+int qser_Gnss_InjectTime(uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info);
+int qser_firmware_update(uint32_t h_gnss);
+int qser_Gnss_injectEphemeris(uint32_t h_gnss);
+int qser_Gnss_download_tle();
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/mbtk/include/lynq/lynq_qser_network.h b/mbtk/include/lynq/lynq_qser_network.h
new file mode 100755
index 0000000..f99df6c
--- /dev/null
+++ b/mbtk/include/lynq/lynq_qser_network.h
@@ -0,0 +1,474 @@
+/**
+ *@file     QSER_nw.h
+ *@date     2018-02-22
+ *@author
+ *@brief
+ */
+#ifndef __LYNQ_QSER_NETWORK_H__
+#define __LYNQ_QSER_NETWORK_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "mbtk_type.h"
+
+typedef uint32_t nw_client_handle_type;
+
+
+#define QSER_NW_MODE_NONE     0x00    /**<  No network. */
+#define QSER_NW_MODE_GSM      0x01    /**<  Include GSM networks. */
+#define QSER_NW_MODE_WCDMA    0x02    /**<  Include WCDMA networks. */
+#define QSER_NW_MODE_CDMA     0x04    /**<  Include CDMA networks. */
+#define QSER_NW_MODE_EVDO     0x08    /**<  Include EVDO networks. */
+#define QSER_NW_MODE_LTE      0x10    /**<  Include LTE networks. */
+#define QSER_NW_MODE_TDSCDMA  0x20    /**<  Include TDSCDMA networks. */
+
+typedef enum
+{
+    E_QSER_NW_ROAM_STATE_OFF  = 0,    /**<  None, or roaming indicator off. */
+    E_QSER_NW_ROAM_STATE_ON   = 1     /**<  Roaming indicator on. */
+}E_QSER_NW_ROAM_STATE_TYPE_T;
+
+/** Configures the settings that define the MCM network interface. */
+typedef struct
+{
+    /*  Configuration parameters for MCM network registration Network registration details Technology dependent network registration details */
+    uint64_t                        preferred_nw_mode;  /**<   Preferred network mode for connections; a bitmask of QSER_NW_MODE_xxxx.*/
+    E_QSER_NW_ROAM_STATE_TYPE_T   roaming_pref;       /**<   Roaming preference.*/
+}QSER_NW_CONFIG_INFO_T;
+
+typedef enum
+{
+    E_QSER_NW_IMS_MODE_OFF    = 0,     /**<  close ims. */
+    E_QSER_NW_IMS_MODE_VOLTE_ENABLE    = 1,  /**<  support volte. */
+}E_QSER_NW_IMS_MODE_TYPE_T;
+
+/** Configures the OOS (out of service)  settings that define the MCM network interface. */
+#define QSER_NW_OOS_CFG_TYPE_FAST_SCAN          0x00    /**<  fast net scan */
+#define QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN     0x01    /**<  full band scan */
+
+typedef struct
+{
+    /*    Configuration parameters for MCM network fast network scan when OOS (out of service)*/
+    char                        enable;
+    uint16_t                    time_interval;
+}QSER_NW_OOS_CONFIG_FAST_SCAN_INFO_T;
+
+typedef struct
+{
+    /*    Configuration parameters for MCM network full band network scan when OOS (out of service)*/
+    int t_min;
+    int t_step;
+    int t_num;
+    int t_max;
+}QSER_NW_OOS_CONFIG_FULL_BAND_SCAN_INFO_T;
+
+
+typedef struct
+{
+    char                        type;  /**<   QSER_NW_OOS_CFG_TYPE_xxxx.*/
+    union {
+    QSER_NW_OOS_CONFIG_FAST_SCAN_INFO_T  fast_can_info;       // 00
+    QSER_NW_OOS_CONFIG_FULL_BAND_SCAN_INFO_T full_band_scan_info;     // 01
+  } u;
+}QSER_NW_OOS_CONFIG_INFO_T;
+
+//defined for QSER_NW_EventRegister
+#define     NW_IND_VOICE_REG_EVENT_IND_FLAG               (1 << 0)    /**< msg format : QSER_NW_VOICE_REG_EVENT_IND_T */
+#define     NW_IND_DATA_REG_EVENT_IND_FLAG                (1 << 1)    /**< msg format : QSER_NW_DATA_REG_EVENT_IND_T */
+#define     NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG         (1 << 2)    /**< msg format : QSER_NW_SINGNAL_EVENT_IND_T */
+//#define     NW_IND_CELL_ACCESS_STATE_CHG_EVENT_IND_FLAG   (1 << 3)    /**< msg format : QL_MCM_NW_CELL_ACCESS_STATE_EVENT_IND_T */
+//#define     NW_IND_NITZ_TIME_UPDATE_EVENT_IND_FLAG        (1 << 4)    /**< msg format : QL_MCM_NW_NITZ_TIME_EVENT_IND_T */
+#define     NW_IND_IMS_REG_EVENT_IND_FLAG                 (1 << 5)    /**< msg format : NULL */
+
+typedef struct
+{
+    char long_eons[512 + 1];    /**<   Long EONS.*/
+    char short_eons[512 + 1];   /**<   Short EONS.*/
+    char mcc[10];            /**<   Mobile country code.*/
+    char mnc[10];            /**<   Mobile network code.*/
+}QSER_NW_OPERATOR_NAME_INFO_T;
+
+typedef enum
+{
+    E_QSER_NW_RADIO_TECH_TD_SCDMA = 1,
+    E_QSER_NW_RADIO_TECH_GSM      = 2,    /**<  GSM; only supports voice. */
+    E_QSER_NW_RADIO_TECH_HSPAP    = 3,    /**<  HSPA+. */
+    E_QSER_NW_RADIO_TECH_LTE      = 4,    /**<  LTE. */
+    E_QSER_NW_RADIO_TECH_EHRPD    = 5,    /**<  EHRPD. */
+    E_QSER_NW_RADIO_TECH_EVDO_B   = 6,    /**<  EVDO B. */
+    E_QSER_NW_RADIO_TECH_HSPA     = 7,    /**<  HSPA. */
+    E_QSER_NW_RADIO_TECH_HSUPA    = 8,    /**<  HSUPA. */
+    E_QSER_NW_RADIO_TECH_HSDPA    = 9,    /**<  HSDPA. */
+    E_QSER_NW_RADIO_TECH_EVDO_A   = 10,   /**<  EVDO A. */
+    E_QSER_NW_RADIO_TECH_EVDO_0   = 11,   /**<  EVDO 0. */
+    E_QSER_NW_RADIO_TECH_1xRTT    = 12,   /**<  1xRTT. */
+    E_QSER_NW_RADIO_TECH_IS95B    = 13,   /**<  IS95B. */
+    E_QSER_NW_RADIO_TECH_IS95A    = 14,   /**<  IS95A. */
+    E_QSER_NW_RADIO_TECH_UMTS     = 15,   /**<  UMTS. */
+    E_QSER_NW_RADIO_TECH_EDGE     = 16,   /**<  EDGE. */
+    E_QSER_NW_RADIO_TECH_GPRS     = 17,   /**<  GPRS. */
+    E_QSER_NW_RADIO_TECH_NONE     = 18    /**<  No technology selected. */
+}E_QSER_NW_RADIO_TECH_TYPE_T;
+
+
+typedef enum
+{
+    E_QSER_NW_TECH_DOMAIN_NONE    = 0,    /**<  None. */
+    E_QSER_NW_TECH_DOMAIN_3GPP    = 1,    /**<  3GPP. */
+    E_QSER_NW_TECH_DOMAIN_3GPP2   = 2,    /**<  3GPP2. */
+}E_QSER_NW_TECH_DOMAIN_TYPE_T;
+
+typedef enum
+{
+    E_QSER_NW_IMSI_UNKNOWN_HLR_DENY_REASON                    = 1, /**<  IMSI unknown in HLR. */
+    E_QSER_NW_ILLEGAL_MS_DENY_REASON                          = 2, /**<  Illegal MS. */
+    E_QSER_NW_IMSI_UNKNOWN_VLR_DENY_REASON                    = 3, /**<  IMSI unknown in VLR. */
+    E_QSER_NW_IMEI_NOT_ACCEPTED_DENY_REASON                   = 4, /**<  IMEI not accepted. */
+    E_QSER_NW_ILLEGAL_ME_DENY_REASON                          = 5, /**<  Illegal ME. */
+    E_QSER_NW_PLMN_NOT_ALLOWED_DENY_REASON                    = 6, /**<  PLMN not allowed. */
+    E_QSER_NW_LA_NOT_ALLOWED_DENY_REASON                      = 7, /**<  Location area not allowed. */
+    E_QSER_NW_ROAMING_NOT_ALLOWED_LA_DENY_REASON              = 8, /**<  Roaming not allowed in this location area. */
+    E_QSER_NW_NO_SUITABLE_CELLS_LA_DENY_REASON                = 9, /**<  No suitable cells in location area. */
+    E_QSER_NW_NETWORK_FAILURE_DENY_REASON                     = 10, /**<  Network failure. */
+    E_QSER_NW_MAC_FAILURE_DENY_REASON                         = 11, /**<  MAC failure. */
+    E_QSER_NW_SYNCH_FAILURE_DENY_REASON                       = 12, /**<  Sync failure. */
+    E_QSER_NW_CONGESTION_DENY_REASON                          = 13, /**<  Congestion. */
+    E_QSER_NW_GSM_AUTHENTICATION_UNACCEPTABLE_DENY_REASON     = 14, /**<  GSM authentication unacceptable. */
+    E_QSER_NW_NOT_AUTHORIZED_CSG_DENY_REASON                  = 15, /**<  Not authorized in this CSG. */
+    E_QSER_NW_SERVICE_OPTION_NOT_SUPPORTED_DENY_REASON        = 16, /**<  Service option not supported. */
+    E_QSER_NW_REQ_SERVICE_OPTION_NOT_SUBSCRIBED_DENY_REASON   = 17, /**<  Requested service option not subscribed. */
+    E_QSER_NW_CALL_CANNOT_BE_IDENTIFIED_DENY_REASON           = 18, /**<  Call cannot be identified. */
+    E_QSER_NW_SEMANTICALLY_INCORRECT_MSG_DENY_REASON          = 19, /**<  Semantically incorrect message. */
+    E_QSER_NW_INVALID_MANDATORY_INFO_DENY_REASON              = 20, /**<  Invalid mandatory information. */
+    E_QSER_NW_MSG_TYPE_NON_EXISTENT_DENY_REASON               = 21, /**<  Message type non-existent or not implemented. */
+    E_QSER_NW_INFO_ELEMENT_NON_EXISTENT_DENY_REASON           = 22, /**<  Message type not compatible with the protocol state. */
+    E_QSER_NW_CONDITIONAL_IE_ERR_DENY_REASON                  = 23, /**<  Conditional IE error. */
+    E_QSER_NW_MSG_INCOMPATIBLE_PROTOCOL_STATE_DENY_REASON     = 24, /**<  Message not compatible with the protocol state. */
+    E_QSER_NW_PROTOCOL_ERROR_DENY_REASON                      = 25, /**<  Unspecified protocol error. */
+}E_QSER_NW_DENY_REASON_TYPE_T;
+
+
+typedef enum
+{
+    E_QSER_NW_SERVICE_NONE     = 0x0000,  /**<  Not registered or no data. */
+    E_QSER_NW_SERVICE_LIMITED  = 0x0001,  /**<  Registered; emergency service only. */
+    E_QSER_NW_SERVICE_FULL     = 0x0002,  /**<  Registered, full service. */
+}E_QSER_NW_SERVICE_TYPE_T;
+
+typedef struct
+{
+    E_QSER_NW_TECH_DOMAIN_TYPE_T  tech_domain;        /**<   Technology, used to determine the structure type  tech: 0 -- None, 1 -- 3GPP, 2 -- 3GPP2.*/
+    E_QSER_NW_RADIO_TECH_TYPE_T   radio_tech;         /**<   Radio technology; see #nw_radio_tech_t_v01.*/
+    E_QSER_NW_ROAM_STATE_TYPE_T   roaming;            /**<   0 -- Off, 1 -- Roaming (3GPP2 has extended values).*/
+    E_QSER_NW_DENY_REASON_TYPE_T  deny_reason;        /**<   Set when registration state is #nw_deny_reason_t_v01.*/
+    E_QSER_NW_SERVICE_TYPE_T      registration_state; /**<   Registration state.*/
+}QSER_NW_COMMON_REG_INFO_T;
+
+
+typedef struct
+{
+    E_QSER_NW_TECH_DOMAIN_TYPE_T  tech_domain;        /**<   Technology, used to determine the structure type  tech: 0 -- None, 1 -- 3GPP, 2 -- 3GPP2.*/
+    E_QSER_NW_RADIO_TECH_TYPE_T   radio_tech;         /**<   Radio technology; see #nw_radio_tech_t_v01.*/
+    char                            mcc[10];           /**<   Mobile country code.*/
+    char                            mnc[10];           /**<   Mobile network code.*/
+    E_QSER_NW_ROAM_STATE_TYPE_T   roaming;            /**<   0 -- Off, 1 -- Roaming (3GPP2 has extended values).*/
+    uint8_t                         forbidden;          /**<   Forbidden: 0 -- No, 1 -- Yes.*/
+    uint32_t                        cid;                /**<   Cell ID for the registered 3GPP system.*/
+    uint16_t                        lac;                /**<   Locatin area code for the registered 3GPP system.*/
+    uint16_t                        psc;                /**<   Primary scrambling code (WCDMA only); 0 -- None.*/
+    uint16_t                        tac;                /**<   Tracking area code information for LTE.*/
+}QSER_NW_3GPP_REG_INFO_T;
+
+
+typedef struct
+{
+    E_QSER_NW_TECH_DOMAIN_TYPE_T  tech_domain;        /**<   Technology, used to determine structure type  tech: 0 -- None, 1 -- 3GPP, 2 -- 3GPP2.*/
+    E_QSER_NW_RADIO_TECH_TYPE_T   radio_tech;         /**<   Radio technology; see #nw_radio_tech_t_v01.*/
+    char                            mcc[3+1];           /**<   Mobile country code.*/
+    char                            mnc[3+1];           /**<   Mobile network code.*/
+    E_QSER_NW_ROAM_STATE_TYPE_T   roaming;            /**<   Roaming status; see #nw_roam_state_t_v01.*/
+    uint8_t                         forbidden;          /**<   Forbidden: 0 -- No, 1 -- Yes.*/
+    uint8_t                         inPRL;              /**<   0 -- Not in PRL, 1 -- In PRL.*/
+    uint8_t                         css;                /**<   Concurrent services supported: 0 -- No, 1 -- Yes.*/
+    uint16_t                        sid;                /**<   CDMA system ID.*/
+    uint16_t                        nid;                /**<   CDMA network ID.*/
+    uint16_t                        bsid;               /**<   Base station ID. @newpagetable */
+}QSER_NW_3GPP2_REG_INFO_T;
+
+/** Gets the status associated with the connection of \<id\>. */
+typedef struct
+{
+    uint8_t                         voice_registration_valid;               /**< Must be set to TRUE if voice_registration is being passed. */
+    QSER_NW_COMMON_REG_INFO_T     voice_registration;                     /**<   Voice registration. */
+
+    uint8_t                         data_registration_valid;                /**< Must be set to TRUE if data_registration is being passed. */
+    QSER_NW_COMMON_REG_INFO_T     data_registration;                      /**<   Data registration. */
+
+    uint8_t                         voice_registration_details_3gpp_valid;  /**< Must be set to TRUE if voice_registration_details_3gpp is being passed. */
+    QSER_NW_3GPP_REG_INFO_T       voice_registration_details_3gpp;        /**<   Voice registration details for 3GPP. */
+
+    uint8_t                         data_registration_details_3gpp_valid;   /**< Must be set to TRUE if data_registration_details_3gpp is being passed. */
+    QSER_NW_3GPP_REG_INFO_T       data_registration_details_3gpp;         /**<   Data registration details for 3GPP. */
+
+    uint8_t                         voice_registration_details_3gpp2_valid; /**< Must be set to TRUE if voice_registration_details_3gpp2 is being passed. */
+    QSER_NW_3GPP2_REG_INFO_T      voice_registration_details_3gpp2;       /**<   Voice registration details for 3GPP2. */
+
+    uint8_t                         data_registration_details_3gpp2_valid;  /**< Must be set to TRUE if data_registration_details_3gpp2 is being passed. */
+    QSER_NW_3GPP2_REG_INFO_T      data_registration_details_3gpp2;        /**<   Data registration details for 3GPP2. */
+}QSER_NW_REG_STATUS_INFO_T;
+
+typedef enum
+{
+    E_QSER_NW_IMS_SERVICE_NONE     = 0x0000,  /**<  Not registered */
+    E_QSER_NW_IMS_SERVICE_REGISTERED     = 0x0001,  /**<  Registered*/
+}E_QSER_NW_IMS_SERVICE_TYPE_T;
+
+typedef struct
+{
+    E_QSER_NW_IMS_SERVICE_TYPE_T      registration_state; /**<   Registration state.*/
+}QSER_NW_IMS_REG_STATUS_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates received signal strength. A signed value; -125 or lower indicates no signal.*/
+}QSER_NW_GSM_SIGNAL_INFO_T;
+
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Ec. A signed value; -125 or lower indicates no signal.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+}QSER_NW_WCDMA_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Ec.    a signed value; -125 or lower indicates no signal.*/
+    int8_t      rscp;       /**<   RSCP in dBm.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+    int8_t      sinr;       /**<   Measured SINR in dB. @newpagetable */
+}QSER_NW_TDSCDMA_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Ec. A signed value; -125 or lower indicates no signal.*/
+    int8_t      rsrq;       /**<   RSRQ value in dB (signed integer value), as measured by L1. Range: -3 to -20 (-3 equals -3 dB, -20 equals -20 dB).*/
+    int16_t      rsrp;       /**<   Current RSRP in dBm, as measured by L1. Range: -44 to -140 (-44 equals -44 dBm, -140 equals -140 dBm).*/
+    int16_t      snr;        /**<   SNR level as a scaled integer in units of 0.1 dB; e.g., -16 dB has a value of -160 and 24.6 dB has a value of 246.*/
+}QSER_NW_LTE_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Power (AGC) + Ec/Io. A signed value; -125 or lower indicates no signal.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+}QSER_NW_CDMA_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Power (AGC) + Ec/Io. A signed value; -125 or lower indicates no signal.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+    int8_t      sinr;       /**<   SINR level.*/
+    int32_t     io;         /**<   Received IO in dBm. */
+}QSER_NW_HDR_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int16_t     ssRsrp;   /* SS(Synchronization Signal) reference signal received power, multipled by -1.
+                      * Reference: 3GPP TS 38.215.
+                      * Range [44, 140], INT_MAX means invalid/unreported.*/
+    int16_t     ssRsrq;   /* SS reference signal received quality, multipled by -1.
+                      * Reference: 3GPP TS 38.215.
+                      * Range [3, 20], INT_MAX means invalid/unreported.*/
+    int16_t     ssSinr;   /* SS signal-to-noise and interference ratio.
+                      * Reference: 3GPP TS 38.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
+                      * Range [-23, 40], INT_MAX means invalid/unreported.*/
+    int16_t     csiRsrp;  /* CSI reference signal received power, multipled by -1.
+                      * Reference: 3GPP TS 38.215.
+                      * Range [44, 140], INT_MAX means invalid/unreported.*/
+    int16_t     csiRsrq;  /* CSI reference signal received quality, multipled by -1.
+                      * Reference: 3GPP TS 38.215.
+                      * Range [3, 20], INT_MAX means invalid/unreported.*/
+    int16_t     csiSinr;  /* CSI signal-to-noise and interference ratio.
+                      * Reference: 3GPP TS 138.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
+                      * Range [-23, 40], INT_MAX means invalid/unreported.*/
+}QSER_NW_NR_SIGNAL_INFO_T;
+
+
+/** Gets signal strength information. */
+typedef struct
+{
+    uint8_t                         gsm_sig_info_valid;         /**< Must be set to TRUE if gsm_sig_info is being passed. */
+    QSER_NW_GSM_SIGNAL_INFO_T     gsm_sig_info;               /**<   GSM signal information. */
+    uint8_t                         wcdma_sig_info_valid;       /**< Must be set to TRUE if wcdma_sig_info is being passed. */
+    QSER_NW_WCDMA_SIGNAL_INFO_T   wcdma_sig_info;             /**<   WCDMA signal information. */
+    uint8_t                         tdscdma_sig_info_valid;     /**< Must be set to TRUE if tdscdma_sig_info is being passed. */
+    QSER_NW_TDSCDMA_SIGNAL_INFO_T tdscdma_sig_info;           /**<   TDSCDMA signal information. */
+    uint8_t                         lte_sig_info_valid;         /**< Must be set to TRUE if lte_sig_info is being passed. */
+    QSER_NW_LTE_SIGNAL_INFO_T     lte_sig_info;               /**<   LTE signal information. */
+    uint8_t                         cdma_sig_info_valid;        /**< Must be set to TRUE if cdma_sig_info is being passed. */
+    QSER_NW_CDMA_SIGNAL_INFO_T    cdma_sig_info;              /**<   CDMA signal information. */
+    uint8_t                         hdr_sig_info_valid;         /**< Must be set to TRUE if hdr_sig_info is being passed. */
+    QSER_NW_HDR_SIGNAL_INFO_T     hdr_sig_info;               /**<   HDR signal information. */
+    uint8_t                         nr_sig_info_valid;
+    QSER_NW_NR_SIGNAL_INFO_T      nr_sig_info;
+}QSER_NW_SIGNAL_STRENGTH_INFO_T;
+
+
+
+
+
+/* @bridef Callback function registered to QSER_NW_AddRxMsgHandler
+ * map of ind_flag and ind_msg_buf as bellow :
+ *  NW_IND_VOICE_REG_EVENT_IND_FLAG : QSER_NW_VOICE_REG_EVENT_IND_T
+ *  NW_IND_DATA_REG_EVENT_IND_FLAG : QSER_NW_DATA_REG_EVENT_IND_T
+ *  NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG : QSER_NW_SINGNAL_EVENT_IND_T
+ *  NW_IND_CELL_ACCESS_STATE_CHG_EVENT_IND_FLAG : QSER_NW_CELL_ACCESS_STATE_EVENT_IND_T
+ *  NW_IND_NITZ_TIME_UPDATE_EVENT_IND_FLAG : QSER_NW_NITZ_TIME_EVENT_IND_T
+ * */
+typedef void (*QSER_NW_RxMsgHandlerFunc_t)(
+    nw_client_handle_type h_nw,
+    uint32_t ind_flag,
+    void                  *ind_msg_buf,
+    uint32_t              ind_msg_len,
+    void                  *contextPtr
+);
+
+
+/** Indication message; Indication for the corresponding registered event flag NW_IND_VOICE_REG_EVENT_IND_FLAG */
+typedef struct {
+
+  uint8_t                         registration_valid;               /**< Must be set to TRUE if voice_registration is being passed. */
+  QSER_NW_COMMON_REG_INFO_T     registration;                     /**< Voice registration. */
+
+  uint8_t                         registration_details_3gpp_valid;  /**< Must be set to TRUE if voice_registration_details_3gpp is being passed. */
+  QSER_NW_3GPP_REG_INFO_T       registration_details_3gpp;        /**< Voice registration details for 3GPP. */
+
+  uint8_t                         registration_details_3gpp2_valid; /**< Must be set to TRUE if voice_registration_details_3gpp2 is being passed. */
+  QSER_NW_3GPP2_REG_INFO_T      registration_details_3gpp2;       /**< Voice registration details for 3GPP2. */
+}QSER_NW_VOICE_REG_EVENT_IND_T;
+
+/** Indication message; Indication for the corresponding registered event flag NW_IND_DATA_REG_EVENT_IND_FLAG */
+typedef struct {
+
+  uint8_t                         registration_valid;               /**< Must be set to TRUE if data_registration is being passed. */
+  QSER_NW_COMMON_REG_INFO_T     registration;                     /**< Data registration. */
+
+  uint8_t                         registration_details_3gpp_valid;  /**< Must be set to TRUE if data_registration_details_3gpp is being passed. */
+  QSER_NW_3GPP_REG_INFO_T       registration_details_3gpp;        /**< Data registration details for 3GPP. */
+
+  uint8_t                         registration_details_3gpp2_valid; /**< Must be set to TRUE if data_registration_details_3gpp2 is being passed. */
+  QSER_NW_3GPP2_REG_INFO_T      registration_details_3gpp2;       /**< Data registration details for 3GPP2. */
+}QSER_NW_DATA_REG_EVENT_IND_T;
+
+
+/** Indication message; Indication for the corresponding registered event flag NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG */
+typedef struct {
+    uint8_t gsm_sig_info_valid;                       /**< Must be set to TRUE if gsm_sig_info is being passed. */
+    QSER_NW_GSM_SIGNAL_INFO_T       gsm_sig_info;   /**< GSM singal information. */
+
+    uint8_t wcdma_sig_info_valid;                     /**< Must be set to TRUE if wcdma_sig_info is being passed. */
+    QSER_NW_WCDMA_SIGNAL_INFO_T wcdma_sig_info;     /**< WCDMA singal information. */
+
+    uint8_t tdscdma_sig_info_valid;                   /**< Must be set to TRUE if tdscdma_sig_info is being passed. */
+    QSER_NW_TDSCDMA_SIGNAL_INFO_T tdscdma_sig_info; /**< TDSCDMA singal information. */
+
+    uint8_t lte_sig_info_valid;                       /**< Must be set to TRUE if lte_sig_info is being passed. */
+    QSER_NW_LTE_SIGNAL_INFO_T lte_sig_info;         /**< LTE singal information. */
+
+    uint8_t cdma_sig_info_valid;                      /**< Must be set to TRUE if cdma_sig_info is being passed. */
+    QSER_NW_CDMA_SIGNAL_INFO_T cdma_sig_info;       /**< CDMA singal information. */
+
+    uint8_t hdr_sig_info_valid;                       /**< Must be set to TRUE if hdr_sig_info is being passed. */
+    QSER_NW_HDR_SIGNAL_INFO_T hdr_sig_info;         /**< HDR singal information. */
+
+    uint8_t                         nr_sig_info_valid;
+    QSER_NW_NR_SIGNAL_INFO_T      nr_sig_info;
+}QSER_NW_SINGNAL_EVENT_IND_T;
+
+typedef enum
+{
+    E_QSER_NW_RF_MODE_CFUN_0 = 0,    /**<  CFUN 0. */
+    E_QSER_NW_RF_MODE_CFUN_1 = 1,    /**<  CFUN 1. */
+    E_QSER_NW_RF_MODE_FLIGHT = 4,    /**<  Flight Mode, CFUN 4. */
+}E_QSER_NW_RF_MODE_TYPE_T;
+
+int qser_nw_client_init(nw_client_handle_type  *ph_nw);
+
+int qser_nw_client_deinit(nw_client_handle_type  h_nw);
+
+int qser_nw_set_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_CONFIG_INFO_T     *pt_info
+);
+
+int qser_nw_set_ims_enable
+(
+    nw_client_handle_type h_nw,
+    E_QSER_NW_IMS_MODE_TYPE_T ims_mode
+);
+
+int qser_nw_set_oos_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_OOS_CONFIG_INFO_T     *pt_info
+);
+
+int qser_nw_get_oos_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_OOS_CONFIG_INFO_T     *pt_info
+);
+
+int qser_nw_event_register
+(
+    nw_client_handle_type       h_nw,
+    uint32_t                    bitmask // bit OR of NW_IND_xxxx_EVENT_ON
+);
+
+int qser_nw_get_operator_name
+(
+    nw_client_handle_type           h_nw,
+    QSER_NW_OPERATOR_NAME_INFO_T  *pt_info //You should malloc this or may cause stack overflow
+);
+
+int qser_nw_get_reg_status
+(
+    nw_client_handle_type               h_nw,
+    QSER_NW_REG_STATUS_INFO_T         *pt_info
+);
+
+int qser_nw_get_ims_reg_status
+(
+    nw_client_handle_type h_nw,
+    QSER_NW_IMS_REG_STATUS_INFO_T *pt_info
+);
+
+int qser_nw_get_signal_strength
+(
+    nw_client_handle_type               h_nw,
+    QSER_NW_SIGNAL_STRENGTH_INFO_T    *pt_info
+);
+
+int qser_nw_add_rx_msg_handler
+(
+    nw_client_handle_type        h_nw,
+    QSER_NW_RxMsgHandlerFunc_t handlerPtr,
+    void* contextPtr
+);
+
+int qser_nw_set_rf_mode
+(
+    nw_client_handle_type       h_nw,
+    E_QSER_NW_RF_MODE_TYPE_T    rf_mode
+);
+
+int qser_nw_get_rf_mode
+(
+    nw_client_handle_type       h_nw,
+    E_QSER_NW_RF_MODE_TYPE_T    *rf_mode
+);
+
+#ifdef __cplusplus
+}
+#endif
+#endif//__QSER_NW_H__
diff --git a/mbtk/include/lynq/lynq_qser_sim.h b/mbtk/include/lynq/lynq_qser_sim.h
new file mode 100755
index 0000000..f49e611
--- /dev/null
+++ b/mbtk/include/lynq/lynq_qser_sim.h
@@ -0,0 +1,473 @@
+#ifndef __LYNQ_QSER_SIM__
+#define __LYNQ_QSER_SIM__
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <stdint.h>
+#include "mbtk_type.h"
+
+#define QSER_SIM_IMSI_LEN_MAX     16  /**  Maximum length of IMSI data. */
+#define QSER_SIM_ICCID_LEN_MAX    20  /**  Maximum length of ICCID data. */
+
+typedef enum
+{
+    E_QSER_SUCCESS                        = 0,    /**<  Success. */
+    E_QSER_ERROR_BADPARM                  = 4,    /**<  Bad parameter. */
+}E_QSER_ERROR_CODE_T;
+
+typedef uint32_t sim_client_handle_type;
+
+typedef enum
+{
+    QSER_SIM_SLOT_ID_1          = 0xB01,    /**< Identify card in slot 1.  */
+    QSER_SIM_SLOT_ID_2          = 0xB02,    /**< Identify card in slot 2.  */
+}QSER_SIM_SLOT_ID_TYPE_T;
+
+typedef enum
+{
+    QSER_SIM_APP_TYPE_UNKNOWN   = 0xB00,    /**<  Unknown application type  */
+    QSER_SIM_APP_TYPE_3GPP      = 0xB01,    /**< Identify the SIM/USIM application on the card.  */
+    QSER_SIM_APP_TYPE_3GPP2     = 0xB02,    /**< Identify the RUIM/CSIM application on the card.  */
+    QSER_SIM_APP_TYPE_ISIM      = 0xB03,    /**< Identify the ISIM application on the card.  */
+}QSER_SIM_APP_TYPE_T;
+
+typedef struct
+{
+    QSER_SIM_SLOT_ID_TYPE_T     e_slot_id;  /**< Indicates the slot to be used. */
+    QSER_SIM_APP_TYPE_T         e_app;      /**< Indicates the type of the application. */
+}QSER_SIM_APP_ID_INFO_T;  /* Type */
+
+#define QSER_SIM_PIN_LEN_MAX  8 + 1   /**  Maximum length of PIN data. */
+
+typedef enum
+{
+    QSER_SIM_PIN_ID_1 = 0xB01,  /**< Level 1 user verification.  */
+    QSER_SIM_PIN_ID_2 = 0xB02,  /**< Level 2 user verification.  */
+}QSER_SIM_PIN_ID_TYPE_T;
+
+typedef struct
+{
+    QSER_SIM_APP_ID_INFO_T        app_info;                           /**< Application identification information. */
+    QSER_SIM_PIN_ID_TYPE_T  pin_id;                             /**< PIN ID. */
+    uint32_t                    pin_value_len;                      /**< Must be set to the number of elements in pin_value. */
+    char                        pin_value[QSER_SIM_PIN_LEN_MAX];  /*  Value of the PIN */
+}QSER_SIM_VERIFY_PIN_INFO_T;
+
+/** Changes the PIN value of an application. The application must pass both the
+    new and the old values of the PIN to complete the operation.
+    The same PIN can be used by multiple sessions (i.e., the PIN is shared
+    between GSM and RUIM in an ICC card). The PIN is automatically verified
+    for all the sessions when the command is executed. */
+typedef struct
+{
+    QSER_SIM_APP_ID_INFO_T        app_info;                               /**< Application identification information. */
+    QSER_SIM_PIN_ID_TYPE_T  pin_id;                                 /**< PIN ID. */
+    uint32_t                    old_pin_value_len;                      /**< Must be set to the number of elements in old_pin_value. */
+    char                        old_pin_value[QSER_SIM_PIN_LEN_MAX];  /**< Value of the old PIN as a sequence of ASCII characters. */
+    uint32_t                    new_pin_value_len;                      /**< Must be set to the number of elements in new_pin_value. */
+    char                        new_pin_value[QSER_SIM_PIN_LEN_MAX];  /**< Value of the new PIN as a sequence of ASCII characters. */
+}QSER_SIM_CHANGE_PIN_INFO_T;
+
+/** Unblocks a blocked PIN using the PUK code. The client must pass PUK1 to unblock PIN1 or PUK2 to unblock PIN2.
+    The same PIN can be used by multiple sessions (i.e., the PIN is shared between GSM and RUIM in an ICC card).
+    The PIN is automatically verified for all the sessions when the command is executed. */
+typedef struct
+{
+    QSER_SIM_APP_ID_INFO_T        app_info;                               /**< Application identification information. */
+    QSER_SIM_PIN_ID_TYPE_T  pin_id;                                 /**< PIN ID. */
+    uint32_t                    puk_value_len;                          /**< Must be set to the number of elements in puk_value. */
+    char                        puk_value[QSER_SIM_PIN_LEN_MAX];      /**< Value of the PUK as a sequence of ASCII characters. */
+    uint32_t                    new_pin_value_len;                      /**< Must be set to the number of elements in new_pin_value. */
+    char                        new_pin_value[QSER_SIM_PIN_LEN_MAX];  /**< Value of the new PIN as a sequence of ASCII characters. */
+}QSER_SIM_UNBLOCK_PIN_INFO_T;
+
+/** Enables the PIN on an application. */
+typedef  QSER_SIM_VERIFY_PIN_INFO_T QSER_SIM_ENABLE_PIN_INFO_T; //Same
+
+/** Disables the PIN of an application, */
+typedef  QSER_SIM_VERIFY_PIN_INFO_T QSER_SIM_DISABLE_PIN_INFO_T; //Same
+
+
+typedef enum
+{
+    QSER_SIM_PERSO_FEATURE_TYPE_UNKNOWN                 = 0xB00, /**<  Unknown personalization feature.  */
+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_NETWORK            = 0xB01, /**<  Featurization based on 3GPP MCC and MNC.  */
+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_NETWORK_SUBSET     = 0xB02, /**<  Featurization based on 3GPP MCC, MNC, and IMSI digits 6 and 7.  */
+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_SERVICE_PROVIDER   = 0xB03, /**<  Featurization based on 3GPP MCC, MNC, and GID1.  */
+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_CORPORATE          = 0xB04, /**<  Featurization based on 3GPP MCC, MNC, GID1, and GID2.  */
+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_SIM                = 0xB05, /**<  Featurization based on the 3GPP IMSI.  */
+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP2_NETWORK_TYPE_1    = 0xB06, /**<  Featurization based on 3GPP2 MCC and MNC.  */
+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP2_NETWORK_TYPE_2    = 0xB07, /**<  Featurization based on 3GPP2 IRM code.  */
+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP2_RUIM              = 0xB08, /**<  Featurization based on 3GPP2 IMSI_M.  */
+}QSER_SIM_PERSO_FEATURE_TYPE_T;
+
+typedef enum
+{
+    QSER_SIM_CARD_STATE_UNKNOWN                     = 0xB01,    /**< Card state unknown. */
+    QSER_SIM_CARD_STATE_ABSENT                      = 0xB02,    /**< Card is absent. */
+    QSER_SIM_CARD_STATE_PRESENT                     = 0xB03,    /**< Card is present. */
+    QSER_SIM_CARD_STATE_ERROR_UNKNOWN               = 0xB04,    /**< Unknown error state. */
+    QSER_SIM_CARD_STATE_ERROR_POWER_DOWN            = 0xB05,    /**< Power down. */
+    QSER_SIM_CARD_STATE_ERROR_POLL_ERROR            = 0xB06,    /**< Poll error. */
+    QSER_SIM_CARD_STATE_ERROR_NO_ATR_RECEIVED       = 0xB07,    /**<  Failed to receive an answer to reset.  */
+    QSER_SIM_CARD_STATE_ERROR_VOLT_MISMATCH         = 0xB08,    /**< Voltage mismatch. */
+    QSER_SIM_CARD_STATE_ERROR_PARITY_ERROR          = 0xB09,    /**< Parity error. */
+    QSER_SIM_CARD_STATE_ERROR_SIM_TECHNICAL_PROBLEMS= 0xB0A,    /**< Card returned technical problems. */
+}QSER_SIM_CARD_STATE_TYPE_T;  /**< Card state. */
+
+typedef enum
+{
+    QSER_SIM_CARD_TYPE_UNKNOWN  = 0xB00,    /**<  Unidentified card type.  */
+    QSER_SIM_CARD_TYPE_ICC      = 0xB01,    /**<  Card of SIM or RUIM type.  */
+    QSER_SIM_CARD_TYPE_UICC     = 0xB02,    /**<  Card of USIM or CSIM type.  */
+}QSER_SIM_CARD_TYPE_T;
+
+typedef enum
+{
+    QSER_SIM_PROV_STATE_NONE    = 0xB00,    /**<  Nonprovisioning.  */
+    QSER_SIM_PROV_STATE_PRI     = 0xB01,    /**<  Primary provisioning subscription.  */
+    QSER_SIM_PROV_STATE_SEC     = 0xB02,    /**<  Secondary provisioning subscription.  */
+}QSER_SIM_SUBSCRIPTION_TYPE_T;
+
+typedef enum
+{
+    QSER_SIM_APP_STATE_UNKNOWN                  = 0xB00,    /**< Application state unknown. */
+    QSER_SIM_APP_STATE_DETECTED                 = 0xB01,    /**<  Detected state.  */
+    QSER_SIM_APP_STATE_PIN1_REQ                 = 0xB02,    /**<  PIN1 required.  */
+    QSER_SIM_APP_STATE_PUK1_REQ                 = 0xB03,    /**<  PUK1 required.  */
+    QSER_SIM_APP_STATE_INITALIZATING            = 0xB04,    /**<  Initializing.  */
+    QSER_SIM_APP_STATE_PERSO_CK_REQ             = 0xB05,    /**<  Personalization control key required.  */
+    QSER_SIM_APP_STATE_PERSO_PUK_REQ            = 0xB06,    /**<  Personalization unblock key required.  */
+    QSER_SIM_APP_STATE_PERSO_PERMANENTLY_BLOCKED= 0xB07,    /**<  Personalization is permanently blocked.  */
+    QSER_SIM_APP_STATE_PIN1_PERM_BLOCKED        = 0xB08,    /**<  PIN1 is permanently blocked.  */
+    QSER_SIM_APP_STATE_ILLEGAL                  = 0xB09,    /**<  Illegal application state.  */
+    QSER_SIM_APP_STATE_READY                    = 0xB0A,    /**<  Application ready state.  @newpage */
+}QSER_SIM_APP_STATE_TYPE_T;
+
+typedef enum
+{
+    QSER_SIM_PIN_STATE_UNKNOWN                  = 0xB01,    /**< Unknown PIN state. */
+    QSER_SIM_PIN_STATE_ENABLED_NOT_VERIFIED     = 0xB02,    /**<  PIN required, but has not been verified.  */
+    QSER_SIM_PIN_STATE_ENABLED_VERIFIED         = 0xB03,    /**<  PIN required and has been verified.  */
+    QSER_SIM_PIN_STATE_DISABLED                 = 0xB04,    /**<  PIN not required.  */
+    QSER_SIM_PIN_STATE_BLOCKED                  = 0xB05,    /**<  PIN verification has failed too many times and is blocked. Recoverable through PUK verification.  */
+    QSER_SIM_PIN_STATE_PERMANENTLY_BLOCKED      = 0xB06,    /**<  PUK verification has failed too many times and is not recoverable.  */
+}QSER_SIM_PIN_STATE_TYPE_T;
+
+typedef struct
+{
+    QSER_SIM_SUBSCRIPTION_TYPE_T      subscription;           /**<   Type of subscription (i.e., primary, secondary, etc.). */
+    QSER_SIM_APP_STATE_TYPE_T         app_state;              /**<   Current state of the application. */
+    QSER_SIM_PERSO_FEATURE_TYPE_T   perso_feature;          /**<   Current personalization state and feature enabled. */
+    uint8_t                             perso_retries;          /**<   Number of personalization retries. */
+    uint8_t                             perso_unblock_retries;  /**<   Number of personalization unblock retries. */
+    QSER_SIM_PIN_STATE_TYPE_T         pin1_state;             /**<   Current PIN 1 state. */
+    uint8_t                             pin1_num_retries;       /**<   Number of PIN 1 retries. */
+    uint8_t                             puk1_num_retries;       /**<   Number of PUK 1 retries. */
+    QSER_SIM_PIN_STATE_TYPE_T         pin2_state;             /**<   Current PIN 2 state. */
+    uint8_t                             pin2_num_retries;       /**<   Number of PIN 2 retries. */
+    uint8_t                             puk2_num_retries;       /**<   Number of PUK 2 retries. */
+}QSER_SIM_CARD_APP_INFO_T;
+
+typedef struct
+{
+    QSER_SIM_CARD_APP_INFO_T          app_3gpp;               /**<   Stores 3GPP application information. */
+    QSER_SIM_CARD_APP_INFO_T          app_3gpp2;              /**<   Stores 3GPP2 application information. */
+    QSER_SIM_CARD_APP_INFO_T          app_isim;               /**<   Stores ISIM application information. */
+}QSER_SIM_CARD_ALL_APP_INFO_T;
+
+typedef struct
+{
+    QSER_SIM_CARD_STATE_TYPE_T      e_card_state;/**<   Current card and card error state. */
+    QSER_SIM_CARD_TYPE_T            e_card_type; /**<   Card type. */
+    QSER_SIM_CARD_ALL_APP_INFO_T      card_app_info; /**<   Stores all relevant application information. */
+}QSER_SIM_CARD_STATUS_INFO_T;
+
+typedef QSER_SIM_CARD_STATUS_INFO_T*      QSER_SIM_MsgRef; 
+/* Callback function registered to qser_sms_addrxmsghandler, msgRef contains the detail msg infor */
+typedef void (*QSER_SIM_RxMsgHandlerFunc_t)(QSER_SIM_MsgRef msgRef);
+
+
+int qser_sim_client_init(sim_client_handle_type  *ph_sim);
+
+int qser_sim_client_deinit(sim_client_handle_type h_sim);
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_getimsi
+
+===========================================================================*/
+/*
+    @brief
+    Function sends a command to the modem to retrieve the IMSI (for 3GPP)
+    or IMSI_M (for 3GPP2) from the SIM in ASCII form
+
+    @return
+    void
+*/
+/*=========================================================================*/
+int qser_sim_getimsi(
+    sim_client_handle_type          h_sim,
+    QSER_SIM_APP_ID_INFO_T            *pt_info,   ///< [IN] The SIM identifier info.
+    char                            *imsi,      ///< [OUT] IMSI buffer
+    size_t                          imsiLen     ///< [IN] IMSI buffer length
+);
+
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_geticcid
+
+===========================================================================*/
+/*
+    @brief
+    Function sends a command to the modem to retrieve the ICCID from
+    SIM in ASCII form
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_sim_geticcid
+(
+    sim_client_handle_type          h_sim,
+    QSER_SIM_SLOT_ID_TYPE_T     simId,     ///< [IN] The SIM identifier.
+    char                            *iccid,    ///< [OUT] ICCID
+    size_t                          iccidLen   ///< [IN] ICCID buffer length
+);
+
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_getphonenumber
+
+===========================================================================*/
+/*
+    @brief
+    Function sends a command to the modem to retrieve the device phone
+    number from MSISDN (for 3GPP) or MDN (for 3GPP2) from the SIM in
+    ASCII form
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_sim_getphonenumber
+(
+    sim_client_handle_type          h_sim,
+    QSER_SIM_APP_ID_INFO_T            *pt_info,   ///< [IN] The SIM identifier.
+    char                            *phone_num, ///< [OUT] phone number
+    size_t                          phoneLen    ///< [IN] phone number buffer length
+);
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_verifypin
+
+===========================================================================*/
+/*
+    @brief
+    Function sends a command to the modem to verify either PIN1 or PIN2
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_sim_verifypin
+(
+    sim_client_handle_type      h_sim,
+    QSER_SIM_VERIFY_PIN_INFO_T    *pt_info   ///< [IN] Verify PIN infor
+);
+
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_changepin
+
+===========================================================================*/
+/*
+    @brief
+    Function sends a command to the modem to change the value of
+    either PIN1 or PIN2
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_sim_changepin
+(
+    sim_client_handle_type      h_sim,
+    QSER_SIM_CHANGE_PIN_INFO_T    *pt_info   ///< [IN] Change PIN infor
+);
+
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_unblockpin
+
+===========================================================================*/
+/*
+    @brief
+    Function sends a command to the modem to unblock a PIN1 or PIN2 that
+    has been blocked
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_sim_unblockpin
+(
+    sim_client_handle_type      h_sim,
+    QSER_SIM_UNBLOCK_PIN_INFO_T   *pt_info   ///< [IN] Unblock PIN infor
+);
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_enablepin
+
+===========================================================================*/
+/*
+    @brief
+    Function sends a command to the modem to enable PIN1 or PIN2
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_sim_enablepin
+(
+    sim_client_handle_type      h_sim,
+    QSER_SIM_ENABLE_PIN_INFO_T    *pt_info   ///< [IN] Enable PIN infor
+);
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_disablepin
+
+===========================================================================*/
+/*
+    @brief
+    Function sends a command to the modem to disable PIN1 or PIN2
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_sim_disablepin
+(
+    sim_client_handle_type      h_sim,
+    QSER_SIM_DISABLE_PIN_INFO_T   *pt_info   ///< [IN] Disable PIN infor
+);
+
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_getcardstatus
+
+===========================================================================*/
+/*
+    @brief
+    Function retrieves the server cached card status informations and
+    sends the information to the client
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_sim_getcardstatus
+(
+    sim_client_handle_type          h_sim,
+    QSER_SIM_SLOT_ID_TYPE_T     simId,     ///< [IN] The SIM identifier.
+    QSER_SIM_CARD_STATUS_INFO_T   *pt_info   ///< [OUT] Cart status infor output
+);
+
+/*===========================================================================
+
+  FUNCTION:  qser_sim_getimei
+
+===========================================================================*/
+/*
+    @brief
+    get imei
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_sim_getimei(sim_client_handle_type h_sim, char *imei);
+int qser_get_imei_and_sv(sim_client_handle_type h_sim,char *imei, char*sv);
+
+
+/*===========================================================================
+
+  FUNCTION:  qser_get_imei_and_sv
+
+===========================================================================*/
+/*
+    @brief
+    get imei and sv
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_get_imei_and_sv
+(
+    sim_client_handle_type h_sim,
+    char *imei, char*sv
+);
+
+/*===========================================================================
+
+  FUNCTION:  qser_reset_modem
+
+===========================================================================*/
+/*
+    @brief
+    reboot modem
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_reset_modem(sim_client_handle_type h_sim);
+
+
+/*===========================================================================
+
+  FUNCTION:  qser_reset_modem
+
+===========================================================================*/
+/*
+    @brief
+    reboot modem
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_get_version(sim_client_handle_type h_sim, char *buf);
+
+
+/*===========================================================================
+
+  FUNCTION:  qser_reset_modem
+
+===========================================================================*/
+/*
+    @brief
+    reboot modem
+
+    @return
+    int
+*/
+/*=========================================================================*/
+int qser_reset_sim(sim_client_handle_type h_sim);
+
+int qser_sim_addrxmsghandler(QSER_SIM_RxMsgHandlerFunc_t handlerPtr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/mbtk/include/lynq/lynq_qser_sms.h b/mbtk/include/lynq/lynq_qser_sms.h
new file mode 100755
index 0000000..7276fca
--- /dev/null
+++ b/mbtk/include/lynq/lynq_qser_sms.h
@@ -0,0 +1,241 @@
+#ifndef LYNQ_QSER_SMS_H
+#define LYNQ_QSER_SMS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/types.h>
+#include <stdint.h>
+
+#define MIN_MSM_PARAM_NUM 4
+#define MIN_IMS_MSM_PARAM_NUM 6
+#define MIN_WRITMSM_PARAM_NUM 5
+#define MSG_MAX_LEN 1024
+#define TELEPHONNUM_LEN 64
+#define STORAGSMS_MAX_SIZE 128
+#define SMSC_MAX_LEN 22
+#define SMS_NUM_MAX 255
+
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef uint32_t sms_client_handle_type;
+
+/**  Maximum length of an SMS. */
+#define QSER_SMS_MAX_MT_MSG_LENGTH    1440
+
+/**  Maximum string length. */
+#define QSER_SMS_MAX_ADDR_LENGTH      252
+
+/**  Maximum string length. */
+#define QSER_SMS_MAX_SCA_TYPLENGTH 3
+
+typedef enum   
+{    
+    QSER_SMS_7BIT        = 0,
+    QSER_SMS_8BIT     = 1,
+    QSER_SMS_UCS2            = 2,
+    //<2017/12/28-QCM9XOL00004C001-P01-Vicent.Gao, <[SMS] Segment 1==> CharSet to Alpha implementation.>
+    //QSER_SMS_IRA             = 3,//just for inside test 
+    //>2017/12/28-QCM9XOL00004C001-P01-Vicent.Gao
+
+}QSER_SMS_T;   
+
+typedef enum   
+{    
+    QSER_SMS_MO               = 0,    ///< SMS mobile terminated message.  
+    QSER_SMS_MT               = 1,    ///< SMS mobile originated message. 
+    QSER_SMS_BROADCAST_MT      = 2     ///< SMS Cell Broadcast message.   
+}QSER_SMS_TYPT; 
+
+typedef enum 
+{
+    QSER_SMS_STORAGTYPNONE      = -1,   /**<  Message no need to store. */
+    QSER_SMS_STORAGTYPUIM       = 0,    /**<  Message store to UIM. */
+    QSER_SMS_STORAGTYPNV        = 1,    /**<  Message store to NV. */
+    QSER_SMS_STORAGTYPDB     = 2,    /**<  Message store to NV. */
+}QSER_SMS_STORAGTYPT;
+
+typedef enum 
+{
+    QSER_SMS_MESSAGMODUNKNOWN   = -1,   /**<  Message type CDMA */
+    QSER_SMS_MESSAGMODCDMA      = 0,    /**<  Message type CDMA */
+    QSER_SMS_MESSAGMODGW        = 1,    /**<  Message type GW. */
+}QSER_SMS_MODTYPT;
+
+typedef struct 
+ {
+    uint8_t total_segments;     /**<     The number of long  short message*/
+    uint8_t seg_number;         /**<     Current number.*/
+	uint8_t referencnumber;   /**< referencnumber.*/
+}QSER_sms_user_data_head_t; 
+
+typedef struct
+{
+    /* If sms is stored, it won't parse, you need read it by yourself */
+    QSER_SMS_STORAGTYPT storage;                          ///specify where stored this msg
+    
+    QSER_SMS_T       format;
+    QSER_SMS_TYPT         type;
+    char                    src_addr[QSER_SMS_MAX_ADDR_LENGTH]; ///Telephone number string.  
+    int                     sms_data_len;
+    char                    sms_data[QSER_SMS_MAX_MT_MSG_LENGTH];   ///SMS content, data format depends on format
+    char                    timestamp[21];                      ///Message time stamp (in text mode). string format: "yy/MM/dd,hh:mm:ss+/-TimeZone" 
+    uint8_t                 user_data_head_valid;               //indicate whether long sms. TRUE-long sms; FALSE-short message;
+    QSER_sms_user_data_head_t  user_data_head;                    //long sms user data head info.
+    QSER_SMS_MODTYPT    mode;                             ///specify where stored this msg cdma or gw area
+    uint32_t                storage_index;                      ///storage index, -1 means not store
+} QSER_sms_info_t;
+     
+typedef struct
+{
+    QSER_SMS_STORAGTYPT storage;
+    QSER_SMS_MODTYPT    mode;
+    uint32_t                storage_idx;
+} QSER_sms_storage_info_t;
+
+typedef enum 
+{
+    QSER_SMS_UNKNOWN            = -1, 
+    QSER_SMS_DISCARD            = 0x00, /*  Incoming messages for this route are discarded by the WMS service without 
+                                            notifying QMI_WMS clients */
+    QSER_SMS_STORAND_NOTIFY   = 0x01, /*  Incoming messages for this route are stored to the specified device 
+                                            memory, and new message notifications */
+    QSER_SMS_TRANSFER_ONLY      = 0x02, /*  Incoming messages for this route are transferred to the client, and the
+                                            client is expected to send ACK to the network */
+    QSER_SMS_TRANSFER_AND_ACK   = 0x03, /*  Incoming messages for this route are transferred to the client, and ACK is
+                                            sent to the network */
+}QSER_SMS_RECEPTION_ACTION_TYPT;
+
+#define QSER_WMS_MESSAGLENGTH_MAX 255
+
+typedef enum 
+ {
+    QSER_WMS_MESSAGCDMA            = 0x00,     //- 0x00 -- MESSAGCDMA -- CDMA \n 
+    QSER_WMS_MESSAGGW_PP           = 0x06,     //- 0x06 -- MESSAGGW_PP -- GW_PP
+}QSER_WMS_MESSAGTYPE;
+
+
+typedef struct
+ {
+  QSER_WMS_MESSAGTYPE format;
+  uint32_t raw_messaglen;                             /**< Must be set to # of elements in raw_message */
+  uint8_t raw_message[QSER_WMS_MESSAGLENGTH_MAX];       /**< Raw message data*/
+}QSER_wms_send_raw_message_data_t; 
+
+typedef enum
+{
+  QSER_WMS_TL_CAUSCODADDR_VACANT                        = 0x00, 
+  QSER_WMS_TL_CAUSCODADDR_TRANSLATION_FAILURE           = 0x01, 
+  QSER_WMS_TL_CAUSCODNETWORK_RESOURCSHORTAGE          = 0x02, 
+  QSER_WMS_TL_CAUSCODNETWORK_FAILURE                    = 0x03, 
+  QSER_WMS_TL_CAUSCODINVALID_TELESERVICID             = 0x04, 
+  QSER_WMS_TL_CAUSCODNETWORK_OTHER                      = 0x05, 
+  QSER_WMS_TL_CAUSCODNO_PAGRESPONSE                   = 0x20, 
+  QSER_WMS_TL_CAUSCODDEST_BUSY                          = 0x21, 
+  QSER_WMS_TL_CAUSCODNO_ACK                             = 0x22, 
+  QSER_WMS_TL_CAUSCODDEST_RESOURCSHORTAGE             = 0x23, 
+  QSER_WMS_TL_CAUSCODSMS_DELIVERY_POSTPONED             = 0x24, 
+  QSER_WMS_TL_CAUSCODDEST_OUT_OF_SERV                   = 0x25, 
+  QSER_WMS_TL_CAUSCODDEST_NOT_AT_ADDR                   = 0x26, 
+  QSER_WMS_TL_CAUSCODDEST_OTHER                         = 0x27, 
+  QSER_WMS_TL_CAUSCODRADIO_IF_RESOURCSHORTAGE         = 0x40, 
+  QSER_WMS_TL_CAUSCODRADIO_IF_INCOMPATABILITY           = 0x41, 
+  QSER_WMS_TL_CAUSCODRADIO_IF_OTHER                     = 0x42, 
+  QSER_WMS_TL_CAUSCODENCODING                           = 0x60, 
+  QSER_WMS_TL_CAUSCODSMS_ORIG_DENIED                    = 0x61, 
+  QSER_WMS_TL_CAUSCODSMS_TERM_DENIED                    = 0x62, 
+  QSER_WMS_TL_CAUSCODSUPP_SERV_NOT_SUPP                 = 0x63, 
+  QSER_WMS_TL_CAUSCODSMS_NOT_SUPP                       = 0x64, 
+  QSER_WMS_TL_CAUSCODMISSING_EXPECTED_PARAM             = 0x65, 
+  QSER_WMS_TL_CAUSCODMISSING_MAND_PARAM                 = 0x66, 
+  QSER_WMS_TL_CAUSCODUNRECOGNIZED_PARAM_VAL             = 0x67, 
+  QSER_WMS_TL_CAUSCODUNEXPECTED_PARAM_VAL               = 0x68, 
+  QSER_WMS_TL_CAUSCODUSER_DATA_SIZERR                 = 0x69, 
+  QSER_WMS_TL_CAUSCODGENERAL_OTHER                      = 0x6A, 
+}QSER_WMS_TL_CAUSCODTYPE;
+
+
+
+typedef struct
+ {
+  uint16_t                              messagid;            /*  Message ID */
+  uint8_t                               causcodvalid;      /**< Must be set to true if causcode is being passed */
+  QSER_WMS_TL_CAUSCODTYPE           causcode;  
+}QSER_wms_raw_send_resp_t;
+
+typedef struct 
+ {
+  char service_center_addr[QSER_SMS_MAX_ADDR_LENGTH + 1];         /**<   Address of the service center.*/
+  uint8_t service_center_addr_typvalid;
+  char service_center_addr_type[QSER_SMS_MAX_SCA_TYPLENGTH + 1];    /**<   129 if the SMSC address does not start with a "+" characte;
+                                                                           145 if the SMSC address starts with a "+" character*/
+}QSER_sms_service_center_cfg_t;
+
+typedef QSER_sms_info_t       QSER_SMS_Msg_t; 
+typedef QSER_sms_info_t*      QSER_SMS_MsgRef; 
+
+/* Callback function registered to qser_sms_addrxmsghandler, msgRef contains the detail msg infor */
+typedef void (*QSER_SMS_RxMsgHandlerFunc_t)(QSER_SMS_MsgRef msgRef, void* contextPtr);
+
+/* Init SMS module and return h_sms, this should be called before any othe ones */
+int qser_sms_client_init(sms_client_handle_type  *ph_sms);
+
+/* Add callback function, if any new msg arrived, it will notify app */
+int qser_sms_addrxmsghandler(QSER_SMS_RxMsgHandlerFunc_t handlerPtr, void* contextPtr);
+
+/* Send sms, you just need to fill format/src_addr/sms_data_len/sms_data,
+   if format is UCS2, the data should be Unicode-BE format.
+*/
+int qser_sms_send_sms(sms_client_handle_type h_sms, QSER_sms_info_t *pt_sms_info);
+
+/* DeInit SMS module and release resource, this should be called in the last one. */
+int qser_sms_client_deinit(sms_client_handle_type h_sms);
+     
+/* Delete the SMS specified in the  pt_sms_storage */
+int qser_sms_deletefromstorage(sms_client_handle_type  h_sms, QSER_sms_storage_info_t  *pt_sms_storage);
+
+/* Send sms PDU.
+*/
+int qser_sms_send_smspdu( sms_client_handle_type     h_sms,
+                         QSER_wms_send_raw_message_data_t *raw_messagdata,
+                         QSER_wms_raw_send_resp_t *rawresp);
+
+
+/* Get sms center address.
+*/
+int qser_sms_getsmscenteraddress( sms_client_handle_type     h_sms,
+                       QSER_sms_service_center_cfg_t *set_sca_cfg);
+
+/* Set sms center address.
+*/
+int qser_sms_setsmscenteraddress( sms_client_handle_type     h_sms,
+                       QSER_sms_service_center_cfg_t *get_sca_cfg);
+
+/*
+Usage 1 (register callback and wait for new sms arrive): 
+1, qser_sms_client_init
+2, qser_sms_addrxmsghandler(pf_cb)
+3, wait for sms arrive, pf_cb will pass the detail sms info to app.
+4, qser_sms_client_deinit
+
+
+Usage 2 (Send sms): 
+1, qser_sms_client_init
+2, qser_sms_addrxmsghandler(pf_cb)
+3, qser_sms_send_sms
+4, qser_sms_client_deinit
+
+
+Usage 3 (store sms): 
+1, qser_sms_client_init
+2, qser_sms_addrxmsghandler(pf_cb)
+3, qser_sms_setroutelist (Notice: class-0 not allowed to store, class-2 must be stored to UIM)
+4, pf_cb will be called when new sms arrived, and tell you where the sms stored
+5, you can call qser_sms_deletefromstorage to delete specified sms, the location can be got from pf_cb.
+6, qser_sms_client_deinit
+*/
+    
+#ifdef __cplusplus
+}
+#endif
+#endif
\ No newline at end of file
diff --git a/mbtk/include/lynq/lynq_qser_thermal.h b/mbtk/include/lynq/lynq_qser_thermal.h
new file mode 100755
index 0000000..d776dde
--- /dev/null
+++ b/mbtk/include/lynq/lynq_qser_thermal.h
@@ -0,0 +1,12 @@
+#ifndef _LYNQ_QSER_THERMAL_H_

+#define _LYNQ_QSER_THERMAL_H_

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define MAX_SIZE 100

+int get_thermal_zone(int *numbers, int size);

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/mbtk/include/lynq/lynq_sim.h b/mbtk/include/lynq/lynq_sim.h
new file mode 100755
index 0000000..8f2849a
--- /dev/null
+++ b/mbtk/include/lynq/lynq_sim.h
@@ -0,0 +1,98 @@
+/*=============================================================================
+#     FileName: lynq_sim.h
+#     Desc: about SIMAPI
+#     Author: lei
+#     Version: V2.0
+#     LastChange: 2023-03-13
+#     History:
+# If you need to use any API under lynq_sim, you must first call the lynq_sim_init() function to initialize these functions.
+=============================================================================*/
+#ifndef __LYNQ_SIM__
+#define __LYNQ_SIM__
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "mbtk_type.h"
+
+int lynq_get_sim_status(int *card_status);
+int lynq_get_imsi(char buf[]);
+int lynq_sim_init(int utoken);
+int lynq_sim_deinit(void);
+int lynq_enable_pin(char pin[]);
+int lynq_disable_pin(char pin[]);
+int lynq_get_iccid(char buf[]);
+int lynq_query_pin_lock(char *pin,int buf[]);
+int lynq_verify_pin(char *pin);
+int lynq_change_pin(char *old_pin, char *new_pin);
+int lynq_unlock_pin(char *puk, char *pin);
+int lynq_query_phone_number(char buf[]);
+int lynq_switch_card(int slot);
+int lynq_screen(int num);
+int lynq_get_imei(char buf[]);
+int lynq_get_imei_and_sv(char imei[],char sv[]);
+
+/**
+ * @brief                   Request SIM I/O operation.
+ *                          This is similar to the TS 27.007 "restricted SIM" operation
+ *                          where it assumes all of the EF selection will be done by the callee.
+ * @param  list             type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
+ *                          type: [IN] list[1]:EF id(fileid)
+ *                          type: [IN] list[2]:offset(p1)
+ *                          type: [IN] list[3]:offset(p2)
+ *                          type: [IN] list[4]:response len,sometimes needn't care(p3)
+ * @param  path             type: [IN] "pathid" from TS 27.007 +CRSM command.
+                            type: [IN] Path is in hex asciii format eg "7f205f70"
+                            type: [IN] Path must always be provided.
+ * @param  data             type: [IN] May be NULL
+ * @param  pin2             type: [IN] May be NULL
+ * @param  aidPtr           type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
+ * @param  sw               type: [OUT]
+ * @param  simResponse      type: [OUT] response
+ * @return int
+ */
+int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse);
+
+/**
+ * @brief
+ * @param  options         type: [IN] [options] define whether you want to halt, power-off, or reboot the machine.May be NULL
+ * @param  time            type: [IN] [time] specifies when you want the shutdown to perform.May be NULL
+ * @param  message         type: [IN] [message] adds a message that announces the shutdown.May be NULL
+ * @return int
+ */
+int lynq_shutdown(char options[], char time[], char message[]);
+
+/**
+ * @brief                   get currnet version of mobiletek
+ * @param  buf              type: [out] My Param doc
+ * @return int
+ */
+int lynq_get_version(char buf[]);
+
+/**
+ * @brief sim power on/off
+ *
+ */
+#ifdef MOBILETEK_TARGET_PLATFORM_T106
+int lynq_reset_sim(void);
+#else
+int lynq_sim_power(int mode);
+#endif
+/**
+ * @brief reset modem
+ *
+ */
+int lynq_reset_modem(void);
+
+/**
+ * @brief factory test to both radio on/off
+ *
+ */
+int lynq_factory_radio_state(int num);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mbtk/include/lynq/lynq_sms.h b/mbtk/include/lynq/lynq_sms.h
new file mode 100755
index 0000000..278278a
--- /dev/null
+++ b/mbtk/include/lynq/lynq_sms.h
@@ -0,0 +1,36 @@
+#ifndef LYNQ_SMS_H

+#define LYNQ_SMS_H 1

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#define MIN_MSM_PARAM_NUM 4

+#define MIN_IMS_MSM_PARAM_NUM 6

+#define MIN_WRITE_MSM_PARAM_NUM 5

+#define MSG_MAX_LEN 1024

+#define TELEPHONE_NUM_LEN 64

+#define STORAGE_SMS_MAX_SIZE 128

+#define SMSC_MAX_LEN 22

+#define SMS_NUM_MAX 255

+

+typedef enum

+{

+    SMS_ERR = -1,

+    SMS_OK = 0,

+    SMS_KNONW = 1,

+    SMS_UNKNONW = 2

+}status_SMS;

+

+int lynq_sms_init(int uToken);

+int lynq_sms_deinit(void);

+int lynq_send_sms(char telephony_num[TELEPHONE_NUM_LEN], int charset, char *msg, int msglen);

+int lynq_read_sms(int index,int *status,int *charset,char smsc[SMSC_MAX_LEN],int *smscLen,int *smslen,char message[MSG_MAX_LEN],char teleNum[TELEPHONE_NUM_LEN],int *numLen,int *current,int *total);

+int lynq_get_smsc_address(char service_num[SMSC_MAX_LEN]);

+int lynq_set_smsc_address(const char* service_num);

+int lynq_list_sms(char index_list[SMS_NUM_MAX]);

+int lynq_delete_sms(int index);

+int lynq_wait_receive_new_sms(int *handle);

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/mbtk/include/lynq/lynq_systime.h b/mbtk/include/lynq/lynq_systime.h
new file mode 100755
index 0000000..a9d54d9
--- /dev/null
+++ b/mbtk/include/lynq/lynq_systime.h
@@ -0,0 +1,125 @@
+/**@file lynq-systime.h

+ *

+ * @brief Sync systime form each time source.

+ *

+ * @author sj.zhang

+ *

+ * @date 2023-08-14

+ *

+ * @version V1.0

+ *

+ * @copyright Copyright (c) MobileTek

+ */

+#include <stdio.h>

+#include <string.h>

+#include <stdlib.h>

+#include <time.h>

+#include "lynq_uci.h"

+

+#ifndef _LYNQ_SYSTIME_H_

+#define _LYNQ_SYSTIME_H_

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+typedef struct time_source_status

+{

+    int ntp;

+    int nitz;

+    int gnss;

+}time_src_status_s;

+

+#ifdef MOBILETEK_TARGET_PLATFORM_T106

+

+    /**@brief Set the rtc time to the system time.

+     *

+     * @param void

+     *

+     * @return

+     *      0:success

+     *      other:failure

+     */

+    int lynq_sync_time_from_rtc(void);

+

+    /**@brief Set the system time to the rtc time.

+     *

+     * @param void

+     *

+     * @return

+     *      0:success

+     *      other:failure

+     */

+    int lynq_set_rtc_time(void);

+

+    /**@brief Query the rtc time.

+     *

+     * @param [OUT] ulsec: rtc time, secconds from 1900.1.1 00:00

+     *

+     * @return

+     *      0:success

+     *      other:failure

+     */

+    int lynq_get_rtc_time(unsigned long *ulsec);

+#endif

+

+    /**@brief Query the time source status now.

+     *

+     * @param [OUT] ntp, nitz, gnss:

+     *        0: disable

+     *        1: enable

+     *

+     * @return

+     *      0 : success

+     *      other:failure

+     */

+    int lynq_get_time_src_status(time_src_status_s *time_src);

+

+    /**@brief Turn sntp on/off

+     *

+     * @param enable [IN] : 0  disenable; 1 enable;

+     *

+     * @return

+     *    0 set success

+     *    1 SNTP_DISENABLE

+     *    2 SNTP_ALREADY_ENABLE

+     */

+    int ntp_sync_time(int enable);

+

+    /**@brief Enable/Disenable sync time from NITZ.

+     *

+     * @param enable [IN] : 0  disenable; 1 enable;

+     *

+     * @return

+     *      0:success

+     *      other:failure

+     */

+    int modem_time_enable(int enable);

+

+    /**@brief Enable/Disenable sync time from GNSS.

+     *

+     * @param enable [IN] : 0  disenable; 1 enable;

+     *

+     * @return

+     *      0:success

+     *      other:failure

+     */

+    int gnss_time_enable(int enable);

+

+    /**@brief User set systime manually.

+     *

+     * @param enable [IN] : 0  disenable; 1 enable;

+     *

+     * @return

+     *      0:success

+     *      other:failure

+     */

+    int user_set_time(char *date, char *time);

+

+    int get_sync_time_result(void );

+

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/mbtk/include/lynq/lynq_uci.h b/mbtk/include/lynq/lynq_uci.h
new file mode 100755
index 0000000..0a08c31
--- /dev/null
+++ b/mbtk/include/lynq/lynq_uci.h
@@ -0,0 +1,38 @@
+#ifndef _LYNQ_UCI_H_

+#define _LYNQ_UCI_H_

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#include <uci.h>

+

+#define LYNQ_UCI_MAX_LEN  128

+#define LYNQ_UCI_SUCCESS 0

+#define LYNQ_UCI_ERROR 1

+#define LYNQ_UCI_FILE "lynq_uci"

+#define LYNQ_UCI_RO_FILE "lynq_uci_ro"

+

+//static struct uci_context * ctx = NULL;

+

+int lynq_del(char *option);

+#if UCI_SUPPORT

+    static int uci_get_value(struct uci_option *o, char *out_buf);

+#endif //uci_support

+int lynq_uci_get(const char *arg, char *out_buf);

+

+int lynq_uci_set(const char *arg);

+

+int lynq_add_section(char *section_type, char *section);

+

+int lynq_set_value(char *section, char *key, char *value);

+

+int lynq_get_value(char *file, char *section, char *key, char *tmp);

+

+

+int lynq_load_config(char *filename);

+

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/mbtk/include/lynq/lynq_wifi.h b/mbtk/include/lynq/lynq_wifi.h
new file mode 100755
index 0000000..babf0c3
--- /dev/null
+++ b/mbtk/include/lynq/lynq_wifi.h
@@ -0,0 +1,312 @@
+/*******************************************************
+* 
+* @brief: Add wifi api
+* @details:  add liblynq-qser-wifi api
+* @author:   wz.wang
+* @date:     2024.3.15
+* @version:  V1.0
+* @copyright:Copyright (c) MobileTek
+*
+*********************************************/
+/*
+#ifndef LYNQ_QSER_WIFI
+#define LYNQ_QSER_WIFI
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+*/
+
+typedef enum {
+	LYNQ_ERROR = -1,
+	LYNQ_ERR_SUCCESS = 0,
+	LYNQ_ERR_FAIL,
+	LYNQ_ERR_NO_MEMORY,
+	LYNQ_ERR_BADPARAM,
+	LYNQ_ERR_NOT_SUPPORT,
+	LYNQ_ERR_NOT_READY,
+	LYNQ_ERR_NO_DEVICE,
+	LYNQ_ERR_NO_MAC,
+	LYNQ_ERR_IPC,
+	LYNQ_ERR_SOC,
+	LYNQ_ERR_CONDITION,
+	LYNQ_ERR_BUSY,
+	LYNQ_ERR_FIRMWARE_CRASH
+} lynq_wifi_err_code;
+
+
+typedef enum {
+	LYNQ_WIFI_AP_INDEX_AP0 = 0,       /* Index 0 of AP/AP-STA/AP-AP Mode */
+	LYNQ_WIFI_AP_INDEX_AP1            /* Index 1 of AP/AP-STA/AP-AP Mode */
+} lynq_wifi_ap_index_e;
+
+typedef enum
+{
+	LYNQ_WIFI_MODE_MIN = -1,
+	LYNQ_WIFI_MODE_80211B = 0,
+	LYNQ_WIFI_MODE_80211BG,
+	LYNQ_WIFI_MODE_80211BGN,
+	LYNQ_WIFI_MODE_80211A,
+	LYNQ_WIFI_MODE_80211AN,
+	LYNQ_WIFI_MODE_80211AC,
+	LYNQ_WIFI_MODE_80211BGNAX_2G,
+	LYNQ_WIFI_AP_MODE_MAX
+} lynq_wifi_mode_type_e;
+
+typedef enum LYNQ_WIFI_BANDWIDTH_ENUM
+{
+	LYNQ_WIFI_BANDWIDTH_MIN = -1,
+	LYNQ_WIFI_BANDWIDTH_HT20 = 0,
+	LYNQ_WIFI_BANDWIDTH_HT40,
+	LYNQ_WIFI_BANDWIDTH_HT80,
+	LYNQ_WIFI_BANDWIDTH_MAX
+} lynq_wifi_bandwidth_type_e;
+
+typedef enum
+{ 
+	LYNQ_WIFI_AUTH_MIN = -1,
+	LYNQ_WIFI_AUTH_OPEN = 0,
+	LYNQ_WIFI_AUTH_WPA_PSK,
+	LYNQ_WIFI_AUTH_WPA2_PSK, //AES
+	LYNQ_WIFI_AUTH_WPA_WPA2_PSK_BOTH, //TKIP & AES
+	LYNQ_WIFI_AUTH_WPA3_PSK, //AES
+	LYNQ_WIFI_AUTH_WPA2_WPA3_PSK_BOTH, //AES
+	LYNQ_WIFI_AUTH_MAX
+} lynq_wifi_auth_e;
+
+typedef enum
+{ 
+	LYNQ_WIFI_WORK_MODE_AP0 ,
+	LYNQ_WIFI_WORK_MODE_AP1
+	
+} lynq_wifi_work_mode_e;
+
+typedef enum {
+LYNQ_WIFI_EVENT_ENABLE_STATUS = 0, //打开 AP 的回调和 STA 模式连接状态的回调
+LYNQ_WIFI_EVENT_DISABLE_STATUS, //关闭 AP 的回调和 STA 模式连接状态的回调
+LYNQ_WIFI_EVENT_AP_STATION, //输入未使用
+LYNQ_WIFI_EVENT_AP_STA_STATUS, //输入未使用
+LYNQ_WIFI_EVENT_STA_STATUS, //输入未使用
+} lynq_wifi_event_type_e;
+
+typedef enum {
+LYNQ_WIFI_AP_STATUS_NONE = 0, //初始状态
+LYNQ_WIFI_AP_STATUS_IDLE, //打印两次,表示 AP 已关闭
+LYNQ_WIFI_AP_STATUS_ENABLING, //AP 正在开启中
+LYNQ_WIFI_AP_STATUS_ENABLED, //AP 已开启
+LYNQ_WIFI_AP_STATUS_DISABLING, //已移除
+LYNQ_WIFI_AP_STATUS_ERROR //操作异常
+} lynq_wifi_status_e;
+
+typedef enum
+{
+LYNQ_WIFI_AUTH_WPA_PAIRWISE_MIN = -1,
+LYNQ_WIFI_AUTH_WPA_PAIRWISE_AUTO = 0, //TKIP & AES
+LYNQ_WIFI_AUTH_WPA_PAIRWISE_TKIP, //TKIP
+LYNQ_WIFI_AUTH_WPA_PAIRWISE_AES, //AES
+LYNQ_WIFI_AUTH_WPA_PAIRWISE_MAX
+} lynq_wifi_auth_wpa_psk_e;
+
+typedef enum
+{
+LYNQ_WIFI_STA_STATUS_NONE, //初始状态
+LYNQ_WIFI_STA_STATUS_IDLE, //STA 已关闭
+LYNQ_WIFI_STA_STATUS_CONNECTING, //STA 正在连接热点中
+LYNQ_WIFI_STA_STATUS_ASSOCIATED, //STA 已连上热点,正在分配 IP 中
+LYNQ_WIFI_STA_STATUS_CONNECTED, //STA 已连上热点,完成 IP 分配
+LYNQ_WIFI_STA_STATUS_DISCONNECTED, //STA 已从热点断开
+LYNQ_WIFI_STA_STATUS_ERROR //连接报错
+} lynq_wifi_sta_status_e;
+
+typedef enum
+{
+LYNQ_WIFI_REASON_CODE_NONE, //无特殊原因
+LYNQ_WIFI_REASON_CODE_WRONG_KEY, //热点的密码错误
+LYNQ_WIFI_REASON_CODE_AUTH_FAILED, //与热点认证失败
+LYNQ_WIFI_REASON_CODE_CONN_FAILED, //与热点连接失败
+LYNQ_WIFI_REASON_CODE_SET_FAILED, //热点的认证等设置错误
+LYNQ_WIFI_REASON_CODE_DHCP_FAILED //与热点的 DHCP 失败
+} lynq_wifi_reason_code_e;
+
+typedef enum
+{
+LYNQ_WIFI_MAC_ACL_RULE_NONE, 
+LYNQ_WIFI_MAC_ACL_RULE_WHITE_LIST,
+LYNQ_WIFI_MAC_ACL_RULE_BLACK_LIST
+} lynq_wifi_mac_acl_rule_e;
+
+typedef struct
+{
+char addr[16]; //连接的 sta 设备 IPv4 的地址
+char macaddr[18]; //连接的 sta 设备 MAC 的地址
+char name[20]; //连接的 sta 设备名称
+char ifname[18]; //对应 AP 核的 wlan 设备
+int uptime; //sta 设备连接的时间,单位:秒
+} lynq_lanhost_t;
+
+
+typedef struct
+{
+ int array_len; //打印连接设备的个数
+ lynq_lanhost_t array[32]; //具体的 sta 信息,参考 lynq_lanhost_t 结构体
+} lynq_lanhost_ts;
+
+typedef struct
+{
+lynq_wifi_auth_e auth; //安全模式。
+lynq_wifi_auth_wpa_psk_e pairwise; //加密方式。
+char passwd[64+1]; //密码
+int group_rekey; //组密钥重新协商间隔。
+}lynq_wifi_ap_auth_t;
+
+
+
+
+
+typedef struct
+{
+char bssid[18];//接入点的 mac
+char essid[33]; //接入点的 SSID
+int signal; //信号强度(dbm)
+unsigned char signal_level; //接入点的信号格(0-4)
+int frequency; //工作频点(Hz)
+unsigned char channel; //接入点的信道
+lynq_wifi_auth_e auth; //接入点的认证信息,参考 lynq_wifi_auth_e 结构体说明
+lynq_wifi_auth_wpa_psk_e cipher; //接入点的加密类型,参考lynq_wifi_auth_wpa_psk_e结构体说明
+}lynq_wifi_sta_scan_info_t;
+
+
+typedef struct
+{
+char ssid[33];
+lynq_wifi_auth_e auth; //安全模式,参考表后说明
+lynq_wifi_auth_wpa_psk_e pairwise; //加密方式
+char passwd[64 + 1]; //密码
+} lynq_wifi_sta_param_t;
+
+typedef struct
+{
+char addr[16]; //IPv4 地址
+char netmask[16]; //子网掩码
+unsigned char subnet_bits; //子网掩码的位数,比如 255.255.255.0 是 24
+char gateway[16]; //网关
+char dnsp[16]; //主要的 DNS
+char dnss[16]; //次要的 DNS
+} lynq_wifi_net_addr_t;
+
+typedef struct
+{
+char addr[48]; //IPv6 地址
+char prefix[48]; //IPv6 子网掩码
+unsigned char prefix_bits; //IPv6 子网掩码的位数
+char gateway[48]; //IPv6 网关
+char dnsp[48]; //IPv6 主要的 DNS
+char dnss[48]; //IPv6 次要的 DNS
+} lynq_wifi_net_addr6_t;    
+
+
+typedef struct
+{
+//lynq_wifi_station_status_e sta_status; //用于兼容回调 STA 模式的状态获取,API 获取时不被赋值
+lynq_wifi_sta_status_e status; //sta 的几种状态,参考表后
+char ifname[32]; //作为 sta 设备时名字
+char ap_bssid[18]; //连接的热点 MAC 地址
+//int rssi;
+unsigned char signal_level; //信号格,目前暂未支持
+unsigned char has_addr; //判断是否是 IPv4 地址
+lynq_wifi_net_addr_t addr[48]; // 需 先 判 断has_addr 是否为 1,具体参考 lynq_wifi_net_addr_t 结构体说明。
+unsigned char has_addr6; //判断是否是 IPv6 地址
+lynq_wifi_net_addr6_t addr6; // 需 先 判 断has_addr6 是否为 1,具体参考 lynq_wifi_net_addr6_t结构体说明
+lynq_wifi_reason_code_e reason_code; //错误原因,参考表后
+} lynq_wifi_sta_status_t;
+
+
+typedef struct {
+unsigned long long rx_packets; //对应 ifconfig wlan0-vxd 的 RX packets
+unsigned long long rx_bytes; //对应 ifconfig wlan0-vxd 的 RX bytes
+unsigned long long rx_errors; //对应 ifconfig wlan0-vxd 的 RX errors
+unsigned long long rx_dropped; //对应 ifconfig wlan0-vxd 的 RX dropped
+unsigned long long tx_packets; //对应 ifconfig wlan0-vxd 的 TX packets
+unsigned long long tx_bytes; //对应 ifconfig wlan0-vxd 的 TX bytes
+unsigned long long tx_errors; //对应 ifconfig wlan0-vxd 的 TX errors
+unsigned long long tx_dropped; //对应 ifconfig wlan0-vxd 的 TX dropped
+} lynq_wifi_pkt_stats_t;
+
+
+typedef struct {
+    int cnt; //搜索到的热点总数
+    lynq_wifi_sta_scan_info_t info[50]; //存储的热点信息
+} lynq_wifi_sta_scan_list_t;
+
+
+typedef struct {
+    lynq_wifi_event_type_e id;//事件说明。参考表后结构体说明
+    lynq_wifi_status_e status; //需要id为LYNQ_WIFI_EVENT_AP_STATION时,参考表后结构体说明
+    //lynq_wifi_station_status_e sta_status; //需要id为LYNQ_WIFI_EVENT_STA_STATUS时,STA模式下连接和断开的热点的值
+    lynq_wifi_sta_status_t sta_status_all;//需要id为LYNQ_WIFI_EVENT_STA_STATUS时获取具体的值
+} lynq_wifi_event_s;
+
+typedef struct
+{
+    lynq_wifi_status_e status; //AP状态,详细参考表后
+    char ifname[32]; //网口名
+    char bssid[18]; //AP的bssid
+}lynq_wifi_ap_status_t;
+
+
+
+
+typedef void (*lynq_wifi_event_handle)(lynq_wifi_event_s *event, void *arg);
+typedef void (*lynq_wifi_event_handle_sta)(lynq_wifi_sta_scan_list_t *event);
+
+
+
+int qser_wifi_enable(void);
+int qser_wifi_disable(void);
+int qser_wifi_work_mode_set(lynq_wifi_work_mode_e type);
+int qser_wifi_work_mode_get(lynq_wifi_work_mode_e *type);
+int qser_wifi_ap_ssid_set(lynq_wifi_ap_index_e idx, const char *ssid);
+int qser_wifi_ap_ssid_get(lynq_wifi_ap_index_e idx, char *ssid);
+int qser_wifi_ap_ssid_hide_set(lynq_wifi_ap_index_e idx,bool hide);
+int qser_wifi_ap_ssid_hide_get(lynq_wifi_ap_index_e idx,bool* hide);
+int qser_wifi_ap_mode_set(lynq_wifi_ap_index_e idx, lynq_wifi_mode_type_e mode);
+int qser_wifi_ap_mode_get(lynq_wifi_ap_index_e idx, lynq_wifi_mode_type_e* mode);
+int qser_wifi_ap_bandwidth_set(lynq_wifi_ap_index_e idx, lynq_wifi_bandwidth_type_e bandwidth);
+int qser_wifi_ap_bandwidth_get(lynq_wifi_ap_index_e idx, lynq_wifi_bandwidth_type_e *bandwidth);
+int qser_wifi_ap_channel_set(lynq_wifi_ap_index_e idx,const char* country_code, int channel);
+int qser_wifi_ap_channel_get(lynq_wifi_ap_index_e idx,char* country_code, int* channel);
+int qser_wifi_ap_auth_set(lynq_wifi_ap_index_e idx, lynq_wifi_auth_e auth_mode, const char * auth_passwd);
+int qser_wifi_ap_auth_get(lynq_wifi_ap_index_e idx, lynq_wifi_auth_e *auth_mode, char * auth_passwd);
+int qser_wifi_ap_auth_get_s(lynq_wifi_ap_index_e idx, lynq_wifi_ap_auth_t* auth_mode);
+int qser_wifi_ap_max_sta_set(lynq_wifi_ap_index_e idx, int max_sta_num);
+int qser_wifi_ap_max_sta_get(lynq_wifi_ap_index_e idx, int* max_sta_num);
+int qser_wifi_ap_start(lynq_wifi_ap_index_e idx);
+int qser_wifi_ap_stop(lynq_wifi_ap_index_e idx);
+int qser_wifi_ap_restart(lynq_wifi_ap_index_e idx);
+
+
+int qser_wifi_sta_param_set(lynq_wifi_sta_param_t *param_stat);
+int qser_wifi_sta_param_get(lynq_wifi_sta_param_t *param_stat);
+int qser_wifi_sta_start(void);
+int qser_wifi_sta_stop(void);
+int qser_wifi_sta_get_status(lynq_wifi_sta_status_t *status_stat);
+int qser_wifi_register_handle(lynq_wifi_event_handle event_handle, lynq_wifi_event_handle_sta event_handle_sta, void *arg);
+int qser_wifi_sta_start_scan(void);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mbtk/include/mbtk/ds_ASBuffer.h b/mbtk/include/mbtk/ds_ASBuffer.h
new file mode 100755
index 0000000..492b436
--- /dev/null
+++ b/mbtk/include/mbtk/ds_ASBuffer.h
@@ -0,0 +1,268 @@
+/*==============================================================================

+

+                              ds_ASBuffer.h

+

+GENERAL DESCRIPTION

+  A buffer class with utility functions for parsing raw bytes.

+

+EXTERNALIZED FUNCTIONS

+

+INITIALIZATION AND SEQUENCING REQUIREMENTS

+

+  Copyright (c) 2014 by Qualcomm Technologies Incorporated. All Rights Reserved.

+==============================================================================*/

+

+/*==============================================================================

+                           EDIT HISTORY FOR MODULE

+

+This section contains comments describing changes made to the module.

+Notice that changes are listed in reverse chronological order.

+

+when        who    what, where, why

+--------    ---    ----------------------------------------------------------

+04/21/14    ml     Created file/Initial version.

+==============================================================================*/

+

+#ifndef __DS_AS_BUFFER_H__

+#define __DS_AS_BUFFER_H__

+

+//#include "comdef.h"

+#include "mbtk_type.h"

+class ASString;

+

+

+/*==============================================================================

+CLASS ASBuffer

+

+DESCRIPTION

+  A buffer class with utility functions for parsing raw bytes.

+==============================================================================*/

+class ASBuffer

+{

+public:

+  /*===========================================================================

+  FUNCTION ASBuffer CONSTRUCTOR

+

+  DESCRIPTION

+    Creates a new ASBuffer.

+

+  DEPENDENCIES

+    capacity - The initial buffer capacity to set.

+

+  SIDE EFFECTS

+    None

+  ===========================================================================*/

+  ASBuffer();

+  ASBuffer(uint32 capacity);

+

+  ASBuffer(ASBuffer &buf);

+  ASBuffer(const ASBuffer &buf);

+  ASBuffer(const uint8* buf, uint32 capacity);

+

+  ~ASBuffer();

+

+

+  ASBuffer& operator=(const ASBuffer &rhs);

+

+  /*============================================================================

+  FUNCTION ASBuffer::content

+

+  DESCRIPTION

+    Returns a pointer to the buffer content

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  const uint8* content() const;

+

+

+

+  /*============================================================================

+  FUNCTION ASBuffer::non_const_content

+

+  DESCRIPTION

+    Returns a pointer to the buffer content. Use this function ONLY if you need

+    a non-const version and it is guaranteed that the returned pointer will

+    never be modified.

+

+    Note: Workaround function for MD5 auth-int. Otherwise shouldn't be used.

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  uint8* non_const_content();

+

+

+

+  /*============================================================================

+  FUNCTION ASBuffer::c_str

+

+  DESCRIPTION

+    Returns a pointer to the buffer content. This assumes the buffer content is

+    in c-string format

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  const char* c_str() const;

+

+

+

+  /*============================================================================

+  FUNCTION ASBuffer::size

+

+  DESCRIPTION

+    Returns the size of the buffer

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  uint32 size() const;

+

+

+

+  /*============================================================================

+  FUNCTION ASBuffer::empty

+

+  DESCRIPTION

+    Returns true if the buffer is empty

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  bool empty() const;

+

+

+

+  /*============================================================================

+  FUNCTION ASBuffer::error

+

+  DESCRIPTION

+    Returns true if the buffer is in error status due to internal memory

+    allocation failure.

+

+    This can happen when

+      - Constructor fails to allocate memory for the new buffer

+      - Append requires to resize the buffer but fails

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  bool error() const;

+

+

+

+  /*============================================================================

+  FUNCTION ASBuffer::append

+

+  DESCRIPTION

+    Appends the given data to the buffer. Returns true if append is successful,

+    false if append fails.

+

+  PARAMETERS

+    [In] append_buffer - The data to append

+    [In] size          - The number of bytes to append

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  bool append(const uint8* append_buffer, const uint32 size);

+  bool append(const char append_buffer);

+  bool append(const char* append_buffer);

+  bool append(const char* append_buffer, const uint32 size);

+  bool append(const ASBuffer& append_buffer);

+  bool append(const ASString& append_buffer); // temp

+

+

+  /*============================================================================

+  FUNCTION ASBuffer::clear

+

+  DESCRIPTION

+    Returns true if the buffer is in error status due to internal memory

+    allocation failure.

+

+    This can happen when

+      - Constructor fails to allocate memory for the new buffer

+      - Append requires to resize the buffer but fails

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  void clear();

+

+

+

+private:

+  /*============================================================================

+  FUNCTION ASBuffer::init

+

+  DESCRIPTION

+    Initialize buffer

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  void init();

+  bool increment_buffer_capacity(const uint32 req_size);

+

+

+  uint8* buffer; // Buffer object. Memory dynamically allocated as necessary

+  uint32 buffer_size;

+  uint32 buffer_capacity;

+  bool   error_status; // true if error, else false

+};

+

+

+

+#endif /* __DS_AS_BUFFER_H__ */

diff --git a/mbtk/include/mbtk/ds_ASString.h b/mbtk/include/mbtk/ds_ASString.h
new file mode 100755
index 0000000..02319ca
--- /dev/null
+++ b/mbtk/include/mbtk/ds_ASString.h
@@ -0,0 +1,265 @@
+/*==============================================================================

+

+                              ds_ASString.h

+

+GENERAL DESCRIPTION

+  A string class with utility functions for parsing AS.

+

+EXTERNALIZED FUNCTIONS

+

+INITIALIZATION AND SEQUENCING REQUIREMENTS

+

+  Copyright (c) 2014 by Qualcomm Technologies Incorporated. All Rights Reserved.

+==============================================================================*/

+

+/*==============================================================================

+                           EDIT HISTORY FOR MODULE

+

+This section contains comments describing changes made to the module.

+Notice that changes are listed in reverse chronological order.

+

+when        who    what, where, why

+--------    ---    ----------------------------------------------------------

+04/21/14    ml     Created file/Initial version.

+==============================================================================*/

+#ifndef DS_AS_STRING_H

+#define DS_AS_STRING_H

+

+//#include "comdef.h"

+#include "mbtk_type.h"

+

+/*==============================================================================

+CLASS ASString

+

+DESCRIPTION

+  A string class with utility functions for parsing AS.

+==============================================================================*/

+class ASString

+{

+public:

+  /*===========================================================================

+  FUNCTION ASString CONSTRUCTOR

+

+  DESCRIPTION

+    Creates a new ASString. Default constructor will create an empty string.

+    The other constructors will make a copy of the given string.

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ===========================================================================*/

+  ASString();

+  ASString(const char* src);

+  ASString(const char* src, uint32 len);

+

+  // copy constructor

+  ASString(ASString& src);

+  ASString(const ASString& src);

+

+  ~ASString();

+

+

+  ASString& operator=(const ASString& rhs);

+  ASString& operator=(const char* rhs);

+  char      operator[](const int index) const;

+  char&     operator[](const int index);

+

+

+  /*============================================================================

+  FUNCTION ASString::c_str

+

+  DESCRIPTION

+    Returns the raw c-string

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  const char* c_str() const;

+

+  /*============================================================================

+  FUNCTION ASString::size

+  FUNCTION ASString::length

+

+  DESCRIPTION

+    Returns the length of the string

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  uint32 size() const;

+  uint32 length() const;

+

+  /*============================================================================

+  FUNCTION ASString::empty

+

+  DESCRIPTION

+    Returns true if the string is empty or NULL

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  bool empty() const;

+

+  /*============================================================================

+  FUNCTION ASString::remove_trailing_spaces

+

+  DESCRIPTION

+    Removes all whiltespace, including tabs and newlines, at the end of the string.

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  void remove_trailing_spaces();

+

+  /*============================================================================

+  FUNCTION ASString::resolve_xml_escapes

+

+  DESCRIPTION

+    Replaces XML escape strings with the corresponding character.

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  bool resolve_xml_escapes();

+

+  /*============================================================================

+  FUNCTION ASString::to_lower

+

+  DESCRIPTION

+    Converts all characters in the string to lower case.

+

+  PARAMETERS

+    None

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  void to_lower();

+

+  /*============================================================================

+  FUNCTION ASString::limit_cmp

+

+  DESCRIPTION

+    Partial string compare up to len. Returns true if same, else false.

+

+  PARAMETERS

+    [In] cstr - The string to compare

+    [In] len  - The number of characters to compare.

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  bool limit_cmp(const char* cstr, const uint32 len) const;

+

+  /*============================================================================

+  FUNCTION ASString::append

+

+  DESCRIPTION

+    Appends the given string to the string it holds.

+

+  PARAMETERS

+    [In] append_str - The string to append

+    [In] len        - The number of characters to append

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  void append(const char* append_str);

+  void append(const char* append_str, const uint32 len);

+  void append(const ASString& append_str);

+

+protected:

+  /*============================================================================

+  FUNCTION ASString::copy_string

+

+  DESCRIPTION

+    Partial string compare up to len. Returns true if same, else false.

+

+  PARAMETERS

+    [In] src - The string to copy

+    [In] len - The number of characters to copy

+

+  DEPENDENCIES

+    None

+

+  SIDE EFFECTS

+    None

+  ============================================================================*/

+  void copy_string(const char* src, uint32 len);

+

+  char* str; // C-string object. Memory dynamically allocated as necessary

+};

+

+

+

+/*============================================================================

+FUNCTION operator==

+FUNCTION operator!=

+FUNCTION operator<

+FUNCTION operator>

+

+DESCRIPTION

+  Compares the two strings and returns true/false based on the operator. The

+  comparison will be case insensitive.

+

+PARAMETERS

+  [In] lhs - The string to compare

+  [In] rhs - The other string to compare

+

+DEPENDENCIES

+  None

+

+SIDE EFFECTS

+  None

+============================================================================*/

+bool operator== (const ASString& lhs, const ASString& rhs);

+bool operator!= (const ASString& lhs, const ASString& rhs);

+

+bool operator== (const ASString& lhs, const char* rhs);

+bool operator!= (const ASString& lhs, const char* rhs);

+

+bool operator< (const ASString& lhs, const ASString& rhs);

+bool operator> (const ASString& lhs, const ASString& rhs);

+

+#endif /* DS_AS_STRING_H */

diff --git a/mbtk/include/mbtk/mbtk_adc.h b/mbtk/include/mbtk/mbtk_adc.h
new file mode 100755
index 0000000..27cc783
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_adc.h
@@ -0,0 +1,50 @@
+/*
+    MBTK ADC interface define.
+*/
+/******************************************************************************
+
+                   EDIT HISTORY FOR FILE
+
+  WHEN        WHO       WHAT,WHERE,WHY
+--------    --------    -------------------------------------------------------
+2023/4/3      b.liu    Initial version
+
+******************************************************************************/
+#ifndef __MBTK_ADC_H__
+#define __MBTK_ADC_H__
+
+#define ADC_DEVICE_802 "/sys/devices/soc.0/d4000000.apb/pxa2xx-i2c.2/i2c-2/2-0030/pm802-bat/adc"
+#define ADC_DEVICE_803 "/sys/kernel/debug/adc"
+#define ADC_DEVICE_PMIC802 "/sys/devices/platform/asr-adc/pm80x_adc"
+#define ADC_DEVICE_AUX "/sys/devices/platform/asr-adc/aux_adc"
+
+/*
+* MBTK ADC define.
+*/
+typedef enum {
+    MBTK_ADC0 = 0,  /* ADC 0 */
+    MBTK_ADC1,       /* ADC 1 */
+    MBTK_ADC2       /* ADC 2 */
+} mbtk_adc_enum;
+
+
+/*===========================================================================
+FUNCTION mbtk_adc_get
+
+DESCRIPTION:
+  Get ADC's value.
+
+PARAMETERS:
+  adc_dev : Refer to : ADC_DEVICE_802/ADC_DEVICE_803/ADC_DEVICE_PMIC802/ADC_DEVICE_AUX
+  adc [IN]: ADC path, refer to mbtk_adc_enum.
+
+RETURN VALUE:
+  int : ADC value.
+
+===========================================================================*/
+int mbtk_adc_get(const char* adc_dev, mbtk_adc_enum adc);
+int mbtk_adc_close(const char* adc_dev);
+
+
+#endif /* __MBTK_ADC_H__ */
+
diff --git a/mbtk/include/mbtk/mbtk_alarm.h b/mbtk/include/mbtk/mbtk_alarm.h
new file mode 100755
index 0000000..346a0b9
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_alarm.h
@@ -0,0 +1,43 @@
+/*
+* mbtk_alarm.h
+* MBTK alarm API.
+*
+* Author : lb
+* Date   : 2023/11/17 16:20:43
+*/
+#ifndef _MBTK_ALARM_H
+#define _MBTK_ALARM_H
+
+
+/*===========================================================================
+FUNCTION mbtk_wakealarm_set()
+
+DESCRIPTION:
+  Set sleep wake alarm.
+
+PARAMETERS:
+  time_sec [IN]: Sleep wake-up time in second.
+
+RETURN VALUE:
+  int : Return 0 if success, other for failures.
+
+===========================================================================*/
+int mbtk_wakealarm_set(unsigned long time_sec);
+
+/*===========================================================================
+FUNCTION mbtk_poweralarm_set()
+
+DESCRIPTION:
+  Set shutdown alarm clock.
+
+PARAMETERS:
+  time_sec [IN]: Shutdown wake-up time in second.
+
+RETURN VALUE:
+  int : Return 0 if success, other for failures.
+
+===========================================================================*/
+int mbtk_poweralarm_set(unsigned long time_sec);
+
+
+#endif /* _MBTK_ALARM_H */
diff --git a/mbtk/include/mbtk/mbtk_at.h b/mbtk/include/mbtk/mbtk_at.h
new file mode 100755
index 0000000..e73414d
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_at.h
@@ -0,0 +1,64 @@
+/*
+    MBTK AT header file.
+*/
+/******************************************************************************
+
+                          EDIT HISTORY FOR FILE
+
+  WHEN        WHO       WHAT,WHERE,WHY
+--------    --------    -------------------------------------------------------
+2023/4/6      b.liu    Initial version
+
+******************************************************************************/
+#ifndef __MBTK_AT__
+#define __MBTK_AT__
+
+/*===========================================================================
+FUNCTION mbtk_at_init
+
+DESCRIPTION:
+  Initial MBTK AT.
+
+PARAMETERS:
+  None.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_at_init();
+
+
+/*===========================================================================
+FUNCTION mbtk_at_deinit
+
+DESCRIPTION:
+  Deinitial MBTK AT.
+
+PARAMETERS:
+  None.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_at_deinit();
+
+/*===========================================================================
+FUNCTION mbtk_at_send
+
+DESCRIPTION:
+  Send AT command.
+
+PARAMETERS:
+  cmd [IN]: AT command.
+  rsp [OUT]: AT command response.
+  rsp_len[IN] : AT command response buffer size.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_at_send(char* cmd, char* rsp, int rsp_len);
+
+#endif /* __MBTK_AT__ */
diff --git a/mbtk/include/mbtk/mbtk_audio.h b/mbtk/include/mbtk/mbtk_audio.h
new file mode 100755
index 0000000..d20d005
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_audio.h
@@ -0,0 +1,268 @@
+/**
+ *   \file mbtk_audio_alsa.h
+ *   \brief A Documented file.
+ *
+ *  Detailed description
+ *   Audio API definition.
+ *
+ *   \Author:  wangjinshu <js.wang@mobiletek.cn>
+ *   \Version: 1.0.0
+ *   \Date: 2020.04.05
+ */
+
+#ifndef __MBTK_AUDIO_ALSA_H__
+#define __MBTK_AUDIO_ALSA_H__
+#include <pthread.h>
+#include "mbtk_type.h"
+
+typedef void* mbtk_audio_handle;
+typedef void(*mbtk_audio_record_cb_func)(int result, char* databuf, unsigned int len); //callback function get recording data
+typedef int(*mbtk_dtmf_cb)(char result);
+typedef int(*mbtk_volume_cb)(int result);
+typedef uint32 mbtk_audio_client_handle_type;
+
+/*
+* Audio device enum.
+*/
+typedef enum {
+    MBTK_AUTIO_TYPE_OUT = 0, /* Audio play device. */
+    MBTK_AUTIO_TYPE_IN /* Audio record device. */
+} mbtk_audio_dev_enum;
+
+/*
+* Audio running state..
+*/
+typedef enum {
+    AUDIO_NONE = -1,
+    AUDIO_STOP = 0,
+    AUDIO_OPEN = 1,
+    AUDIO_RUNNING = 2,
+    AUDIO_PAUSE = 3,
+    AUDIO_RESUME = 4
+} mbtk_audio_state_enum;
+
+// 0-Tx_CodecGain, 1-Tx_DSPGain, 2-Rx_CodecGain, 3-Rx_DSPGain
+typedef enum {
+    AUDIO_GAIN_TYPE_TX_CODECGAIN = 0,
+    AUDIO_GAIN_TYPE_TX_DSPGAIN,
+    AUDIO_GAIN_TYPE_RX_CODECGAIN,
+    AUDIO_GAIN_TYPE_RX_DSPGAIN
+} mbtk_audio_gain_type_enum;
+
+/****************************************************************************
+*  Audio function
+***************************************************************************/
+/*===========================================================================
+FUNCTION mbtk_audio_open
+
+DESCRIPTION:
+  Initial MBTK audio interface.
+
+PARAMETERS:
+  dev [IN]: Audio device, refer for mbtk_audio_dev_enum.
+  channel [IN]: Audio channel number.
+  rate [IN]: Audio bite rate.
+  usrData [IN]: Additional data, usually specified as NULL.
+
+RETURN VALUE:
+  mbtk_audio_handle : Return audio handle if success, NULL for failure.
+
+===========================================================================*/
+mbtk_audio_handle mbtk_audio_open(mbtk_audio_dev_enum dev, int channels, int rate, void* usrData);
+
+
+/*===========================================================================
+FUNCTION mbtk_audio_play_stream
+
+DESCRIPTION:
+  Play audio stream.
+
+PARAMETERS:
+  dev_hdl [IN]: Audio handle, get by call mbtk_audio_open.
+  pdata [IN]: Audio stream data.
+  len [IN]: Audio stream data length.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_audio_play_stream(mbtk_audio_handle dev_hdl, const void* pdata, int len);
+
+
+/*===========================================================================
+FUNCTION mbtk_audio_play_file
+
+DESCRIPTION:
+  Play audio file.
+
+PARAMETERS:
+  dev_hdl [IN]: Audio handle, get by call mbtk_audio_open.
+  file_fd [IN]: File descriptor to play.
+  offset [IN]: File offset.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_audio_play_file(mbtk_audio_handle dev_hdl, int file_fd, int offset);
+
+/*===========================================================================
+FUNCTION mbtk_audio_record
+
+DESCRIPTION:
+  Start audio record.This function will call cb_func in the new thread to return record data.
+
+PARAMETERS:
+  dev_hdl [IN]: Audio handle, get by call mbtk_audio_open.
+  cb_func [IN]: Audio record callback function.
+  cb_date [IN]: Audio record additional data,usually specified as NULL.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_audio_record(mbtk_audio_handle dev_hdl, mbtk_audio_record_cb_func cb_func, void* cb_date);
+int mbtk_audio_play_waitend(void* hdl);
+
+/*===========================================================================
+FUNCTION mbtk_audio_pause
+
+DESCRIPTION:
+  Audio play pause.
+
+PARAMETERS:
+  dev_hdl [IN]: Audio handle, get by call mbtk_audio_open.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_audio_pause(mbtk_audio_handle dev_hdl);
+
+
+/*===========================================================================
+FUNCTION mbtk_audio_resume
+
+DESCRIPTION:
+  Audio play resume.
+
+PARAMETERS:
+  dev_hdl [IN]: Audio handle, get by call mbtk_audio_open.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_audio_resume(void* dev_hdl);
+int mbtk_audio_prepare(void* dev_hdl);
+/*===========================================================================
+FUNCTION mbtk_audio_state_get
+
+DESCRIPTION:
+  Get audio play state.
+
+PARAMETERS:
+  dev_hdl [IN]: Audio handle, get by call mbtk_audio_open.
+
+RETURN VALUE:
+  mbtk_audio_state_enum : Return audio state,refer to mbtk_audio_state_enum.
+
+===========================================================================*/
+mbtk_audio_state_enum mbtk_audio_state_get(void *hdl);
+
+
+/*===========================================================================
+FUNCTION mbtk_audio_stop
+
+DESCRIPTION:
+  Stop audio play.
+
+PARAMETERS:
+  dev_hdl [IN]: Audio handle, get by call mbtk_audio_open.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_audio_stop(void* dev_hdl);
+
+
+/*===========================================================================
+FUNCTION mbtk_audio_resume
+
+DESCRIPTION:
+  Close audio handle.
+
+PARAMETERS:
+  dev_hdl [IN]: Audio handle, get by call mbtk_audio_open.
+
+RETURN VALUE:
+  int : Return 0 if success,other for failure.
+
+===========================================================================*/
+int mbtk_audio_close(void* dev_hdl);
+
+
+int mbtk_audio_ubus_client_init(mbtk_audio_client_handle_type *ph_dtmf, mbtk_dtmf_cb cb);
+int mbtk_audio_ubus_client_deinit(mbtk_audio_client_handle_type h_dtmf);
+void mbtk_audio_ubus_volume_set(unsigned int volume);
+void mbtk_audio_ubus_volume_get(mbtk_volume_cb cb);
+int mbtk_audio_dsp_set(int type, int gain);
+void mbtk_audio_ubus_gain_set(mbtk_audio_gain_type_enum type, uint16 *gain, int gain_num);
+void mbtk_audio_ubus_reg_set(int reg_addr, int reg_value);
+
+/**
+ * @brief      mbtk_audio_switch_pcm
+ *
+ * @details    Turn on/off MSA PCM
+ *
+ * @param      param
+ *             "param0":UINT32 mode
+ *             0: Turn off MSA PCM
+ *             1: Turn on MSA PCM as NB PCM(i.e. 8KHz sample rate)
+ *             2: Turn on MSA PCM as WB PCM(i.e. 16KHz sample rate)
+ * @return     return type
+ */
+void mbtk_audio_switch_pcm(int mode);
+
+/**
+ * @brief      mbtk_audio_mode_set
+ *
+ * @details    audio_mode_set
+ *
+ * @param      param
+ *             "param0": UINT32
+ *             typedef enum {
+ *                 AUDIO_MODE_INVALID = -2,
+ *                 AUDIO_MODE_CURRENT = -1,
+ *                 AUDIO_MODE_NORMAL = 0,
+ *                 AUDIO_MODE_RINGTONE = 1,
+ *                 AUDIO_MODE_IN_CALL = 2,
+ *                 AUDIO_MODE_IN_COMMUNICATION=3,
+ *                 AUDIO_MODE_IN_VT_CALL= 4,
+ *                 AUDIO_MODE_CNT,
+ *                 AUDIO_MODE_MAX = AUDIO_MODE_CNT-1,
+ *             } audio_mode_
+ * @return     return type
+ */
+void mbtk_audio_mode_set(int mode);
+
+/**
+ * @brief      mbtk_audio_path_enable
+ *
+ * @details    first set the audio_mode_set ,then need set it
+ *
+ * @param      param
+ *             "param0": UINT32
+ *             1: enable
+ *             1: disable
+ * @return     return type
+ */
+void mbtk_audio_path_enable(int mode);
+
+int mbtk_audio_get_status(void* hdl);
+
+
+int mbtk_audio_mp3_to_wav(const char *wavpath, char *mp3path);
+int mbtk_audio_mp3_to_play(char *mp3path, int hdl, int sample_rate);
+#endif /*__MBTK_AUDIO_ALSA_H__*/
diff --git a/mbtk/include/mbtk/mbtk_audio2.h b/mbtk/include/mbtk/mbtk_audio2.h
new file mode 100755
index 0000000..c17efc2
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_audio2.h
@@ -0,0 +1,100 @@
+/*
+* mbtk_audio2.h
+*
+* MBTK audio API for asr1806.
+*
+* Author : lb
+* Date   : 2023/12/20 10:12:15
+*/
+#ifndef _MBTK_AUDIO2_H
+#define _MBTK_AUDIO2_H
+#include "mbtk_type.h"
+
+#define MBTK_PCM_NB_BUF_SIZE 320
+#define MBTK_PCM_WB_BUF_SIZE 640
+
+typedef void (*mbtk_recorder_callback_func)(void *data, uint32 data_len);
+
+typedef void (*mbtk_audio_pa_switch_func)(bool open);
+
+typedef void (*mbtk_audio_volume_set_func)();
+
+
+typedef enum {
+    MBTK_AUDIO_DIRECTION_OUTPUT = 0,    // Play
+    MBTK_AUDIO_DIRECTION_INPUT         // Recorder
+} mbtk_audio_direction_enum;
+
+typedef enum {
+    MBTK_AUDIO_SAMPLE_RATE_8000 = 0,
+    MBTK_AUDIO_SAMPLE_RATE_16000
+} mbtk_audio_sample_rate_enum;
+
+int mbtk_audio_pcm_init();
+
+void mbtk_audio_pa_func_set(mbtk_audio_pa_switch_func pa_switch_func);
+
+void mbtk_audio_volume_set_func_set(mbtk_audio_volume_set_func volume_set_func);
+
+int mbtk_audio_pcm_sample_rate_set(mbtk_audio_sample_rate_enum sample_rate);
+
+// Send PCM to location SPK.
+int mbtk_audio_pcm_play_start();
+
+int mbtk_audio_pcm_play_data_send(const void* data,uint32 data_len);
+
+int mbtk_audio_pcm_play_stop();
+
+// Get PCM from location MIC.
+int mbtk_audio_pcm_recorder_start(mbtk_recorder_callback_func recorder_cb);
+
+int mbtk_audio_pcm_recorder_pause();
+
+int mbtk_audio_pcm_recorder_resume();
+
+int mbtk_audio_pcm_recorder_stop();
+
+int mbtk_audio_pcm_deinit();
+
+int mbtk_audio_wav_init();
+
+int mbtk_audio_wav_play_start(const void *wav_file);
+
+int mbtk_audio_wav_stream_play_start(const unsigned char *pcm_data, int data_size, int sample_rate, int num_channels);
+
+int mbtk_audio_wav_play_pause();
+
+int mbtk_audio_wav_play_resume();
+
+int mbtk_audio_wav_play_stop();
+
+int mbtk_audio_wav_recorder_start(const void *wav_file, mbtk_audio_sample_rate_enum sample_rate);
+
+int mbtk_audio_wav_recorder_pause();
+
+int mbtk_audio_wav_recorder_resume();
+
+int mbtk_audio_wav_recorder_stop();
+
+int mbtk_audio_wav_deinit();
+
+// Send PCM to the other end of the voice.
+int mbtk_audio_voice_pcm_playback_start();
+
+// Get PCM from the other end of the voice.
+int mbtk_audio_voice_pcm_record_start();
+
+/**
+ *    device: UINT32
+ *         0: earpiece
+ *         1: speaker
+ *         2: headset
+ *    enable_state: UINT32
+ *         0: close
+ *         1: open
+ */
+int mbtk_audio_set_loopback_enable_state(int device, int enable_state);
+int mbtk_audio_get_loopback_enable_state(int *device, int *enable_state);
+
+
+#endif /* _MBTK_AUDIO2_H */
diff --git a/mbtk/include/mbtk/mbtk_audio_gain.h b/mbtk/include/mbtk/mbtk_audio_gain.h
new file mode 100755
index 0000000..aa161d3
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_audio_gain.h
@@ -0,0 +1,89 @@
+/*
+* mbtk_audio_gain.h
+*
+* MBTK audio gain for nvm : /NVM/audio_gain.nvm.
+*
+* Author : lb
+* Date   : 2024/3/1 16:04:46
+*/
+#ifndef _MBTK_AUDIO_GAIN_H
+#define _MBTK_AUDIO_GAIN_H
+#include "mbtk_type.h"
+
+#define MBTK_AUDIO_GAIN_ADD_START 0x0108
+#define MBTK_AUDIO_GAIN_MIN -36
+#define MBTK_AUDIO_GAIN_MAX 12
+#define CONFIG_DSPGAIN_MUTE_ON  (-100)
+#define CONFIG_DSPGAIN_MUTE_OFF  (100)
+
+#define MBTK_AUDIO_GAIN_PATH "/NVM/audio_gain.nvm"
+
+typedef enum
+{
+	CONFIG_DSPGAIN_TX = 0, /* TX: near to far end */
+	CONFIG_DSPGAIN_RX, /* RX: far to near end */
+//	CONFIG_DSPGAIN_SIDETONE,
+//	CONFIG_DSPGAIN_NUMBER = CONFIG_DSPGAIN_SIDETONE
+} CONFIG_DSPGAIN_Direction;
+
+typedef enum
+{
+     VC_HANDSET = 0,
+     VC_HANDSFREE,
+     VC_HEADSET,
+     VC_HEADPHONE,
+
+     VC_HEAD_NUM
+} AUDIO_PROFILE_ID;
+
+typedef enum
+{
+    AUDIOHAL_SPK_MUTE    = 0,
+    AUDIOHAL_SPK_VOL_1,
+    AUDIOHAL_SPK_VOL_2,
+    AUDIOHAL_SPK_VOL_3,
+    AUDIOHAL_SPK_VOL_4,
+    AUDIOHAL_SPK_VOL_5,
+    AUDIOHAL_SPK_VOL_6,
+    AUDIOHAL_SPK_VOL_7,
+    AUDIOHAL_SPK_VOL_8,
+    AUDIOHAL_SPK_VOL_9,
+    AUDIOHAL_SPK_VOL_10,
+    AUDIOHAL_SPK_VOL_QTY //11
+}  AUDIOHAL_SPK_LEVEL_T;
+
+typedef struct
+{
+    uint16  PGA_Stage1;
+    uint16  PGA_Stage2;
+    uint16  ADC_DigGain;
+    uint16  SideTone_Gain;
+    uint16  Reserved1;
+    uint16  Reserved2;
+}  ACMCodec_GainInT;
+
+typedef struct
+{
+    uint16  DAC_DigGain;
+    uint16  DAC_Gain;
+    uint16  RCV_Gain;
+    uint16  ClassG_Mode;
+    uint16  ClassD_Gain;
+    uint16  Reserved;
+}  ACMCodec_GainOutT;
+
+typedef struct{
+    AUDIO_PROFILE_ID    Profile_id;
+    uint16      CodecControl;
+    ACMCodec_GainInT    Tx_CodecGain; //TX has the same gain for every volume
+    int16               Tx_DSPGain;   //TX has the same gain for every volume, High 8bits: WB gain, Low 8bits: NB gain
+    ACMCodec_GainOutT   Rx_CodecGain[AUDIOHAL_SPK_VOL_QTY + 1];
+    int16               Rx_DSPGain[AUDIOHAL_SPK_VOL_QTY + 1];   //High 8bits: WB gain, Low 8bits: NB gain
+    int16               Rx_DSPSideToneGain;                 //High 8bits: WB gain, Low 8bits: NB gain
+} ACMCodec_GainT;
+
+int mbtk_dsp_gain_set(CONFIG_DSPGAIN_Direction dir, int gain);
+
+int mbtk_dsp_gain_get(int *rx_gain, int *tx_gain);
+
+#endif /* _MBTK_AUDIO_GAIN_H */
diff --git a/mbtk/include/mbtk/mbtk_audio_ubus.h b/mbtk/include/mbtk/mbtk_audio_ubus.h
new file mode 100755
index 0000000..f2a6fdc
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_audio_ubus.h
@@ -0,0 +1,55 @@
+/*
+* mbtk_audio_ubus.h
+*
+* MBTK audio ubus client API header.
+*
+* Author : lb
+* Date   : 2024/3/18 16:04:33
+*/
+#ifndef _MBTK_AUDIO_UBUS_H
+#define _MBTK_AUDIO_UBUS_H
+
+
+int mbtk_audio_ubus_init();
+
+int mbtk_audio_ubus_deinit();
+
+/**
+* mode:
+*     AUDIO_MODE_INVALID = -2,
+*     AUDIO_MODE_CURRENT = -1,
+*     AUDIO_MODE_NORMAL = 0,
+*     AUDIO_MODE_RINGTONE = 1,
+*     AUDIO_MODE_IN_CALL = 2,
+*     AUDIO_MODE_IN_COMMUNICATION=3,
+*     AUDIO_MODE_IN_VT_CALL= 4,
+*     AUDIO_MODE_CNT,
+*     AUDIO_MODE_MAX = AUDIO_MODE_CNT-1
+ */
+int mbtk_audio_mode_set(int mode);
+
+/**
+ *    device: UINT32
+ *         0: earpiece
+ *         1: speaker
+ *         2: headset
+ */
+int mbtk_audio_loopback_start(int device);
+
+int mbtk_audio_loopback_stop();
+/**
+ * @brief      mbtk_audio_dsp_gain_set
+ *
+ * @details    dsp gain set
+ *
+ * @param      param
+ *             type: 0:tx
+ *             0: tx
+ *             1: rx
+ *             gain: -36~12 db
+
+ * @return     return 
+ */
+int mbtk_audio_dsp_gain_set(int type, int gain);
+
+#endif /* _MBTK_AUDIO_UBUS_H */
diff --git a/mbtk/include/mbtk/mbtk_coap.h b/mbtk/include/mbtk/mbtk_coap.h
new file mode 100755
index 0000000..23827b6
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_coap.h
@@ -0,0 +1,228 @@
+/*************************************************************

+Description:

+    L620 Coap support Header file.

+Author:

+    LuoJian

+Date:

+    2018/9/16 4:26:36

+*************************************************************/

+#ifndef FEATURE_MBTK_ECOAP

+#define FEATURE_MBTK_ECOAP

+#include <ctype.h>

+#include <stdbool.h>

+

+#include "mbtk_coap_api.h"

+

+/*************************************************************

+    Constants and Macros

+*************************************************************/

+#define MBTK_COAP_DTLS_SUPPORT

+

+#define MBTK_ECOAP_NEW_MAX 128

+#define MBTK_ECOAP_OPTION_LEN 512

+#define MBTK_ECOAP_DATA_MAX 1024

+

+

+/*************************************************************

+    Definitions:enum,struct,union,class

+*************************************************************/

+

+#define MBTK_ECOAP_ERR_SUCCESS  0                 /* No error */

+#define	MBTK_ECOAP_ERR_NO_OPEN 300               /* 300 coap service is not opened. */

+#define	MBTK_ECOAP_ERR_IS_OPENED 301                /* 301 coap service is opened.*/

+#define	MBTK_ECOAP_ERR_NO_READY 302              /* 302 coap host and port not set */

+#define	MBTK_ECOAP_ERR_NET 303                   /* 303 DNS error. */

+#define	MBTK_ECOAP_ERR_SOCK_CANNOT_RST 304       /* 304 Socket can not reset. */

+#define	MBTK_ECOAP_ERR_MSG_ID 305                /* 305 Message ID error. */

+#define	MBTK_ECOAP_ERR_PAYLOAD_LENGTH 306        /* 306 Payload length error. */

+#define	MBTK_ECOAP_ERR_OPTION 307                /* 307 Potion set error. */

+#define	MBTK_ECOAP_ERR_TASK_IS_RUNING 308        /* 308 Task is runing. */

+#define	MBTK_ECOAP_ERR_UNKNOWN 350           /* 350 Unknown coap error */

+

+

+

+

+typedef enum

+{

+    MBTK_ECOAP_BLOCK_16,

+    MBTK_ECOAP_BLOCK_32,

+    MBTK_ECOAP_BLOCK_64,

+    MBTK_ECOAP_BLOCK_128,

+    MBTK_ECOAP_BLOCK_256,

+    MBTK_ECOAP_BLOCK_512,

+    MBTK_ECOAP_BLOCK_1024

+} mbtk_ecoap_option_block_e;

+

+typedef enum {

+	MBTK_ECOAP_SIG_START,

+	MBTK_ECOAP_SIG_STOP,

+    MBTK_ECOAP_SIG_SEND,

+    MBTK_ECOAP_SIG_RECV,

+    MBTK_ECOAP_SIG_DISCONNING

+} mbtk_ecoap_base_sig_enum;

+

+typedef enum

+{

+    MBTK_ECOAP_STATE_NON,

+    MBTK_ECOAP_STATE_CLOSING,

+    MBTK_ECOAP_STATE_OPENED,

+    MBTK_ECOAP_STATE_READY

+} mbtk_ecoap_state_e;

+

+typedef struct

+{

+    mbtk_ecoap_option_block_e size;

+    int number;

+    uint8 more_flag;

+} mbtk_ecoap_option_block_s;

+

+typedef struct mbtk_ecoap_option

+{

+    mbtk_coap_option_type type;

+

+    union

+    {

+        mbtk_ecoap_option_block_s opt_block;

+        mbtk_content_format_type opt_content_format;

+        uint8 opt_str[128];

+        int opt_int;

+    } opt;

+

+    struct mbtk_ecoap_option *next;

+} mbtk_ecoap_option_s;

+

+typedef struct mbtk_ecoap_option_2{

+	int optlen;

+	uint8 optVal[512+1];

+}mbtk_ecoap_opt_2;

+

+typedef struct mbtk_ecoap_option_3{

+	int optlen;

+	char optVal[512+1];

+}mbtk_ecoap_opt_3;

+

+typedef struct

+{

+    uint8 version;

+    mbtk_coap_type type;

+    mbtk_coap_code_type code;

+    int message_id;

+

+    uint8 token[8];

+    uint8 token_len;

+

+    uint8 send_count;

+

+    mbtk_ecoap_opt_2 option;

+

+    uint8 *payload;

+    int payload_len;

+}mbtk_ecoap_package_ver;

+

+

+typedef struct mbtk_ecoap_package

+{

+    uint8 send_count;

+

+    uint8 version;

+    mbtk_coap_type type;

+    mbtk_coap_code_type code;

+

+    uint8 token[8];

+    uint8 token_len;

+

+    int message_id;

+

+    mbtk_ecoap_option_s *options;

+

+    uint8 *payload;

+    int payload_len;

+

+    struct mbtk_ecoap_package *next;

+} mbtk_ecoap_package_s;

+

+typedef struct

+{

+    uint8 host[32];

+    int port;

+	int socket;

+#ifdef MBTK_COAP_DTLS_SUPPORT

+    int is_dtls;

+#endif

+    int message_id;

+} mbtk_ecoap_net_s;

+

+

+/*************************************************************

+    Extern variables

+*************************************************************/

+

+

+/*************************************************************

+    Public Function Declaration

+*************************************************************/

+int mbtk_coap_ecoapnew_exec_cmd

+(

+    char *ip_addr,

+    int port,

+    bool is_support_ssl, 

+    bool ingnore_cert

+);

+

+int mbtk_coap_ecoaprxmod_exec_cmd

+(

+	int mode

+);

+

+int mbtk_coap_ecoappr_exec_cmd

+(

+	int format

+);

+

+

+int mbtk_coap_ecoaprxget_exec_cmd

+(

+    int len

+);

+

+int mbtk_coap_ecoapver_exec_cmd

+(

+    int version

+);

+

+int mbtk_coap_ecoaptype_exec_cmd

+(

+    mbtk_coap_type type

+);

+

+int mbtk_coap_ecoapcode_exec_cmd

+(

+    mbtk_coap_code_type code

+);

+

+int mbtk_coap_ecoaptoken_exec_cmd

+(

+    char *token_buf, int len

+);

+

+int mbtk_coap_ecoapmsgid_exec_cmd

+(

+    int msg_id

+);

+

+int mbtk_coap_ecoapopt_exec_cmd

+(

+    char *value_buf, int buf_len

+);

+

+int mbtk_coap_ecoapsend_exec_cmd

+(

+    int message_id, int data_len, char *data

+);

+

+int mbtk_coap_ecoapdel_exec_cmd( int del_id );

+

+int mbtk_coap_ecoapnmi_exec_cmd( void );

+

+

+#endif /* _MBTK_COAP_L620_H */

diff --git a/mbtk/include/mbtk/mbtk_coap_api.h b/mbtk/include/mbtk/mbtk_coap_api.h
new file mode 100755
index 0000000..ac1b699
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_coap_api.h
@@ -0,0 +1,223 @@
+#ifndef MBTK_COAP_API_H

+#define MBTK_COAP_API_H

+

+#include "mbtk_type.h"

+

+// CoAP message types. Note, values only work as enum.

+typedef enum

+{

+    COAP_CONFIRMABLE=0x00,

+    COAP_NON_CONFIRMABLE=0x10,

+    COAP_ACKNOWLEDGEMENT=0x20,

+    COAP_RESET=0x30

+} mbtk_coap_type;

+

+// CoAP response codes.

+typedef enum

+{

+    COAP_EMPTY=0x00,

+    COAP_GET,

+    COAP_POST,

+    COAP_PUT,

+    COAP_DELETE,

+    COAP_LASTMETHOD=0x1F,

+    COAP_CREATED=0x41,

+    COAP_DELETED,

+    COAP_VALID,

+    COAP_CHANGED,

+    COAP_CONTENT,

+    COAP_CONTINUE=0x5F,

+    COAP_BAD_REQUEST=0x80,

+    COAP_UNAUTHORIZED,

+    COAP_BAD_OPTION,

+    COAP_FORBIDDEN,

+    COAP_NOT_FOUND,

+    COAP_METHOD_NOT_ALLOWED,

+    COAP_NOT_ACCEPTABLE,

+    COAP_PRECONDITION_FAILED=0x8C,

+    COAP_REQUEST_ENTITY_TOO_LARGE=0x8D,

+    COAP_UNSUPPORTED_CONTENT_FORMAT=0x8F,

+    COAP_INTERNAL_SERVER_ERROR=0xA0,

+    COAP_NOT_IMPLEMENTED,

+    COAP_BAD_GATEWAY,

+    COAP_SERVICE_UNAVAILABLE,

+    COAP_GATEWAY_TIMEOUT,

+    COAP_PROXYING_NOT_SUPPORTED,

+    COAP_UNDEFINED_CODE=0xFF

+} mbtk_coap_code_type;

+

+/// CoAP option numbers.

+typedef enum

+{

+    COAP_OPTION_NON=0,

+    COAP_OPTION_IF_MATCH=1,

+    COAP_OPTION_URI_HOST=3,

+    COAP_OPTION_ETAG,

+    COAP_OPTION_IF_NONE_MATCH,

+    COAP_OPTION_OBSERVE,

+    COAP_OPTION_URI_PORT,

+    COAP_OPTION_LOCATION_PATH,

+    COAP_OPTION_URI_PATH=11,

+    COAP_OPTION_CONTENT_FORMAT,

+    COAP_OPTION_MAX_AGE=14,

+    COAP_OPTION_URI_QUERY,

+    COAP_OPTION_ACCEPT=17,

+    COAP_OPTION_LOCATION_QUERY=20,

+    COAP_OPTION_BLOCK2=23,

+    COAP_OPTION_BLOCK1=27,

+    COAP_OPTION_SIZE2,

+    COAP_OPTION_PROXY_URI=35,

+    COAP_OPTION_PROXY_SCHEME=39,

+    COAP_OPTION_SIZE1=60

+} mbtk_coap_option_type;

+

+/// CoAP content-formats.

+typedef enum

+{

+    COAP_CONTENT_FORMAT_NON = -1,

+    COAP_CONTENT_FORMAT_TEXT_PLAIN = 0,

+    COAP_CONTENT_FORMAT_APP_LINK  = 40,

+    COAP_CONTENT_FORMAT_APP_XML,

+    COAP_CONTENT_FORMAT_APP_OCTET,

+    COAP_CONTENT_FORMAT_APP_EXI   = 47,

+    COAP_CONTENT_FORMAT_APP_JSON  = 50

+} mbtk_content_format_type;

+

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+extern void coapReleaseCoapPUD();

+extern int coapReset();

+extern int coapValidate();

+

+// version

+extern int coapSetVersion(uint8_t version);

+extern uint8_t coapGetVersion();

+

+// message type

+extern void coapSetType(mbtk_coap_type type);

+extern mbtk_coap_type coapGetType();

+

+// tokens

+extern int coapCoapsetTokenLength(uint8_t tokenLength);

+extern int coapGetTokenLength();

+extern uint8_t* coapGetTokenPointer();

+extern int coapSetToken(uint8_t *token, uint8_t tokenLength);

+

+// message code

+extern void coapSetCode(mbtk_coap_code_type code);

+extern mbtk_coap_code_type coapGetCode();

+extern mbtk_coap_code_type coapHttpStatusToCode(int httpStatus);

+

+// message ID

+extern int coapSetMessageID(uint16_t messageID);

+extern uint16_t coapGetMessageID();

+

+// options

+extern int coapAddOption(uint16_t optionNumber, uint16_t optionLength, uint8_t *optionValue);

+// gets a list of all options

+//extern CoapOption* getOptions();

+extern int coapGetNumOptions();

+// shorthand helpers

+extern int coapSetURI(char *uri);

+extern int coapsetURI(char *uri, int urilen);

+extern int coapGetURI(char *dst, int dstlen, int *outLen);

+extern int coapAddURIQuery(char *query);

+

+// content format helper

+extern int coapSetContentFormat(mbtk_content_format_type format);

+

+// payload

+extern uint8_t* coapMallocPayload(int bytes);

+extern int coapSetPayload(uint8_t *value, int len);

+extern uint8_t* coapGetPayloadPointer();

+extern int coapGetPayloadLength();

+extern uint8_t* coapGetPayloadCopy();

+

+// pdu

+extern int coapGetPDULength();

+extern uint8_t* coapGetPDUPointer();

+extern void coapSetPDULength(int len);

+extern int mbtk_coap_get_pdu_Length();

+

+extern void coapDeleteRecv();

+extern int coapCreateRecv(uint8_t *pdu, int pduLength);

+extern void coapPrintHuman(char * outBuffer) ;

+extern const char* coapPrintHumanByIndex(int index);

+extern const char* coapPrintHexByIndex(int index);

+extern void coapGetOptionValueById(uint16_t optionNumber, uint16_t * optionValueLength, uint8_t * optionValuePointer);

+extern uint16_t coapGetRecvMessageID();

+extern mbtk_coap_type coapGetRecvType();

+extern mbtk_coap_code_type coapGetRecvCode();

+extern int coapGetRecvTokenLength();

+extern uint8_t* coapGetRecvTokenPointer();

+extern int coapGetRecvPayloadLength();

+extern uint8_t* coapGetRecvPayloadPointer();

+uint8_t coapGetRecvVersion();

+

+// Return If-Match length,or 0 if fail.

+extern uint16_t coapGetRecvOptionIfMatch(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return Uri-Host length,or 0 if fail.

+extern uint16_t coapGetRecvOptionUriHost(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return ETag length,or 0 if fail.

+extern uint16_t coapGetRecvOptionETag(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return If-None-Match length,or 0 if fail.

+extern uint16_t coapGetRecvOptionIfNoneMatch(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return Location-Path length,or 0 if fail.

+extern uint16_t coapGetRecvOptionLocationPath(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return Location-Query length,or 0 if fail.

+extern uint16_t coapGetRecvOptionLocationQuery(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return Proxy-Uri length,or 0 if fail.

+extern uint16_t coapGetRecvOptionProxyUri(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return Proxy-Scheme length,or 0 if fail.

+extern uint16_t coapGetRecvOptionProxyScheme(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return Uri-Path length,or 0 if fail.

+extern uint16_t coapGetRecvOptionUriPath(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return Uri-Query length,or 0 if fail.

+extern uint16_t coapGetRecvOptionUriQuery(uint16_t *optionValueLength, uint8_t *optionValuePointer);

+

+// Return 1 if get Observe success,or 0 if fail.

+extern uint16_t coapGetRecvOptionObserve(uint16_t *observe);

+

+// Return 1 if get Max-Age success,or 0 if fail.

+extern uint16_t coapGetRecvOptionMaxAge(uint16_t *max_age);

+

+// Return 1 if get Uri-Port success,or 0 if fail.

+extern uint16_t coapGetRecvOptionUriPort(uint16_t *uri_port);

+

+// Return 1 if get Size2 success,or 0 if fail.

+extern uint16_t coapGetRecvOptionSize2(uint16_t *size2);

+

+// Return 1 if get Size1 success,or 0 if fail.

+extern uint16_t coapGetRecvOptionSize1(uint16_t *size1);

+

+// Return 1 if get Block2 success,or 0 if fail.

+extern uint16_t coapGetRecvOptionBlock2(uint32_t *number,uint8_t *more_flag,uint8_t *size);

+

+// Return 1 if get Block1 success,or 0 if fail.

+extern uint16_t coapGetRecvOptionBlock1(uint32_t *number,uint8_t *more_flag,uint8_t *size);

+

+// Return 1 if get Content-Format success,or 0 if fail.

+extern uint16_t coapGetRecvOptionContentFormat(mbtk_content_format_type *type);

+

+// Return 1 if get Accept success,or 0 if fail.

+extern uint16_t coapGetRecvOptionAccept(mbtk_content_format_type *type);

+

+extern int coapHasOption(uint16_t optionNumber );

+extern int coapPrintRecvPayload(char *out);

+#ifdef __cplusplus

+}

+#endif

+

+#endif

diff --git a/mbtk/include/mbtk/mbtk_device.h b/mbtk/include/mbtk/mbtk_device.h
new file mode 100755
index 0000000..f7e7cef
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_device.h
@@ -0,0 +1,168 @@
+/*
+* mbtk_device.h
+*
+* MBTK device_info partition data header.
+*
+* Author : lb
+* Date   : 2023/12/30 11:36:35
+*/
+#ifndef _MBTK_DEVICE_V2_H
+#define _MBTK_DEVICE_V2_H
+//#include "mbtk_type.h"
+
+#define MBTK_DEVICE_INFO_PARTITION_NAME "device_info"
+#define MBTK_DEVICE_INFO_PARTITION_TAG 0x87878787
+#define MBTK_DEVICE_INFO_CURR_VERSION 2
+
+#define MBTK_DEV_INFO_PARTITION_ADDR 0x02A20000
+
+// 78,147,482,134742231
+#define MBTK_BAND_ALL_GSM_DEFAULT 78             // GSM : ASR default.
+#define MBTK_BAND_ALL_WCDMA_DEFAULT 147          // WCDMA : ASR default.
+#define MBTK_BAND_ALL_TDLTE_DEFAULT 482          // TDD-LTE : ASR default.
+#define MBTK_BAND_ALL_FDDLTE_DEFAULT 134742231   // FDD-LTE : ASR default.
+#define MBTK_BAND_ALL_EXT_LTE_DEFAULT 0          // EXT-LTE
+#define MBTK_BAND_ALL_NR_3_DEFAULT 0
+#define MBTK_BAND_ALL_NR_2_DEFAULT 24576         // n78/n79
+#define MBTK_BAND_ALL_NR_1_DEFAULT 256           // n41
+#define MBTK_BAND_ALL_NR_0_DEFAULT 134217877     // n1/n3/n5/n8/n28
+
+#define MBTK_BAND_CN_GSM_DEFAULT 11             // GSM : B3/B8 (PGSM 900/DCS GSM 1800/EGSM 900)
+#define MBTK_BAND_CN_WCDMA_DEFAULT 145          // WCDMA : B1/B5/B8
+#define MBTK_BAND_CN_TDLTE_DEFAULT 482          // TDD-LTE : B34/B38/B39/B40/B41
+#define MBTK_BAND_CN_FDDLTE_DEFAULT 149         // FDD-LTE : B1/B3/B5/B8
+#define MBTK_BAND_CN_EXT_LTE_DEFAULT 0          // EXT-LTE
+#define MBTK_BAND_CN_NR_3_DEFAULT 0
+#define MBTK_BAND_CN_NR_2_DEFAULT 24576         // n78/n79
+#define MBTK_BAND_CN_NR_1_DEFAULT 384           // n40/n41
+#define MBTK_BAND_CN_NR_0_DEFAULT 134217877     // n1/n3/n5/n8/n28
+
+#define MBTK_BAND_EU_GSM_DEFAULT 11             // GSM : B3/B8 (PGSM 900/DCS GSM 1800/EGSM 900)
+#define MBTK_BAND_EU_WCDMA_DEFAULT 145          // WCDMA : B1/B5/B8
+#define MBTK_BAND_EU_TDLTE_DEFAULT 416          // TDD-LTE : B38/B40/B41
+#define MBTK_BAND_EU_FDDLTE_DEFAULT 134742229   // FDD-LTE : B1/B3/B5/B7/B8/B20/B28
+#define MBTK_BAND_EU_EXT_LTE_DEFAULT 0          // EXT-LTE
+#define MBTK_BAND_EU_NR_3_DEFAULT 0
+#define MBTK_BAND_EU_NR_2_DEFAULT 12352         // n71/n77/n78
+#define MBTK_BAND_EU_NR_1_DEFAULT 416           // n38/n40/n41
+#define MBTK_BAND_EU_NR_0_DEFAULT 134742229     // n1/n3/n5/n7/n8/n20/n28
+
+#define MBTK_BAND_SA_GSM_DEFAULT 79             // GSM : B2/B3/B5/B8(GSM 850/PGSM 900/EGSM 900/DCS GSM 1800/PCS GSM 1900)
+#define MBTK_BAND_SA_WCDMA_DEFAULT 155          // WCDMA : B1/B2/B4/B5/B8
+#define MBTK_BAND_SA_TDLTE_DEFAULT 128          // TDD-LTE : B40
+#define MBTK_BAND_SA_FDDLTE_DEFAULT 134217951  // FDD-LTE : B1/B2/B3/B4/B5/B7/B8/B28
+#define MBTK_BAND_SA_EXT_LTE_DEFAULT 2          // EXT-LTE : B66
+#define MBTK_BAND_SA_NR_3_DEFAULT MBTK_BAND_ALL_NR_3_DEFAULT
+#define MBTK_BAND_SA_NR_2_DEFAULT MBTK_BAND_ALL_NR_2_DEFAULT
+#define MBTK_BAND_SA_NR_1_DEFAULT MBTK_BAND_ALL_NR_1_DEFAULT
+#define MBTK_BAND_SA_NR_0_DEFAULT MBTK_BAND_ALL_NR_0_DEFAULT
+
+#define MBTK_DEVICE_INFO_ITEM_STR_BASIC "BASIC"
+#define MBTK_DEVICE_INFO_ITEM_STR_FOTA "FOTA"
+#define MBTK_DEVICE_INFO_ITEM_STR_MODEM "MODEM"
+#define MBTK_DEVICE_INFO_ITEM_STR_LOG "LOG"
+
+#define MBTK_DEVICE_INFO_ITEM_ADDR_BASIC    0x100   // Header is 0x100
+#define MBTK_DEVICE_INFO_ITEM_ADDR_FOTA     0x500   // Basic is 1k
+#define MBTK_DEVICE_INFO_ITEM_ADDR_MODEM    0x900   // Fota is 1k
+#define MBTK_DEVICE_INFO_ITEM_ADDR_LOG      0xD00   // Modem is 1k
+
+#define MBTK_NET_SUPPORT_2G (1)
+#define MBTK_NET_SUPPORT_3G (1<<1)
+#define MBTK_NET_SUPPORT_4G (1<<2)
+#define MBTK_NET_SUPPORT_5G (1<<3)
+
+typedef enum {
+    MBTK_DEVICE_INFO_ITEM_BASIC = 0,
+    MBTK_DEVICE_INFO_ITEM_FOTA,
+    MBTK_DEVICE_INFO_ITEM_MODEM,
+    MBTK_DEVICE_INFO_ITEM_LOG,
+
+    MBTK_DEVICE_INFO_ITEM_NUM
+} mbtk_device_info_item_enum;
+
+typedef struct {
+    mbtk_device_info_item_enum item;
+    uint32 addr;
+} mbtk_device_info_item_header_t;
+
+typedef struct {
+    uint32 tag;
+    uint32 version;             // Default : 0x01
+    uint32 item_count;
+    mbtk_device_info_item_header_t item_header[MBTK_DEVICE_INFO_ITEM_NUM];
+} mbtk_device_info_header_t;
+
+typedef enum {
+    MBTK_REBOOT_FLAG_NORMAL = 0,
+    MBTK_REBOOT_FLAG_DOWNLOAD,
+    MBTK_REBOOT_FLAG_POWER_OFF,  //Power off and restart
+    MBTK_REBOOT_FLAG_HARDWARE,   //Hardware restart
+    MBTK_REBOOT_FLAG_COMMAND,    //"reboot" "reboot -f" Command restart
+    MBTK_REBOOT_FLAG_ABNORMAL,   //Abnormal restart
+    MBTK_REBOOT_FLAG_UNKNOWN,    //unknown restart
+} mbtk_device_info_reboot_flag_enum;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    uint8 project[16];          // T108 / L508_X6
+    uint8 project_cust[16];     // T108_C1 / L508_X6_C1  (Refer to: Custom_Model in blf file.)
+    uint32 ab_support;          // 1 for ab
+    mbtk_device_info_reboot_flag_enum reboot_flag;
+    uint8 revision_out[48];     // L508_X6v01.01b04.00
+    uint8 revision_in[64];
+    uint8 build_time[64];
+    uint8 asr_baseline[64];
+} mbtk_device_info_basic_t;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    uint32 state;               //
+} mbtk_device_info_fota_t;
+
+typedef enum {
+    MBTK_MODEM_BAND_AREA_ALL,
+    MBTK_MODEM_BAND_AREA_CN,
+    MBTK_MODEM_BAND_AREA_EU,
+    MBTK_MODEM_BAND_AREA_SA
+} mbtk_modem_band_area_enum;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    mbtk_modem_band_area_enum band_area;
+    uint32 net_pref;    // Refor to : mbtk_net_pref_enum
+    uint32 net_support; // 1:GSM      2:WCDMA   4:LTE   8:NR
+    uint32 band_gsm;
+    uint32 band_wcdma;
+    uint32 band_tdlte;
+    uint32 band_fddlte;
+    uint32 band_lte_ext;
+    uint32 band_nr_3;
+    uint32 band_nr_2;
+    uint32 band_nr_1;
+    uint32 band_nr_0;
+} mbtk_device_info_modem_t;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    uint32 state;               //
+} mbtk_device_info_log_t;
+
+
+/*
+* MBTK_DEVICE_INFO_ITEM_BASIC - mbtk_device_info_basic_t
+* MBTK_DEVICE_INFO_ITEM_FOTA - mbtk_device_info_fota_t
+* MBTK_DEVICE_INFO_ITEM_MODEM - mbtk_device_info_modem_t
+* MBTK_DEVICE_INFO_ITEM_LOG - mbtk_device_info_log_t
+*/
+int mbtk_dev_info_read(mbtk_device_info_item_enum item_type, void *item_ptr, int item_size);
+int mbtk_dev_info_write(mbtk_device_info_item_enum item_type, void *item_ptr, int item_size);
+int mbtk_dev_info_revision_get(char *revision_out, char *revision_in, char *project_cust, char *band_area,
+            char* build_time);
+
+#endif /* _MBTK_DEVICE_V2_H */
+
diff --git a/mbtk/include/mbtk/mbtk_dhcp.h b/mbtk/include/mbtk/mbtk_dhcp.h
new file mode 100755
index 0000000..8553d43
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_dhcp.h
@@ -0,0 +1,104 @@
+/*
+* MBTK DHCP Header.
+*
+* Author : lb
+* Date   : 2021/8/20 13:38:03
+*
+*/
+#ifndef _MBTK_DHCP_H
+#define _MBTK_DHCP_H
+#include <netinet/in.h>
+
+#include "mbtk_type.h"
+
+#define PORT_BOOTP_SERVER 67
+#define PORT_BOOTP_CLIENT 68
+#define OP_BOOTREQUEST 1
+#define OP_BOOTREPLY   2
+#define FLAGS_BROADCAST 0x8000
+#define HTYPE_ETHER    1
+#define DHCP_MSG_FIXED_SIZE 236
+
+/* first four bytes of options are a cookie to indicate that
+** the payload are DHCP options as opposed to some other BOOTP
+** extension.
+*/
+#define OPT_COOKIE1          0x63
+#define OPT_COOKIE2          0x82
+#define OPT_COOKIE3          0x53
+#define OPT_COOKIE4          0x63
+
+/* BOOTP/DHCP options - see RFC 2132 */
+#define OPT_PAD              0
+
+#define OPT_SUBNET_MASK      1     /* 4 <ipaddr> */
+#define OPT_TIME_OFFSET      2     /* 4 <seconds> */
+#define OPT_GATEWAY          3     /* 4*n <ipaddr> * n */
+#define OPT_DNS              6     /* 4*n <ipaddr> * n */
+#define OPT_DOMAIN_NAME      15    /* n <domainnamestring> */
+#define OPT_BROADCAST_ADDR   28    /* 4 <ipaddr> */
+
+#define OPT_REQUESTED_IP     50    /* 4 <ipaddr> */
+#define OPT_LEASE_TIME       51    /* 4 <seconds> */
+#define OPT_MESSAGE_TYPE     53    /* 1 <msgtype> */
+#define OPT_SERVER_ID        54    /* 4 <ipaddr> */
+#define OPT_PARAMETER_LIST   55    /* n <optcode> * n */
+#define OPT_MESSAGE          56    /* n <errorstring> */
+#define OPT_CLASS_ID         60    /* n <opaque> */
+#define OPT_CLIENT_ID        61    /* n <opaque> */
+#define OPT_END              255
+
+/* DHCP message types */
+#define DHCPDISCOVER         1
+#define DHCPOFFER            2
+#define DHCPREQUEST          3
+#define DHCPDECLINE          4
+#define DHCPACK              5
+#define DHCPNAK              6
+#define DHCPRELEASE          7
+#define DHCPINFORM           8
+
+typedef unsigned long long msecs_t;
+
+typedef struct {
+    uint8_t op;           /* BOOTREQUEST / BOOTREPLY    */
+    uint8_t htype;        /* hw addr type               */
+    uint8_t hlen;         /* hw addr len                */
+    uint8_t hops;         /* client set to 0            */
+
+    uint32_t xid;         /* transaction id             */
+
+    uint16_t secs;        /* seconds since start of acq */
+    uint16_t flags;
+
+    uint32_t ciaddr;      /* client IP addr             */
+    uint32_t yiaddr;      /* your (client) IP addr      */
+    uint32_t siaddr;      /* ip addr of next server     */
+                          /* (DHCPOFFER and DHCPACK)    */
+    uint32_t giaddr;      /* relay agent IP addr        */
+
+    uint8_t chaddr[16];  /* client hw addr             */
+    char sname[64];      /* asciiz server hostname     */
+    char file[128];      /* asciiz boot file name      */
+
+    uint8_t options[1024];  /* optional parameters        */
+} dhcp_msg;
+
+typedef struct {
+    uint32_t type;
+
+    uint32_t ipaddr;
+    uint32_t gateway;
+    uint32_t prefixLength;
+
+    uint32_t dns1;
+    uint32_t dns2;
+
+    uint32_t serveraddr;
+    uint32_t lease;
+} dhcp_info;
+
+int mbtk_do_dhcp(const char *name);
+
+#endif /* _MBTK_DHCP_H */
+
diff --git a/mbtk/include/mbtk/mbtk_file.h b/mbtk/include/mbtk/mbtk_file.h
new file mode 100755
index 0000000..e3924eb
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_file.h
@@ -0,0 +1,89 @@
+/*
+*
+*
+* Author : lb
+* Date   : 2022/3/4 16:44:14
+*
+*/
+#ifndef _MBTK_FILE_H
+#define _MBTK_FILE_H
+#include "mbtk_type.h"
+
+#ifdef MBTK_PLATFORM_LINUX
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#endif
+
+#ifdef MBTK_PLATFORM_QCOMM
+#include "fs_public.h"
+#include "ds_profile.h"
+#include "dsati.h"
+#include "dsat_v.h"
+#include "rex.h"
+#include <stringl/stringl.h>
+#include "mbtk_9205_prod.h"
+#include "mbtk_socket_api.h"
+#endif
+
+#include "mbtk_log.h"
+
+// Return TRUE if file exist,FLASE or not.
+bool file_exist(const char *path);
+
+/*
+ * Return file descriptor if open file success, return -1 or not.
+ *
+ * flag : File open flag.
+ *  O_RDONLY 以只读方式打开文件
+ *  O_WRONLY 以只写方式打开文件
+ *  O_RDWR 以可读写方式打开文件
+ *      上述三种旗标是互斥
+ *
+ *  O_CREAT 若欲打开的文件不存在则自动建立该文件。
+ *  O_EXCL 如果 O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则
+ *      建立该文件,否则将导致打开文件错误。此外,若 O_CREAT 与 O_EXCL 同时设置,
+ *      并且欲打开的文件为符号连接,则会打开文件失败。
+ *  O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。
+ *  O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为 0,而原来存于该文件的资料也会消失。
+ *  O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
+ *  O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。
+ *  O_NDELAY 同 O_NONBLOCK。
+ *  O_SYNC 以同步的方式打开文件。
+ *  O_NOFOLLOW 如果参数 pathname 所指的文件为一符号连接,则会令打开文件失败。
+ *  O_DIRECTORY 如果参数 pathname 所指的文件并非为一目录,则会令打开文件失败
+ */
+int file_open(const char *path, int flag);
+
+// Return file size,or -1 if get file size fail.
+int file_length(int fd);
+
+// Read data of specified length.
+int file_read(int fd, void *buf, int nbyte);
+
+// Write data of specified length.
+int file_write(int fd, void *buf, int nbyte);
+
+// Close file.
+int file_close(int fd);
+
+/*===========================================================================
+FUNCTION file_link()
+
+DESCRIPTION:
+  Create soft link.
+
+PARAMETERS:
+  oldpath [IN]: Local original file,it may not exist.
+  newpath [IN]: Soft link file. If the file exists, it will be replaced.
+
+RETURN VALUE:
+  Return 0 if success,other for error.
+
+===========================================================================*/
+int file_link(const void* oldpath, const void* newpath);
+
+
+#endif /* _MBTK_FILE_H */
diff --git a/mbtk/include/mbtk/mbtk_fota.h b/mbtk/include/mbtk/mbtk_fota.h
new file mode 100755
index 0000000..385da51
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_fota.h
@@ -0,0 +1,109 @@
+/**  

+  @file

+  ql_fota.h

+

+  @brief

+  This file provides the definitions for device, and declares the 

+  API functions.

+

+*/

+/*============================================================================

+  Copyright (c) 2017 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.

+  Quectel Wireless Solution Proprietary and Confidential.

+ =============================================================================*/

+/*===========================================================================

+

+                        EDIT HISTORY FOR MODULE

+

+This section contains comments describing changes made to the module.

+Notice that changes are listed in reverse chronological order.

+

+

+WHEN        WHO            WHAT, WHERE, WHY

+----------  ------------   ----------------------------------------------------

+08/11/2019  baron.qian      create

+=============================================================================*/

+#ifndef __MBTK_FOTA_H__

+#define __MBTK_FOTA_H__

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+typedef enum mbtkabsystem
+{
+    mbtk_sys_A = 0,

+    mbtk_sys_B = 1

+} mbtk_absystem_t;

+

+/*callback function define, used to get upgrade state and rate of process*/

+typedef int(*fota_callback)(int state, int percent);

+

+/*******************************************************************************

+* @brief fota initialize

+  @param 

+    

+    fota_callback: callback function

+  @return 

+        if success return 0, else return -1

+ *******************************************************************************/

+int mbtk_fota_init(fota_callback cb);

+

+/*******************************************************************************

+* @brief write firmware package, the firmware package is written in segments.

+         and The result of the write is output by calling the callback function.

+         the firmware package size must less than 32MB

+  @param 

+           fname: firmware package file

+    segment_size: the length of once write, recommending 3*1024*1024 bytes

+  @return 

+        if success return 0, else return -1

+ *******************************************************************************/

+int mbtk_fota_fw_write(char *fname, int segment_size);

+

+

+/*******************************************************************************

+* @brief download firmware by url, and write firmware package, the firmware 

+         package is written in segments. The result of the write is output by 

+         calling the callback function. the firmware package size must less than 

+         32MB

+  @param 

+                 url: [IN] the address of download firmware package file, the url   

+                           support http or https protocol.

+        segment_size: [IN] the length of once write, recommending 3*1024*1024 bytes

+        conn_timeout: [IN] timeout to connect to the server, if set 0 that means

+                           switch to the default build-in connection timeout(300s)

+    download_timeout: [IN] timeout for download the firmware file. if set 0 that means

+                           it never time out

+  @return 

+        if success return 0, else return -1

+ *******************************************************************************/

+int mbtk_fota_fw_write_by_url(char *url, int segment_size, int conn_timeout, int download_timeout);

+

+

+/*******************************************************************************

+* @brief reboot system and clear env

+  @param 

+   is_reboot: if set 1, after fota success, reboot system

+  @return 

+        if success return 0, else return -1

+ *******************************************************************************/

+int mbtk_fota_done(int is_reboot);

+

+int mbtk_fota_done1(int is_reboot);

+

+

+

+int mbtk_fota_status(void);

+

+int mbtk_fota_get_asr_reboot_cnt_flag(void);

+int mbtk_fota_get_active_absys_type(void);

+int mbtk_fota_get_tmp_absys_type(void);

+int mbtk_fota_get_sync_absys_type(void);

+int mbtk_fota_get_mtd_check_type(void);

+

+#ifdef __cplusplus

+}

+#endif

+#endif //__MBTK_FOTA_H__

+

diff --git a/mbtk/include/mbtk/mbtk_ftp.h b/mbtk/include/mbtk/mbtk_ftp.h
new file mode 100755
index 0000000..0eb0a25
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_ftp.h
@@ -0,0 +1,216 @@
+/*************************************************************
+ Description:
+ MBTK FTP Protocol Head File.
+ Author:
+ LiuBin
+ Date:
+ 2020/10/28 11:49:19
+ *************************************************************/
+#ifndef _MBTK_FTP_H
+#define _MBTK_FTP_H
+
+#include "mbtk_file.h"
+#include "mbtk_sock.h"
+/*************************************************************
+ Constants and Macros
+ *************************************************************/
+#define MBTK_FTP_IP_MAX 50
+#define MBTK_FTP_FILE_NAME_MAX 50
+#define FTP_SERVICE_PORT_DEF 21
+#define FTP_SERVER_USER_NAME_MAX 30
+#define FTP_SERVER_USER_PASS_MAX FTP_SERVER_USER_NAME_MAX
+
+/*************************************************************
+ Definitions:enum,struct,union,class
+ *************************************************************/
+typedef enum
+{
+    FTP_STATE_NON,
+    FTP_STATE_CONNECTING,
+    FTP_STATE_CONNECTED, /* FTP connected. */
+    FTP_STATE_READY, /* FTP logn in success. */
+    FTP_STATE_CMD_PROCESS
+} mbtk_ftp_state_enum;
+
+typedef enum
+{
+    FTP_CMD_CONN, FTP_CMD_PORT,       // Active mode(IPV4).
+    FTP_CMD_EPRT,       // Active mode(IPV6).
+    FTP_CMD_PASV,       // Passive mode(IPV4).
+    FTP_CMD_EPSV,       // Passive mode(IPV6).
+    FTP_CMD_LIST,       // List files in current directory.
+    FTP_CMD_NLST,       // List files in current directory.
+    FTP_CMD_PWD,        // Get current directory.
+    FTP_CMD_CWD,        // Set current directory.
+    FTP_CMD_MKD,        // Create directory.
+    FTP_CMD_RMD,        // Remove directory.
+    FTP_CMD_STAT,       // Get service status.
+    FTP_CMD_TYPE,       // Set data type[A-Ascii,E-EBCDIC,I-Binary].
+    FTP_CMD_SIZE,       // Get file size.
+    FTP_CMD_DELE,       // Delete file.
+    FTP_CMD_MDTM,       // Get file modify time.
+    FTP_CMD_PUT,       // Update file.
+    FTP_CMD_GET,       // Download file.
+    FTP_CMD_QUIT
+} mbtk_ftp_cmd_enum;
+
+typedef enum
+{
+    FTP_ERR_SUCCESS,
+    FTP_ERR_PARAM_SET,
+    FTP_ERR_CLI_FULL,
+    FTP_ERR_NET_CONN,
+    FTP_ERR_LOGIN_DENIED,
+    FTP_ERR_NET_READ,
+    FTP_ERR_NET_WRITE,
+    FTP_ERR_NET_CLOSE,
+    FTP_ERR_NET_TIMEOUT,
+    FTP_ERR_FILE_NO_FOUND,
+    FTP_ERR_FILE_EXIST,
+    FTP_ERR_DATA_SOCK_BUSY,
+    FTP_ERR_EFS_FILE,
+    FTP_ERR_UNKNOWN
+} mbtk_ftp_error_enum;
+
+typedef enum
+{
+    FTP_MODE_PASSIVE, FTP_MODE_ACTION
+} mbtk_ftp_mode_enum;
+
+typedef enum
+{
+    FTP_DATA_TYPE_A,    // Ascii
+    FTP_DATA_TYPE_E,    // EBCDIC
+    FTP_DATA_TYPE_I     // Binary
+} mbtk_ftp_data_type_enum;
+
+typedef enum
+{
+    FTP_SOCK_CTRL = 0,
+    FTP_SOCK_DATA,
+    FTP_SOCK_MAX
+} mbtk_ftp_sock_type_enum;
+
+typedef int mbtk_ftp_handle;
+typedef void (*mbtk_data_cb_func)(void *data, uint32 data_len);
+
+typedef struct
+{
+    sint16 fd;
+    uint8 host[MBTK_FTP_IP_MAX + 1];
+    uint16 port;
+} mbtk_ftp_sock_s;
+
+typedef struct
+{
+    int fd;
+    uint8 remote_name[MBTK_FTP_FILE_NAME_MAX * 2 + 1];
+    uint8 local_name[MBTK_FTP_FILE_NAME_MAX * 2 + 1];
+    uint8 modify_time[20];
+    mbtk_data_cb_func data_cb;
+    bool is_download;
+    uint32 size_count;
+    uint32 size_send;
+} mbtk_ftp_file_trans_info_s;
+
+typedef struct
+{
+    uint8 name[FTP_SERVER_USER_NAME_MAX + 1];
+    uint8 pass[FTP_SERVER_USER_PASS_MAX + 1];
+} mbtk_ftp_user_info_s;
+
+typedef enum
+{
+    FTP_AUTH_TYPE_NON,
+    FTP_AUTH_TYPE_IMPLICIT,
+    FTP_AUTH_TYPE_EXPLICIT_SSL,
+    FTP_AUTH_TYPE_EXPLICIT_TLS
+} mbtk_ftp_auth_type_enum;
+
+typedef struct
+{
+    mbtk_ftp_handle handle; // 1 - 5
+    mbtk_ftp_auth_type_enum auth_type;
+//    bool ssl_enable;
+//    bool is_ipv6;
+//    bool use_cert;
+    bool is_trans;      // Is download or update.
+    bool is_data_sock_busy;      // Data socket is busy.
+    //bool should_reconn; // Should reconnect.
+
+    mbtk_ftp_user_info_s user;
+    mbtk_ftp_state_enum state;
+    //mbtk_ftp_sock_s ctrl_sock;
+    mbtk_ftp_file_trans_info_s file_trans;
+    //sint16 data_sock_fd;
+    mbtk_ftp_mode_enum data_mode;
+    mbtk_net_info_s net_info;
+    mbtk_sock_info_s sock_info[FTP_SOCK_MAX];
+    mbtk_init_info ftp_ssl_info;
+    mbtk_init_info ftp_ssl_info_data;
+    mbtk_sock_handle ftp_ssl_handle;
+    mbtk_sock_handle ftp_ssl_handle_data;
+    mbtk_sock_info *ftp_sock_ssl_info;
+    mbtk_sock_info *ftp_sock_ssl_info_data;
+    mbtk_sock_session session;
+    mbtk_sock_session session_data;
+
+} mbtk_ftp_info_s;
+
+typedef struct mbtk_ftp_dir_info
+{
+    uint8 name[MBTK_FTP_FILE_NAME_MAX + 1];
+    bool is_file;
+    uint32 size;    // Directory is 0
+
+    struct mbtk_ftp_dir_info *next;
+    void (*ftp_ls_cb_typedef)(void *file_list_cb);
+} mbtk_ftp_file_info_s;
+
+/*************************************************************
+ Extern variables
+ *************************************************************/
+mbtk_ftp_handle mbtk_ftp_init(const void* host, uint16 port, mbtk_ftp_auth_type_enum auth_type,
+                              bool is_ipv6, bool use_cert);
+mbtk_ftp_error_enum mbtk_ftp_reconfig(mbtk_ftp_handle handle,const void* host, uint16 port, mbtk_ftp_auth_type_enum auth_type,
+                                      bool is_ipv6, bool use_cert);
+mbtk_ftp_error_enum mbtk_ftp_deinit(mbtk_ftp_handle handle);
+mbtk_ftp_error_enum mbtk_ftp_quit(mbtk_ftp_handle handle);
+mbtk_ftp_info_s* mbtk_ftp_info_get(mbtk_ftp_handle handle);
+mbtk_ftp_error_enum mbtk_ftp_login(mbtk_ftp_handle handle, void *user,
+                                   void *pass);
+mbtk_ftp_error_enum mbtk_ftp_net_close(mbtk_ftp_handle handle);
+mbtk_ftp_error_enum mbtk_ftp_pwd(mbtk_ftp_handle handle, void *path);
+mbtk_ftp_error_enum mbtk_ftp_cd(mbtk_ftp_handle handle, void *path);
+mbtk_ftp_error_enum mbtk_ftp_dir_ls(mbtk_ftp_handle handle,
+                                    mbtk_ftp_file_info_s *list_head);
+uint32 mbtk_ftp_file_size(mbtk_ftp_handle handle, void *path);
+mbtk_ftp_error_enum mbtk_ftp_file_del(mbtk_ftp_handle handle, void *path);
+mbtk_ftp_error_enum mbtk_ftp_dir_mkdir(mbtk_ftp_handle handle, void *path);
+mbtk_ftp_error_enum mbtk_ftp_dir_rmdir(mbtk_ftp_handle handle, void *path);
+mbtk_ftp_error_enum mbtk_ftp_mode_set(mbtk_ftp_handle handle,
+                                      mbtk_ftp_mode_enum mode);
+mbtk_ftp_error_enum mbtk_ftp_data_type_set(mbtk_ftp_handle handle,
+        mbtk_ftp_data_type_enum data_type);
+uint32 mbtk_ftp_download_start(mbtk_ftp_handle handle, void *remote_path,
+                               void *local_path, mbtk_data_cb_func data_cb);
+uint32 mbtk_ftp_download_continue(mbtk_ftp_handle handle);
+int mbtk_ftp_upload_start(mbtk_ftp_handle handle, const void *remote_path,
+                          const void *local_path, uint32 size_byte);
+int mbtk_ftp_upload_send(mbtk_ftp_handle handle, const void *data,uint16 data_len);
+mbtk_ftp_error_enum mbtk_ftp_trans_reset(mbtk_ftp_handle handle);
+mbtk_ftp_handle mbtk_ftp_upload_end(mbtk_ftp_handle handle);
+
+#ifdef MBTK_PLATFORM_QCOMM
+int mbtk_ftp_task_handle_set(mbtk_ftp_handle handle,sint15 task_handle);
+mbtk_ftp_error_enum mbtk_ftp_get_ip_and_port(char *ipBuf_out,
+                                    int *port,int iptype);
+
+#endif
+
+/*************************************************************
+ Public Function Declaration
+ *************************************************************/
+
+#endif /* _MBTK_FTP_H */
+
diff --git a/mbtk/include/mbtk/mbtk_gnss.h b/mbtk/include/mbtk/mbtk_gnss.h
new file mode 100755
index 0000000..c85c5a1
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_gnss.h
@@ -0,0 +1,114 @@
+/*
+* mbtk_gnss.h
+*
+* MBTK GNSS API header.
+*
+* Author : lb
+* Date   : 2024/7/11 16:14:33
+*/
+#ifndef __MBTK_GNSS_H
+#define __MBTK_GNSS_H
+#include <pthread.h>
+
+#include "mbtk_type.h"
+
+// Refor to : mbtk_gnss_ind_set() gnss_ind
+#define MBTK_GNSS_IND_LOCATION (1)      // 1
+#define MBTK_GNSS_IND_NMEA (1 << 1)     // 2
+
+// Refor to : mbtk_gnss_open() type
+#define GNSS_PRINT_PORT_UART1       1           // 1
+#define GNSS_PRINT_PORT_USB_NMEA    (1<<1)      // 2
+#define GNSS_PRINT_PORT_USB_AT      (1<<2)      // 4
+#define GNSS_PRINT_PORT_TTY_AT      (1<<3)      // 8
+
+#define MBTK_IND_START_FLAG     0xFF
+#define MBTK_IND_END_FLAG       0xEE
+#define MBTK_IND_LOCATION_TAG   "IND_LOC:"
+#define MBTK_IND_NMEA_TAG       "IND_NMEA:"
+
+#if 1//MBTK_GNSS_LOCATION_INFO
+#define MBTK_GNSS_LOG_ENABLED 0
+
+#define MAX_NMEA_TOKENS  32
+#define NMEA_RMC_PARAM_NUM 14
+#define NMEA_GGA_PARAM_NUM 15
+
+/** GpsLocation has valid latitude and longitude. */
+#define GNSS_LOCATION_HAS_LAT_LONG   0x00000001
+/** GpsLocation has valid altitude. */
+#define GNSS_LOCATION_HAS_ALTITUDE   0x00000002
+/** GpsLocation has valid speed. */
+#define GNSS_LOCATION_HAS_SPEED      0x00000004
+/** GpsLocation has valid bearing. */
+#define GNSS_LOCATION_HAS_BEARING    0x00000008
+/** GpsLocation has valid timestamp. */
+#define GNSS_LOCATION_HAS_TIMESTAMP  0x00000010
+/** GpsLocation has valid all. */
+#define GNSS_LOCATION_HAS_ALL  0x0000001F
+#endif
+
+typedef uint32 mbtk_gnss_handle;
+
+typedef void (*mbtk_gnss_callback_func)(uint32 ind_type, const void* data, uint32 data_len);
+
+typedef enum {
+    GNSS_ERR_OK,
+    GNSS_ERR_CLI_FULL,
+    GNSS_ERR_UNKNOWN_HANDLE,
+    GNSS_ERR_UNSUPPORT,
+    GNSS_ERR_TIMEOUT,
+    GNSS_ERR_ARG,
+    GNSS_ERR_CHECKSUM,
+    GNSS_ERR_SET_BUSY,
+    GNSS_ERR_DL_FW,
+    GNSS_ERR_OPEN_DEV,
+    GNSS_ERR_FORMAT,
+    GNSS_ERR_BUSY,
+    GNSS_ERR_EPH_GET_FAIL,
+    GNSS_ERR_EPH_INJECT_FAIL,
+
+    GNSS_ERR_UNKNOWN
+} gnss_err_enum;
+
+#if 1//MBTK_GNSS_LOCATION_INFO
+typedef struct {
+        const char*  head;
+        const char*  end;
+} mbtk_token;
+
+typedef struct {
+        int     count;
+        mbtk_token   tokens[ MAX_NMEA_TOKENS ];
+} mbtk_nmeatokenizer;
+
+typedef struct {
+    uint32      flags;
+    double      latitude;               /**<   Latitude in degrees. */
+    double      longitude;              /**<   Longitude in degrees. */
+    double      altitude;               /**<   Altitude in meters above the WGS 84 reference ellipsoid. */
+    float       speed;                  /**<   Speed in meters per second. */
+    float       bearing;                /**<   Heading in degrees. */
+    int64_t     timestamp;              /**<   Timestamp for the location fix in UTC million-second base.  */
+} mbtk_gnss_location_info_t;
+#endif
+
+gnss_err_enum mbtk_gnss_init(mbtk_gnss_callback_func cb);
+
+gnss_err_enum mbtk_gnss_deinit();
+
+gnss_err_enum mbtk_gnss_open(int type, int timeout);
+
+gnss_err_enum mbtk_gnss_close(int timeout);
+
+gnss_err_enum mbtk_gnss_setting(const char *setting_cmd, int timeout);
+
+gnss_err_enum mbtk_gnss_dl(const char *fw_path, int timeout);
+
+gnss_err_enum mbtk_gnss_ind_set(uint32 gnss_ind, int timeout);
+
+gnss_err_enum mbtk_gnss_eph_download(int timeout);
+
+gnss_err_enum mbtk_gnss_eph_inject(int timeout);
+
+#endif /* __MBTK_GNSS_H */
diff --git a/mbtk/include/mbtk/mbtk_gnss_5311.h b/mbtk/include/mbtk/mbtk_gnss_5311.h
new file mode 100755
index 0000000..f9badcd
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_gnss_5311.h
@@ -0,0 +1,64 @@
+#ifndef __MBTK_GNSS_5311_H__
+#define __MBTK_GNSS_5311_H__
+
+#include "mbtk_log.h"
+
+typedef void (*mbtk_gnss_nmea_func_t)(void *nmea_data, int nmea_data_len);
+
+typedef enum {
+    ASR_GPS_INITIAL_SUCCESS             = 0,
+    ASR_GPS_INITIAL_FAILED              = 1,
+    ASR_GPS_INITIALED                   = 2,
+    ASR_GPS_DOWNLOAD_SUCCESS            = 3,
+    ASR_GPS_DOWNLOAD_FAIL               = 4,
+    ASR_GPS_SEND_DATA_SUCCESS           = 5,
+    ASR_GPS_SEND_DATA_FAIL              = 6,
+    ASR_GPS_DEINIT_SUCCESS,
+    ASR_GPS_DEINIT_FAIL,
+}USER_CB_STATE_T;
+
+typedef enum
+{
+    MBTK_GNSS_RESULT_SUCCESS = 0,
+    MBTK_GNSS_RESULT_FAIL,
+    MBTK_GNSS_RESULT_OPEN_SUCCESS,
+    MBTK_GNSS_RESULT_OPEN_FAIL,
+    MBTK_GNSS_RESULT_DOWNLOAD_SUCCESS,
+    MBTK_GNSS_RESULT_DOWNLOAD_FAIL,
+    MBTK_GNSS_RESULT_SEND_SUCCESS,
+    MBTK_GNSS_RESULT_SEND_FAIL,
+    MBTK_GNSS_RESULT_CLOSE_SUCCESS,
+    MBTK_GNSS_RESULT_CLOSE_FAIL,
+    MBTK_GNSS_RESULT_TIMEOUT,
+    MBTK_GNSS_RESULT_UNKNOWN_ERROR
+}MBTK_GNSS_5311_RESULT_TYPE;
+
+typedef enum
+{
+    MBTK_GNSS_MSG_LOCATION_INFO = 0,
+    MBTK_GNSS_MSG_NMEA_INFO
+}MBTK_GNSS_MSG_INFO_TYPE;
+
+typedef struct
+{
+    int                     init;
+    int                     fd;
+    mbtk_gnss_nmea_func_t   callbacks;
+    pthread_t               thread;
+    int                     control[2];
+    MBTK_GNSS_MSG_INFO_TYPE gnss_msg_state;
+}mbtk_gnss_nmea_status;
+
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_init(void);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_deinit(void);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_open(void);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_close(void);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_sleep(void);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_wakeup(void);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_param_config(const char *param_buf, int param_buf_len);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_get_status(const char *status_buf, int status_buf_len, int *get_status_len);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_add_nmea_out_func(mbtk_gnss_nmea_func_t cb);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_set_nmea_out_type(MBTK_GNSS_MSG_INFO_TYPE type);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_5311_download_tle(char *host, int alam_flag);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_injectEphemeris(void);
+#endif
\ No newline at end of file
diff --git a/mbtk/include/mbtk/mbtk_gnss_6228.h b/mbtk/include/mbtk/mbtk_gnss_6228.h
new file mode 100755
index 0000000..027eb48
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_gnss_6228.h
@@ -0,0 +1,64 @@
+/**
+ *   \file mbtk_gnss_internal.h
+ *   \brief A Documented file.
+ *
+ *  Detailed description
+ *   \Author:  Sniper <js.wang@mobiletek.cn>
+ *   \Version: 1.0.0
+ *   \Date: 2022-03-17
+ */
+
+#ifndef __MBTK_GNSS_H__
+#define __MBTK_GNSS_H__
+
+#define MOPEN_GNSS_NMEA_MAX_LENGTH  255                 /**  NMEA string maximum length. */
+
+typedef uint32 mbtk_gnss_client_handle;
+
+typedef void (*mbtk_gnss_handler_func_t)
+(
+    mbtk_gnss_client_handle  h_loc,
+    int   e_msg_id,
+    void                    *pv_data,
+    void                    *context_ptr
+);
+
+struct mbtk_gnss_location_info_t
+{
+    uint32_t    size;                   /**<   Set to the size of mcm_gps_location_t. */
+    int flags; /**<   Contains GPS location flags bits. */
+    int position_source;  /**<   Provider indicator for HYBRID or GPS. */
+    double      latitude;               /**<   Latitude in degrees. */
+    double      longitude;              /**<   Longitude in degrees. */
+    double      altitude;               /**<   Altitude in meters above the WGS 84 reference ellipsoid. */
+    float       speed;                  /**<   Speed in meters per second. */
+    float       bearing;                /**<   Heading in degrees. */
+    float       accuracy;               /**<   Expected accuracy in meters. */
+    int64_t     timestamp;              /**<   Timestamp for the location fix in UTC million-second base.  */
+    int32_t     is_indoor;              /**<   Location is indoors. */
+    float       floor_number;           /**<   Indicates the floor number. */
+};
+
+typedef struct
+{
+    int64_t     timestamp;                          /**<   System Timestamp, marked for when got the nmea data */
+    int         length;                             /**<   NMEA string length. */
+    char        nmea[MOPEN_GNSS_NMEA_MAX_LENGTH + 1];   /**<   NMEA string.*/
+} mbtk_gnss_nmea_info_t;  /* Message */
+
+int mbtk_gnss_client_init(uint32 *ph_gnss);
+int mbtk_gnss_client_deinit(uint32 h_gnss);
+int mbtk_gnss_add_rx_msg_handler(uint32 h_gnss, mbtk_gnss_handler_func_t handler_ptr);
+int mbtk_gnss_set_mode(uint32 h_gnss, int mode);
+int mbtk_gnss_set_system_config(uint32 h_gnss, int mode);
+int mbtk_gnss_set_nema_config(uint32 h_gnss, int mode);
+int mbtk_gnss_download_tle(void);
+int mbtk_gnss_injects_aidpos(uint32 h_gnss);
+int mbtk_gnss_firmware_update(void);
+int mbtk_gnss_dev_reset(uint32 h_gnss, int type, int mode);
+int mbtk_gnss_print_version(uint32 h_gnss);
+
+
+int mbtk_at_gnss_start_ttff(int type, int timeout_sec, int count);
+
+#endif
diff --git a/mbtk/include/mbtk/mbtk_gpio.h b/mbtk/include/mbtk/mbtk_gpio.h
new file mode 100755
index 0000000..9b6a8c1
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_gpio.h
@@ -0,0 +1,33 @@
+/*
+* mbtk_gpio.h
+*
+* MBTK GPIO process header.
+*
+* Author : lb
+* Date   : 2024/6/14 14:57:56
+*/
+#ifndef _MBTK_GPIO_H
+#define _MBTK_GPIO_H
+
+typedef enum {
+    MBTK_GPIO_DIRECT_UNKNOWN,
+    MBTK_GPIO_DIRECT_IN,
+    MBTK_GPIO_DIRECT_OUT
+} mbtk_gpio_direct_t;
+
+mbtk_gpio_direct_t mbtk_gpio_direct_get(int gpio);
+
+int mbtk_gpio_direct_set(int gpio, mbtk_gpio_direct_t dir);
+
+int mbtk_gpio_value_get(int gpio);
+
+int mbtk_gpio_value_set(int gpio, mbtk_gpio_direct_t dir, int value);
+
+int mbtk_gpio_value_set_2(int gpio, int value);
+
+int mbtk_gpio_export(int gpio);
+
+int mbtk_gpio_unexport(int gpio);
+
+
+#endif /* _MBTK_GPIO_H */
diff --git a/mbtk/include/mbtk/mbtk_http.h b/mbtk/include/mbtk/mbtk_http.h
new file mode 100755
index 0000000..bbd0130
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_http.h
@@ -0,0 +1,367 @@
+/*************************************************************
+Description:
+    MBTK HTTP Header file.
+Author:
+    LiuBin
+Date:
+    2020/4/29 17:25:55
+*************************************************************/
+#ifndef _MBTK_HTTP_2_H
+#define _MBTK_HTTP_2_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdio.h>
+#include "mbtk_type.h"
+#include "mbtk_sock2.h"
+
+
+/*************************************************************
+    Constants and Macros
+*************************************************************/
+#define MBTK_HTTP_URI_MAX 512
+#define MBTK_HTTP_HOST_MAX 50
+#define MBTK_HTTP_URL_MAX (MBTK_HTTP_URI_MAX + MBTK_HTTP_HOST_MAX)
+#define MBTK_HTTP_PORT_DEF 80
+#define MBTK_HTTPS_PORT_DEF 443
+#define HTTP_HANDLE_MAX 3
+#define HTTP_SESSION_MAX 5
+#define HTTP_REQUEST_HEADER_MAX 30
+#define HTTP_RESPONSE_HEADER_MAX 30
+#define HTTP_CONTENT_LEN_MAX 1024
+#define HTTP_MSG_LEN_MAX 1024
+
+#define HTTP_IPC_MSG_PATH "/dev"
+#define HTTP_IPC_MSG_ID 'H'
+
+/*************************************************************
+    Definitions:enum,struct,union,class
+*************************************************************/
+typedef enum {
+    HTTP_VERSION_1_0 = 0,
+    HTTP_VERSION_1_1,
+    HTTP_VERSION_2,
+    HTTP_VERSION_3
+} mbtk_http_version_enum;
+
+typedef enum {
+    HTTP_OPTION_HEAD = 0,
+    HTTP_OPTION_GET,
+    HTTP_OPTION_POST,
+    HTTP_OPTION_PUT,
+    HTTP_OPTION_DELETE,
+    HTTP_OPTION_OPTIONS,
+    HTTP_OPTION_TRACE,
+    HTTP_OPTION_CONNECT,
+    HTTP_OPTION_LINK,
+    HTTP_OPTION_UNLINK
+} mbtk_http_option_enum;
+
+#if 0
+typedef enum {
+    HTTP_HEADER_GENERAL = 0,
+    HTTP_HEADER_REQUEST,
+    HTTP_HEADER_RESPONSE,
+    HTTP_HEADER_ENTITY,
+    HTTP_HEADER_OTHERS
+} mbtk_http_header_type_e;
+
+typedef enum {
+    // General field start.
+    HTTP_HEADER_INDEX_CACHE_CONTROL = 0,
+    HTTP_HEADER_INDEX_CONNECTION,
+    HTTP_HEADER_INDEX_DATE,
+    HTTP_HEADER_INDEX_PRAGMA,
+    HTTP_HEADER_INDEX_TRAILER,
+    HTTP_HEADER_INDEX_TRANSFER_ENCODING,
+    HTTP_HEADER_INDEX_UPGRADE,
+    HTTP_HEADER_INDEX_VIA,
+    HTTP_HEADER_INDEX_WARNING,
+    // General field end.
+    // Request field start.
+    HTTP_HEADER_INDEX_ACCEPT,
+    HTTP_HEADER_INDEX_ACCEPT_CHARSET,
+    HTTP_HEADER_INDEX_ACCEPT_ENCODING,
+    HTTP_HEADER_INDEX_ACCEPT_LANGUAGE,
+    HTTP_HEADER_INDEX_AUTHORIZATION,
+    HTTP_HEADER_INDEX_EXPECT,
+    HTTP_HEADER_INDEX_FROM,
+    HTTP_HEADER_INDEX_HOST,
+    HTTP_HEADER_INDEX_IF_MATCH,
+    HTTP_HEADER_INDEX_IF_MODIFIED_SINCE,
+    HTTP_HEADER_INDEX_IF_NONE_MATCH,
+    HTTP_HEADER_INDEX_IF_RANGE,
+    HTTP_HEADER_INDEX_IF_UNMODIFIED_SINCE,
+    HTTP_HEADER_INDEX_MAX_FORWARDS,
+    HTTP_HEADER_INDEX_PROXY_AUTHORIZATION,
+    HTTP_HEADER_INDEX_RANGE,
+    HTTP_HEADER_INDEX_REFERER,
+    HTTP_HEADER_INDEX_TE,
+    HTTP_HEADER_INDEX_USER_AGENT,
+    // Request field end.
+    // Response field start.
+    HTTP_HEADER_INDEX_ACCEPT_RANGES,
+    HTTP_HEADER_INDEX_AGE,
+    HTTP_HEADER_INDEX_ETAG,
+    HTTP_HEADER_INDEX_LOCATION,
+    HTTP_HEADER_INDEX_PROXY_AUTHENTICATE,
+    HTTP_HEADER_INDEX_RETRY_AFTER,
+    HTTP_HEADER_INDEX_SERVER,
+    HTTP_HEADER_INDEX_VARY,
+    HTTP_HEADER_INDEX_WWW_AUTHENTICATE,
+    // Response field end.
+    // Entity field start.
+    HTTP_HEADER_INDEX_ALLOW,
+    HTTP_HEADER_INDEX_CONTENT_ENCODING,
+    HTTP_HEADER_INDEX_CONTENT_LANGUAGE,
+    HTTP_HEADER_INDEX_CONTENT_LENGTH,
+    HTTP_HEADER_INDEX_CONTENT_LOCATION,
+    HTTP_HEADER_INDEX_CONTENT_MD5,
+    HTTP_HEADER_INDEX_CONTENT_RANGE,
+    HTTP_HEADER_INDEX_CONTENT_TYPE,
+    HTTP_HEADER_INDEX_EXPIRES,
+    HTTP_HEADER_INDEX_LAST_MODIFIED,
+    // Entity field end.
+    // Other field start.
+    HTTP_HEADER_INDEX_SET_COOKIE,
+    HTTP_HEADER_INDEX_COOKIE,
+    HTTP_HEADER_INDEX_X_FRAME_OPTIONS,
+    HTTP_HEADER_INDEX_X_XSS_PROTECTION,
+    HTTP_HEADER_INDEX_DNT,
+    HTTP_HEADER_INDEX_P3P
+    // Other field end.
+} mbtk_http_header_index_e;
+#endif
+
+typedef enum {
+    HTTP_SESSION_STATE_NON = 0,
+    HTTP_SESSION_STATE_CONN,
+    HTTP_SESSION_STATE_WRITE_HEADER,
+    HTTP_SESSION_STATE_WRITE_CONTENT,
+    HTTP_SESSION_STATE_WRITE_END,
+    HTTP_SESSION_STATE_READ_HEADER,
+    HTTP_SESSION_STATE_READ_CONTENT,
+    HTTP_SESSION_STATE_READ_END
+} http_session_state_e;
+
+typedef enum {
+    MBTK_HTTP_STATE_CODE_200 = 200,
+    MBTK_HTTP_STATE_CODE_204 = 204,
+    MBTK_HTTP_STATE_CODE_206 = 206,
+    MBTK_HTTP_STATE_CODE_301 = 301,
+    MBTK_HTTP_STATE_CODE_302 = 302,
+    MBTK_HTTP_STATE_CODE_303 = 303,
+    MBTK_HTTP_STATE_CODE_304 = 304,
+    MBTK_HTTP_STATE_CODE_307 = 307,
+    MBTK_HTTP_STATE_CODE_400 = 400,
+    MBTK_HTTP_STATE_CODE_401 = 401,
+    MBTK_HTTP_STATE_CODE_403 = 403,
+    MBTK_HTTP_STATE_CODE_404 = 404,
+    MBTK_HTTP_STATE_CODE_500 = 500,
+    MBTK_HTTP_STATE_CODE_503 = 503
+} mbtk_http_state_code_e;
+
+typedef enum {
+    MBTK_HTTP_DATA_NON = 0,
+    MBTK_HTTP_DATA_HEADER,
+    MBTK_HTTP_DATA_CONTENT,
+    MBTK_HTTP_DATA_COMPLETE
+} mbtk_http_data_type_enum;
+
+typedef void (*mbtk_http_data_callback_func)(
+    int session_id, mbtk_http_data_type_enum type,
+    void *data,int data_len);
+
+typedef struct mbtk_http_header {
+    char name[30];
+    char *value;
+} mbtk_http_header_t;
+
+typedef struct {
+    int header_cnt;
+    mbtk_http_header_t *req_h[HTTP_REQUEST_HEADER_MAX];
+
+    int content_len;    // Post content lenght
+    int content_len_send; // Post content lenght for send.
+    char *content;
+} mbtk_http_session_req_t;
+
+typedef struct {
+    int state_code;
+    mbtk_http_version_enum version;
+
+    int content_length;
+    bool is_chunked;
+    int header_cnt;
+    mbtk_http_header_t *rsp_h[HTTP_RESPONSE_HEADER_MAX];
+} mbtk_http_session_rsp_t;
+
+typedef struct mbtk_http_session{
+    int handle_id;
+    int id;
+    int sock_fd;
+    int file_fd;
+    http_session_state_e state;
+    char host[MBTK_HTTP_HOST_MAX + 1];
+    mbtk_http_option_enum option;
+    mbtk_http_version_enum version;
+    char uri[MBTK_HTTP_URI_MAX + 1];
+    int port;
+    bool is_ssl;
+    bool ingnore_cert;  //FALSE:need cert
+
+    mbtk_http_session_req_t req;
+    mbtk_http_session_rsp_t rsp;
+} mbtk_http_session_t;
+
+typedef struct mbtk_http_handle{
+    int id;
+    bool show_rsp_header;
+    mbtk_http_data_callback_func data_cb;
+
+    int session_cnt;
+    mbtk_http_session_t *session[HTTP_SESSION_MAX];
+} mbtk_http_handle_t;
+
+#if 0
+typedef enum {
+    HTTP_MSG_SESSION_CREATE_REQ,
+    HTTP_MSG_SESSION_CREATE_RSP,
+    HTTP_MSG_SESSION_FREE_REQ,
+    HTTP_MSG_SESSION_FREE_RSP,
+    HTTP_MSG_SESSION_URL_SET_REQ,
+    HTTP_MSG_SESSION_URL_SET_RSP,
+    HTTP_MSG_SESSION_HEAD_SET_REQ,
+    HTTP_MSG_SESSION_HEAD_SET_RSP,
+    HTTP_MSG_SESSION_CONTENT_SET_REQ,
+    HTTP_MSG_SESSION_CONTENT_SET_RSP,
+    HTTP_MSG_SESSION_ACTION_REQ,
+    HTTP_MSG_SESSION_ACTION_RSP,
+    HTTP_MSG_SESSION_CONTENT_SEND_REQ,
+    HTTP_MSG_SESSION_CONTENT_SEND_RSP
+} mbtk_http_msg_type_enum;
+#endif
+
+typedef enum {
+    HTTP_MSG_SESSION_CREATE,
+    HTTP_MSG_SESSION_FREE,
+    HTTP_MSG_SESSION_HEAD_SET,
+    HTTP_MSG_SESSION_CONTENT_SET,
+    HTTP_MSG_SESSION_ACTION,
+    HTTP_MSG_SESSION_CONTENT_SEND,
+    HTTP_MSG_HANDLE_EXIT
+} mbtk_http_msg_type_enum;
+
+typedef enum {
+    MBTK_HTTP_ERR_SUCCESS,
+    MBTK_HTTP_ERR_UNKNOWN
+} mbtk_http_err_enum;
+
+typedef struct {
+    mbtk_http_msg_type_enum type;
+    int int_arg1;
+    int int_arg2;
+    char str_small[30];
+    char str_large[HTTP_MSG_LEN_MAX];
+} mbtk_http_msg_req_t;
+
+typedef struct {
+    mbtk_http_msg_type_enum type;
+    mbtk_http_err_enum err;
+
+    mbtk_http_data_type_enum data_type;
+    int buff_len;
+    char buff[HTTP_MSG_LEN_MAX];
+} mbtk_http_msg_rsp_t;
+
+/*************************************************************
+    Extern variables
+*************************************************************/
+#if 0
+const mbtk_http_header_field_t mbtk_http_headers[] = {
+    {HTTP_HEADER_INDEX_CACHE_CONTROL, HTTP_HEADER_GENERAL,"Cache-Control"},
+    {HTTP_HEADER_INDEX_CONNECTION, HTTP_HEADER_GENERAL,"Connection"},
+    {HTTP_HEADER_INDEX_DATE, HTTP_HEADER_GENERAL,"Date"},
+    {HTTP_HEADER_INDEX_PRAGMA, HTTP_HEADER_GENERAL,"Pragma"},
+    {HTTP_HEADER_INDEX_TRAILER, HTTP_HEADER_GENERAL,"Trailer"},
+    {HTTP_HEADER_INDEX_TRANSFER_ENCODING, HTTP_HEADER_GENERAL,"Transfer-Encoding"},
+    {HTTP_HEADER_INDEX_UPGRADE, HTTP_HEADER_GENERAL,"Upgrade"},
+    {HTTP_HEADER_INDEX_VIA, HTTP_HEADER_GENERAL,"Via"},
+    {HTTP_HEADER_INDEX_WARNING, HTTP_HEADER_GENERAL,"Warning"},
+    {HTTP_HEADER_INDEX_ACCEPT, HTTP_HEADER_REQUEST,"Accept"},
+    {HTTP_HEADER_INDEX_ACCEPT_CHARSET, HTTP_HEADER_REQUEST,"Accept-Charset"},
+    {HTTP_HEADER_INDEX_ACCEPT_ENCODING, HTTP_HEADER_REQUEST,"Accept-Encoding"},
+    {HTTP_HEADER_INDEX_ACCEPT_LANGUAGE, HTTP_HEADER_REQUEST,"Accept-Language"},
+    {HTTP_HEADER_INDEX_AUTHORIZATION, HTTP_HEADER_REQUEST,"Authorization"},
+    {HTTP_HEADER_INDEX_EXPECT, HTTP_HEADER_REQUEST,"Expect"},
+    {HTTP_HEADER_INDEX_FROM, HTTP_HEADER_REQUEST,"From"},
+    {HTTP_HEADER_INDEX_HOST, HTTP_HEADER_REQUEST,"Host"},
+    {HTTP_HEADER_INDEX_IF_MATCH, HTTP_HEADER_REQUEST,"If-Match"},
+    {HTTP_HEADER_INDEX_IF_MODIFIED_SINCE, HTTP_HEADER_REQUEST,"If-Modified-Since"},
+    {HTTP_HEADER_INDEX_IF_NONE_MATCH, HTTP_HEADER_REQUEST,"If-None-Match"},
+    {HTTP_HEADER_INDEX_IF_RANGE, HTTP_HEADER_REQUEST,"If-Range"},
+    {HTTP_HEADER_INDEX_IF_UNMODIFIED_SINCE, HTTP_HEADER_REQUEST,"If-Unmodified-Since"},
+    {HTTP_HEADER_INDEX_MAX_FORWARDS, HTTP_HEADER_REQUEST,"Max-Forwards"},
+    {HTTP_HEADER_INDEX_PROXY_AUTHORIZATION, HTTP_HEADER_REQUEST,"Proxy-Authorization"},
+    {HTTP_HEADER_INDEX_RANGE, HTTP_HEADER_REQUEST,"Range"},
+    {HTTP_HEADER_INDEX_REFERER, HTTP_HEADER_REQUEST,"Referer"},
+    {HTTP_HEADER_INDEX_TE, HTTP_HEADER_REQUEST,"TE"},
+    {HTTP_HEADER_INDEX_USER_AGENT, HTTP_HEADER_REQUEST,"User-Agent"},
+    {HTTP_HEADER_INDEX_ACCEPT_RANGES, HTTP_HEADER_RESPONSE,"Accept-Ranges"},
+    {HTTP_HEADER_INDEX_AGE, HTTP_HEADER_RESPONSE,"Age"},
+    {HTTP_HEADER_INDEX_ETAG, HTTP_HEADER_RESPONSE,"ETag"},
+    {HTTP_HEADER_INDEX_LOCATION, HTTP_HEADER_RESPONSE,"Location"},
+    {HTTP_HEADER_INDEX_PROXY_AUTHENTICATE, HTTP_HEADER_RESPONSE,"Proxy-Authenticate"},
+    {HTTP_HEADER_INDEX_RETRY_AFTER, HTTP_HEADER_RESPONSE,"Retry-After"},
+    {HTTP_HEADER_INDEX_SERVER, HTTP_HEADER_RESPONSE,"Server"},
+    {HTTP_HEADER_INDEX_VARY, HTTP_HEADER_RESPONSE,"Vary"},
+    {HTTP_HEADER_INDEX_WWW_AUTHENTICATE, HTTP_HEADER_RESPONSE,"WWW-Authenticate"},
+    {HTTP_HEADER_INDEX_ALLOW, HTTP_HEADER_ENTITY,"Allow"},
+    {HTTP_HEADER_INDEX_CONTENT_ENCODING, HTTP_HEADER_ENTITY,"Content-Encoding"},
+    {HTTP_HEADER_INDEX_CONTENT_LANGUAGE, HTTP_HEADER_ENTITY,"Content-Language"},
+    {HTTP_HEADER_INDEX_CONTENT_LENGTH, HTTP_HEADER_ENTITY,"Content-Length"},
+    {HTTP_HEADER_INDEX_CONTENT_LOCATION, HTTP_HEADER_ENTITY,"Content-Location"},
+    {HTTP_HEADER_INDEX_CONTENT_MD5, HTTP_HEADER_ENTITY,"Content-MD5"},
+    {HTTP_HEADER_INDEX_CONTENT_RANGE, HTTP_HEADER_ENTITY,"Content-Range"},
+    {HTTP_HEADER_INDEX_CONTENT_TYPE, HTTP_HEADER_ENTITY,"Content-Type"},
+    {HTTP_HEADER_INDEX_EXPIRES, HTTP_HEADER_ENTITY,"Expires"},
+    {HTTP_HEADER_INDEX_LAST_MODIFIED, HTTP_HEADER_ENTITY,"Last-Modified"},
+    {HTTP_HEADER_INDEX_SET_COOKIE, HTTP_HEADER_OTHERS,"Set-Cookie"},
+    {HTTP_HEADER_INDEX_COOKIE, HTTP_HEADER_OTHERS,"Cookie"},
+    {HTTP_HEADER_INDEX_X_FRAME_OPTIONS, HTTP_HEADER_OTHERS,"X-Frame-Options"},
+    {HTTP_HEADER_INDEX_X_XSS_PROTECTION, HTTP_HEADER_OTHERS,"X-XSS-Protection"},
+    {HTTP_HEADER_INDEX_DNT, HTTP_HEADER_OTHERS,"DNT"},
+    {HTTP_HEADER_INDEX_P3P, HTTP_HEADER_OTHERS,"P3P"}
+};
+#endif
+/*************************************************************
+    Public Function Declaration
+*************************************************************/
+int mbtk_http_handle_get(bool show_rsp_header,mbtk_http_data_callback_func data_cb);
+int mbtk_http_handle_free(int handle_id);
+int mbtk_http_session_create(int handle_id, mbtk_http_option_enum option,
+        mbtk_http_version_enum version);
+int mbtk_http_session_option_reset(int handle_id, int session_id, mbtk_http_option_enum option);
+int mbtk_http_session_ingnore_cert_set(int handle_id, int session_id, bool ingnore_cert);
+int mbtk_http_session_free(int handle_id,int session_id);
+int mbtk_http_session_url_set(int handle_id,int session_id,void *url);
+int mbtk_http_session_head_add(int handle_id,int session_id,
+        char *name, char *value);
+int mbtk_http_session_content_set(int handle_id,int session_id,
+        char *content,uint32 content_len);
+int mbtk_http_session_start(int handle_id,int session_id);
+int mbtk_http_session_content_send(int handle_id,int session_id,
+        char *data,int data_len);
+const mbtk_http_session_t* mbtk_http_session_get(int handle_id,int session_id);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _MBTK_HTTP_2_H */
+
+
diff --git a/mbtk/include/mbtk/mbtk_ifc.h b/mbtk/include/mbtk/mbtk_ifc.h
new file mode 100755
index 0000000..a839aea
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_ifc.h
@@ -0,0 +1,38 @@
+/*
+* MBTK Network Interface Control Header.
+*
+* Author : lb
+* Date   : 2021/8/20 13:18:00
+*
+*/
+#ifndef _MBTK_IFC_H
+#define _MBTK_IFC_H
+#include <netinet/in.h>
+
+int mbtk_ifc_open(void);
+int mbtk_ifc_close(void);
+int mbtk_ifc_up(const char *name);
+int mbtk_ifc_down(const char *name);
+int mbtk_ifc_set_addr(const char *name, in_addr_t addr, in_addr_t netmask);
+int mbtk_ifc_get_addr(const char *name, void *addr);
+int mbtk_ifc_get_hwaddr(const char *name, void *ptr);
+int mbtk_ifc_get_ifindex(const char *name, int *if_indexp);
+int mbtk_ifc_ip_config(const char *ifname, const char *ipv4, const char *mask, const char *gateway);
+int mbtk_ifc_set_netmask(const char *ifname, const char *netmask);
+
+int mbtk_ifc_configure1(const char *ifname,
+                        in_addr_t address,
+                        uint32_t prefixLength,
+                        in_addr_t gateway,
+                        in_addr_t netmask);
+
+int mbtk_ifc_configure2(const char *ifname,
+                        const char *ipv4,
+                        uint32_t prefixLength,
+                        const char *gateway,
+                        const char *netmask);
+
+int mbtk_ipv6_config(const char *ifname, const char *ipv6, uint32_t prefixLength);
+
+#endif /* _MBTK_IFC_H */
+
diff --git a/mbtk/include/mbtk/mbtk_info_api.h b/mbtk/include/mbtk/mbtk_info_api.h
new file mode 100755
index 0000000..f713273
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_info_api.h
@@ -0,0 +1,1473 @@
+/*

+*

+* Data : 2022/10/20 11:24:09

+* Author : LiuBin

+*/

+#ifndef _MBTK_INFO_API_H

+#define _MBTK_INFO_API_H

+#include <netinet/in.h>

+

+#include "mbtk_type.h"

+#include "mbtk_list.h"

+#include "mbtk_log.h"

+#include "mbtk_utils.h"

+#include "mbtk_pdu_sms.h"

+

+#ifndef UNUSED

+#define UNUSED(a)    (void)(a)

+#endif

+

+// LOG_DEBUG_LEVEL 7

+#define LOG LOGI

+

+#define RIL_MAX_NUMBER_LEN 40

+#define MBTK_ECALL_MSD_LEN_MAX      600

+

+#define CELL_NUM_MAX 50

+#define APN_STR_MAX 128

+#if (defined(MBTK_AF_SUPPORT) || defined(MBTK_ALL_CID_SUPPORT))

+#define MBTK_APN_CID_MIN 1

+#else

+// 2 - 7

+#define MBTK_APN_CID_MIN 2

+#endif

+#define MBTK_APN_CID_MAX 7

+#define MBTK_DATA_CALL_TIMEOUT_DEFAULT 10  // 10s

+

+#define MBTK_APN_NAME_SIZE 150+1

+#define MBTK_APN_USERNAME_SIZE 127+1

+#define MBTK_APN_PASSWORD_SIZE 127+1

+#define MBTK_APN_TYPE_SIZE 127+1

+

+

+

+typedef void (*mbtk_info_callback_func)(const void* data, int data_len);

+

+typedef enum {

+    MBTK_TIME_TYPE_CELL = 0,

+    MBTK_TIME_TYPE_NTP,

+    MBTK_TIME_TYPE_USER

+} mbtk_time_type_enum;

+

+typedef enum {

+    MBTK_ACTIVE,

+    MBTK_HELD,

+    MBTK_DIALING,

+    MBTK_ALERTING,

+    MBTK_INCOMING,

+    MBTK_WAITING,

+    MBTK_OFFERING,

+} mbtk_call_stat_enum;

+

+typedef enum {
+    MBTK_ECALL_CFG_ITEM_T3 = 0,         // ms

+    MBTK_ECALL_CFG_ITEM_T5,             // ms

+    MBTK_ECALL_CFG_ITEM_T6,             // ms

+    MBTK_ECALL_CFG_ITEM_T7,             // ms

+    MBTK_ECALL_CFG_ITEM_TH,             // ms

+    MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK,     // T9       // 5

+    MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN,     // T2
+    MBTK_ECALL_CFG_ITEM_TIMER_DEREG,    // T10
+    MBTK_ECALL_CFG_ITEM_TIMER_DIAL,     // "dial"
+    MBTK_ECALL_CFG_ITEM_TIMER_REDIAL,   // "redialtmr"
+    MBTK_ECALL_CFG_ITEM_TIMER_SMS,      // "sms"        // 10

+    MBTK_ECALL_CFG_ITEM_REDIALCNT,      // "redialcnt"
+    MBTK_ECALL_CFG_ITEM_SMSPROCESS,     // "smsprocess"
+    MBTK_ECALL_CFG_ITEM_SMSMSDCNT,       // "smsmsdcnt"

+

+    MBTK_ECALL_CFG_ITEM_MAX

+} mbtk_ecall_cfg_item_enum;

+

+#define MBTK_ECALL_CFG_T3   (1 << MBTK_ECALL_CFG_ITEM_T3)       // ms

+#define MBTK_ECALL_CFG_T5   (1 << MBTK_ECALL_CFG_ITEM_T5)       // ms

+#define MBTK_ECALL_CFG_T6   (1 << MBTK_ECALL_CFG_ITEM_T6)       // ms

+#define MBTK_ECALL_CFG_T7   (1 << MBTK_ECALL_CFG_ITEM_T7)       // ms

+#define MBTK_ECALL_CFG_TH   (1 << MBTK_ECALL_CFG_ITEM_TH)       // ms

+#define MBTK_ECALL_CFG_TIMER_CALLBACK   (1 << MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK)   // T9

+#define MBTK_ECALL_CFG_TIMER_CLEARDOWN  (1 << MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN)  // T2

+#define MBTK_ECALL_CFG_TIMER_DEREG  (1 << MBTK_ECALL_CFG_ITEM_TIMER_DEREG)      // T10

+#define MBTK_ECALL_CFG_TIMER_DIAL   (1 << MBTK_ECALL_CFG_ITEM_TIMER_DIAL)     // "dial"

+#define MBTK_ECALL_CFG_TIMER_REDIAL (1 << MBTK_ECALL_CFG_ITEM_TIMER_REDIAL)  // "redialtmr"

+#define MBTK_ECALL_CFG_TIMER_SMS    (1 << MBTK_ECALL_CFG_ITEM_TIMER_SMS)  // "sms"        // 10

+#define MBTK_ECALL_CFG_REDIALCNT    (1 << MBTK_ECALL_CFG_ITEM_REDIALCNT)  // "redialcnt"

+#define MBTK_ECALL_CFG_SMSPROCESS   (1 << MBTK_ECALL_CFG_ITEM_SMSPROCESS)  // "smsprocess"

+#define MBTK_ECALL_CFG_SMSMSDCNT    (1 << MBTK_ECALL_CFG_ITEM_SMSMSDCNT)  // "smsmsdcnt"

+

+#define MBTK_VOICE_END_REASON_UNKNOWN "0 " 

+#define MBTK_VOICE_END_REASON_UNASSIGNED_NUMBER "1 " 

+#define MBTK_VOICE_END_REASON_NO_ROUTE_DES "3 " 

+#define MBTK_VOICE_END_REASON_CHANNEL_UNACCEPTABLE "6 " 

+#define MBTK_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING "8 " 

+#define MBTK_VOICE_END_REASON_NORMAL_CALL_CLEARING "16 " 

+#define MBTK_VOICE_END_REASON_USER_BUSY "17 " 

+#define MBTK_VOICE_END_REASON_NO_USER_RESPONDING "18 " 

+#define MBTK_VOICE_END_REASON_USER_ALERTING_NO_ANSWER "19 " 

+#define MBTK_VOICE_END_REASON_CALL_REJECTED "21 " 

+#define MBTK_VOICE_END_REASON_NUMBER_CHANGED "22 " 

+#define MBTK_VOICE_END_REASON_PREEMPTION "25 " 

+#define MBTK_VOICE_END_REASON_NON_SELECTED_USER_CLEARING "26 " 

+#define MBTK_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER "27 " 

+#define MBTK_VOICE_END_REASON_INVALID_NUMBER_FORMAT "28 " 

+#define MBTK_VOICE_END_REASON_FACILITY_REJECTED "29 " 

+#define MBTK_VOICE_END_REASON_STATUS_ENQUIRY "30 " 

+#define MBTK_VOICE_END_REASON_NORMAL_UNSPECIFIED "31 " 

+#define MBTK_VOICE_END_REASON_NO_CIRCUIT_AVAILABLE "34 " 

+#define MBTK_VOICE_END_REASON_NETWORK_OUT_OF_ORDER "38 " 

+#define MBTK_VOICE_END_REASON_TEMPORARY_FAILURE "41 " 

+#define MBTK_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION "42 " 

+#define MBTK_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED "43 " 

+#define MBTK_VOICE_END_REASON_REQUESTED_CIRCUIT_UNAVAILABLE "44 " 

+#define MBTK_VOICE_END_REASON_RESOURCE_UNAVAILABLE "47 " 

+#define MBTK_VOICE_END_REASON_QOS_UNAVAILABLE "49 " 

+#define MBTK_VOICE_END_REASON_REQUESTED_FACILITY_NOT_SUBSCRIBED "50 " 

+#define MBTK_VOICE_END_REASON_INCOMING_CALLS_BARRED_WITHIN_CUG "55 " 

+#define MBTK_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AUTHORIZED "57 " 

+#define MBTK_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AVAILABLE "58 " 

+#define MBTK_VOICE_END_REASON_SERVICE_NOT_AVAILABLE "63 " 

+#define MBTK_VOICE_END_REASON_BEARER_SERVICE_NOT_IMPLEMENTED "65 " 

+#define MBTK_VOICE_END_REASON_ACM_MAX_REACHED "68 " 

+#define MBTK_VOICE_END_REASON_FACILITY_NOT_IMPLEMENTED "69 " 

+#define MBTK_VOICE_END_REASON_ONLY_RDI_BEARER_CAPABILITY_AVAILABLE "70 " 

+#define MBTK_VOICE_END_REASON_SERVICE_NOT_IMPLEMENTED "79 " 

+#define MBTK_VOICE_END_REASON_INVALID_TRANSACTION_ID "81 " 

+#define MBTK_VOICE_END_REASON_USER_NOT_MEMBER_OF_CUG "87 " 

+#define MBTK_VOICE_END_REASON_INCOMPATIBLE_DESTINATION "88 " 

+#define MBTK_VOICE_END_REASON_INVALID_TRANSIT_NETWORK_SELECTION "91 " 

+#define MBTK_VOICE_END_REASON_INCORRECT_MESSAGE "95 " 

+#define MBTK_VOICE_END_REASON_INVALID_MANDATORY_INFORMATION "96 " 

+#define MBTK_VOICE_END_REASON_MESSAGE_TYPE_NON_EXISTENT "97 " 

+#define MBTK_VOICE_END_REASON_MESSAGE_TYPE_WRONG_STATE "98 " 

+#define MBTK_VOICE_END_REASON_INFORMATION_ELEMENT_NOT_EXISTENT "99 " 

+#define MBTK_VOICE_END_REASON_CONDITIONAL_IE_ERROR "100 " 

+#define MBTK_VOICE_END_REASON_MESSAGE_WRONG_STATE "101 " 

+#define MBTK_VOICE_END_REASON_RECOVERY_AFTER_TIMER_EXPIRY "102 " 

+#define MBTK_VOICE_END_REASON_PROTOCOL_ERROR_UNSPECIFIED "111 " 

+#define MBTK_VOICE_END_REASON_INERWORKING_UNSPECIFIED "127 " 

+#define MBTK_VOICE_END_REASON_CALL_BARRING "224 " 

+#define MBTK_VOICE_END_REASON_FDN_BLOCKED "241 "

+#define MBTK_VOICE_END_REASON_END "end"

+

+

+

+/*

+    0 : GSM only

+    1 : UMTS only

+    2 : GSM/UMTS(auto)

+    3 : GSM/UMTS(GSM preferred)

+    4 : GSM/UMTS(UMTS preferred)

+    5 : LTE only

+    6 : GSM/LTE(auto)

+    7 : GSM/LTE(GSM preferred)

+    8 : GSM/LTE(LTE preferred)

+    9 : UMTS/LTE(auto)

+    10 : UMTS/LTE(UMTS preferred)

+    11 : UMTS/LTE(LTE preferred)

+    12 : GSM/UMTS/LTE(auto)

+    13 : GSM/UMTS/LTE(GSM preferred)

+    14 : GSM/UMTS/LTE(UMTS preferred)

+    15 : GSM/UMTS/LTE(LTE preferred)

+*/

+typedef enum

+{

+    MBTK_NET_PREF_GSM_ONLY = 0,

+    MBTK_NET_PREF_UMTS_ONLY,

+    MBTK_NET_PREF_GSM_UMTS_AUTO,

+    MBTK_NET_PREF_GSM_UMTS_GSM_PREF,

+    MBTK_NET_PREF_GSM_UMTS_UMTS_PREF,

+    MBTK_NET_PREF_LTE_ONLY,

+    MBTK_NET_PREF_GSM_LTE_AUTO,

+    MBTK_NET_PREF_GSM_LTE_GSM_PREF,

+    MBTK_NET_PREF_GSM_LTE_LTE_PREF,

+    MBTK_NET_PREF_UMTS_LTE_AUTO,

+    MBTK_NET_PREF_UMTS_LTE_UMTS_PREF,

+    MBTK_NET_PREF_UMTS_LTE_LTE_PREF,

+    MBTK_NET_PREF_GSM_UMTS_LTE_AUTO,

+    MBTK_NET_PREF_GSM_UMTS_LTE_GSM_PREF,

+    MBTK_NET_PREF_GSM_UMTS_LTE_UMTS_PREF,

+    MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF

+} mbtk_net_pref_enum;

+

+typedef enum

+{

+    MBTK_CELL_TYPE_GSM = 0,

+    MBTK_CELL_TYPE_UMTS,

+    MBTK_CELL_TYPE_LTE

+} mbtk_cell_type_enum;

+

+/*

+    0 : Plmm long character format

+    1 : Plmn Short character format

+    2 : Plmn number format

+*/

+typedef enum

+{

+    MBTK_NET_OPERA_FORMAT_LONG_CHAR = 0,

+    MBTK_NET_OPERA_FORMAT_SHORT_CHAR,

+    MBTK_NET_OPERA_FORMAT_NUMBER,

+} mbtk_net_opera_format_enum;

+

+/*

+    0 : Automatic registration

+    1 : Manual registration

+    2 : Forced cancellation

+    3 : Set format only

+    4 : Manual registration is performed first, and automatic registration fails

+*/

+typedef enum

+{

+    MBTK_NET_OPERA_REG_MODE_AUTO = 0,

+    MBTK_NET_OPERA_REG_MODE_MANUAL,

+    MBTK_NET_OPERA_REG_MODE_LOGOUT,

+    MBTK_NET_OPERA_REG_MODE_SET_FORMAT,

+    MBTK_NET_OPERA_REG_MODE_MANUAL_AUTO,

+} mbtk_net_opera_reg_mode_enum;

+

+typedef struct

+{

+    int client_fd;

+    pthread_t read_thread_id;

+    int exit_fd[2];

+    bool is_waitting;

+    pthread_cond_t cond;

+    pthread_mutex_t mutex;

+

+    pthread_mutex_t send_mutex;

+

+    // Temp response data.

+    uint16 info_err;

+    uint16 data_len;

+    void *data;

+

+    //mbtk wyq for server_ready_status add start

+    char server_ready_status;

+    //mbtk wyq for server_ready_status add end

+

+    mbtk_info_callback_func net_state_cb;

+    mbtk_info_callback_func call_state_cb;

+    mbtk_info_callback_func sms_state_cb;

+    mbtk_info_callback_func radio_state_cb;

+    mbtk_info_callback_func sim_state_cb;

+    mbtk_info_callback_func pdp_state_cb;

+    //add signal by xr

+    mbtk_info_callback_func signal_state_cb;

+

+    mbtk_info_callback_func ecall_state_cb;

+} mbtk_info_handle_t;

+

+typedef struct

+{

+    /*

+    0: automatic

+    1: manual

+    */

+    uint8 net_sel_mode;

+    /*

+    0: GSM

+    1: GSM Compact

+    2: UTRAN

+    3: GSM w/EGPRS

+    4: UTRAN w/HSDPA

+    5: UTRAN w/HSUPA

+    6: UTRAN w/HSDPA and HSUPA

+    7: E-UTRAN

+    8: UTRAN HSPA+

+    0xFF: Unused

+    */

+    uint8 net_type;

+    //uint8 plmn[10]; // 46000

+    /*

+    0: unknown

+    1: available

+    2: current

+    3: forbidden

+    */

+    uint8 net_state;

+    uint32 plmn;

+} __attribute__((packed)) mbtk_net_info_t;

+

+typedef struct

+{

+    uint8 net_pref;     // mbtk_net_pref_enum

+    uint16 gsm_band;    // mbtk_gsm_band_enum

+    uint16 umts_band;   // mbtk_umts_band_enum

+    uint32 tdlte_band;  // mbtk_tdlte_band_enum

+    uint32 fddlte_band; // mbtk_fddlte_band_enum

+    uint32 lte_ext_band; // mbtk_lte_ext_band_enum

+} __attribute__((packed)) mbtk_band_info_t;

+

+typedef struct

+{

+    uint8 type; // mbtk_radio_technology_enum

+    uint8 rssi; // 0: 113 dBm or less

+                // 1: 111 dBm

+                // 2��30: 109��53 dBm

+                // 31: 51 dBm or greater

+                // 99: not known or not detectable

+    uint8 rxlev;// 0:rssi < -110 dBm

+                // 1: -110 dBm �� rssi < -109 dBm

+                // 2: -109 dBm �� rssi < -108 dBm

+                // ......

+                // 61: -50 dBm �� rssi < -49 dBm

+                // 62: -49 dBm �� rssi < -48 dBm

+                // 63: -48 dBm �� rssi

+                // 99: not known or not detectable

+    uint8 ber;  // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4

+                // 99 not known or not detectable

+    uint8 rscp; // 0: rscp < -120 dBm

+                // 1: -120 dBm �� rscp < -119 dBm

+                // 2: -119 dBm �� rscp < -118 dBm

+                // ......

+                // 94: -27 dBm �� rscp < -26 dBm

+                // 95: -26 dBm �� rscp < -25 dBm

+                // 96: - 25 dBm �� rscp

+                // 255: not known or not detectable

+    uint8 ecno; // 0: Ec/Io < -24 dB

+                // 1: -24 dB �� Ec/Io < -23.5 dB

+                // 2: -23.5 dB �� Ec/Io < -23 dB

+                // ......

+                // 47: -1 dB �� Ec/Io < -0.5 dB

+                // 48: -0.5 dB �� Ec/Io < 0 dB

+                // 49: 0 dB �� Ec/Io

+                // 255: not known or not detectable

+    uint8 rsrq; // 0: rsrq < -19.5 dB

+                // 1: -19.5 dB �� rsrq < -19 dB

+                // 2: -19 dB �� rsrq < -18.5 dB

+                // ......

+                // 32: -4 dB �� rsrq < -3.5 dB

+                // 33: -3.5 dB �� rsrq < -3 dB

+                // 34: -3 dB �� rsrq

+                // 255: not known or not detectable

+    uint8 rsrp; // 0: rsrp < -140 dBm

+                // 1: -140 dBm �� rsrp < -139 dBm

+                // 2: -139 dBm �� rsrp < -138 dBm

+                // ......

+                // 95: -46 dBm �� rsrp < -45 dBm

+                // 96: -45 dBm �� rsrp < -44 dBm

+                // 97: -44 dBm �� rsrp

+                // 255: not known or not detectable

+} __attribute__((packed)) mbtk_signal_info_t;

+

+typedef struct

+{

+    uint8 call_state;// mbtk_net_reg_state_enum

+    uint8 data_state;// mbtk_net_reg_state_enum

+    uint8 ims_state;// mbtk_net_reg_state_enum

+    uint8 type; // mbtk_radio_technology_enum

+    uint16 lac;

+    uint32 ci;

+} __attribute__((packed)) mbtk_net_reg_info_t;

+

+typedef struct

+{

+    uint8 call_wait;

+    uint8 dir1;

+    uint8 dir;

+    uint8 state;

+    uint8 mode;

+    uint8 mpty;

+    char phone_number[100];

+    uint8 type;

+    uint8 pas;

+    uint8 disconnected_id;

+    uint8 end_reason[128];

+} __attribute__((packed)) mbtk_call_info_t;

+

+typedef struct

+{

+    char character;

+    uint32 duration;

+} __attribute__((packed)) mbtk_call_dtmf_info_t;

+

+typedef enum {

+    MBTK_SIM_ABSENT = 0,

+    MBTK_SIM_NOT_READY = 1,

+    MBTK_SIM_READY = 2,

+    MBTK_SIM_PIN = 3,

+    MBTK_SIM_PUK = 4,

+    MBTK_SIM_NETWORK_PERSONALIZATION = 5

+} mbtk_sim_state_enum;

+

+typedef enum {

+    MBTK_PIN_DISABLE = 0,

+    MBTK_PIN_ENABLE = 1,

+}mbtk_pin_state_enum;

+

+typedef enum {

+    MBTK_IP_TYPE_IP,

+    MBTK_IP_TYPE_IPV6,

+    MBTK_IP_TYPE_IPV4V6,

+    MBTK_IP_TYPE_PPP

+} mbtk_ip_type_enum;

+

+typedef enum

+{

+    MBTK_NET_TYPE_UNKNOWN,

+    MBTK_NET_TYPE_GSM,

+    MBTK_NET_TYPE_UMTS,

+    MBTK_NET_TYPE_LTE

+} mbtk_net_type_enum;

+

+typedef enum {

+    MBTK_CLCC = 1,

+    MBTK_CPAS,

+    MBTK_DISCONNECTED,

+} mbtk_call_enum;

+

+typedef struct

+{

+    // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band

+    // LTE cell: phyCellId,euArfcn,rsrp,rsrq

+    // WCDMA server cell: lac, ci, arfcn

+    // WCDMA cell: lac, ci, arfcn

+    // GSM server cell: lac, ci, arfcn, bsic

+    // GSM cell:

+    uint32 value1;

+    uint32 value2;

+    uint32 value3;

+    uint32 value4;

+    uint32 value5;

+	uint32 value6;

+    uint32 value7;

+    uint32 value8;

+    uint32 value9;

+    uint32 value10;

+} __attribute__((packed)) mbtk_cell_info_t;

+

+typedef enum {

+    MBTK_CALL_RADY,                 //MT allows commands from TA/TE

+    MBTK_CALL_UNAVAILABLE,          //MT does not allow commands from TA/TE

+    MBTK_CALL_UNKNOWN,              //MT is not guaranteed to respond to instructions

+    MBTK_CALL_RINGING,              //MT is ready for commands from TA/TE, but the ringer is active

+    MBTK_CALL_PROGRESS,             //MT is ready for commands from TA/TE, but a call is in progress

+    MBTK_CALL_ASLEEP,               //MT is unable to process commands from TA/TE because it is in a low functionality state

+    MBTK_CALL_ACTIVE,

+} mbtk_call_pas_enum;

+

+typedef enum {

+    MBTK_RADIO_STATE_UNKNOWN,

+    MBTK_RADIO_STATE_ON,

+    MBTK_RADIO_STATE_OFF

+} mbtk_radio_state_enum;

+

+typedef enum {

+    MBTK_DATA_CALL_STOP = 0,    // Stop data call.

+    MBTK_DATA_CALL_START,       // Start data call.

+    MBTK_DATA_CALL_STATE        // Get data call state

+} mbtk_data_call_type_enum;

+/*

+0: not registered, MT is not currently searching a new operator to register to

+1: registered, home network

+2: not registered, but MT is currently searching a new operator to register to

+3: registration denied

+4: unknown

+5: registered, roaming

+6: registered, home network, SMS-only (applicable only when AcT is E-UTRAN)

+7: registered, roaming, SMS-only (applicable only when AcT is E-UTRAN)

+8: attached for emergency bearer services only (not applicable)

+9: registered for ��CSFB not preferred��,home network(applicable only when AcT is E-UTRAN)

+10: registered for ��CSFB not preferred��,roaming(applicable only when AcT is E-UTRAN)

+11: only emergency services are available

+*/

+typedef enum

+{

+    MBTK_NET_REG_STATE_NON = 0,

+    MBTK_NET_REG_STATE_HOME,

+    MBTK_NET_REG_STATE_SEARCHING,

+    MBTK_NET_REG_STATE_DENIED,

+    MBTK_NET_REG_STATE_UNKNOWN,

+    MBTK_NET_REG_STATE_ROAMING,

+    MBTK_NET_REG_STATE_SMS_ONLY,

+    MBTK_NET_REG_STATE_ROAMING_SMS,

+    MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,

+    MBTK_NET_REG_STATE_CSFB_HOME,

+    MBTK_NET_REG_STATE_CSFB_ROAMING,

+    MBTK_NET_REG_STATE_EMERGENCY_ONLY

+} mbtk_net_reg_state_enum;

+

+typedef struct {

+    int cid; // 2 - 7

+    mbtk_ip_type_enum ip_type; // mbtk_ip_type_enum

+    uint8 apn[APN_STR_MAX];

+    uint8 user[APN_STR_MAX];

+    uint8 pass[APN_STR_MAX];

+    uint8 auth[APN_STR_MAX];

+} mbtk_apn_info_t;

+

+typedef struct {

+    bool valid;

+    uint32 IPAddr;

+    uint32 PrimaryDNS;

+    uint32 SecondaryDNS;

+    uint32 GateWay;

+    uint32 NetMask;

+} __attribute__((packed)) mbtk_ipv4_info_t;

+

+typedef struct {

+    bool valid;

+    uint32 IPV6Addr[4];

+    uint32 PrimaryDNS[4];

+    uint32 SecondaryDNS[4];

+    uint32 GateWay[4];

+    uint32 NetMask[4];

+} __attribute__((packed)) mbtk_ipv6_info_t;

+

+typedef struct {

+    uint8 state;        // Must be placed at the forefront.

+

+    mbtk_ipv4_info_t ipv4;

+    mbtk_ipv6_info_t ipv6;

+} __attribute__((packed)) mbtk_pdp_act_info_t;

+

+typedef enum

+{

+    MBTK_DEV_MODEM_MIN_FUN,                                   //Modem 最小功能

+    MBTK_DEV_MODEM_FULL_FUN,                                  //Modem 全功能

+    MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3,           //Modem 禁用射频接收电路

+    MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS,  //Modem禁用射频发射和接收电路

+    MBTK_DEV_MODEM_DISABLE_SIM,                               //Modem 禁用(U)SIM 卡

+    MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE,           //Modem 完全禁用辅助接收

+}MBTK_DEV_MODEM_FUNCTION;

+

+/*

+0: GSM

+1: GSM Compact

+2: UTRAN

+3: GSM w/EGPRS

+4: UTRAN w/HSDPA

+5: UTRAN w/HSUPA

+6: UTRAN w/HSDPA and HSUPA

+7: E-UTRAN

+8: UTRAN HSPA+

+*/

+typedef enum {

+    MBTK_RADIO_TECH_GSM = 0,

+    MBTK_RADIO_TECH_GSM_COMPACT,

+    MBTK_RADIO_TECH_UTRAN,

+    MBTK_RADIO_TECH_GSM_EGPRS,

+    MBTK_RADIO_TECH_UTRAN_HSDPA,

+    MBTK_RADIO_TECH_UTRAN_HSUPA,

+    MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,

+    MBTK_RADIO_TECH_E_UTRAN,      // LTE

+    MBTK_RADIO_TECH_UTRAN_HSPA

+} mbtk_radio_technology_enum;

+

+typedef struct

+{

+    MBTK_DEV_MODEM_FUNCTION fun;

+    int rst;

+} mbtk_modem_info_t;

+

+typedef enum {

+    MBTK_SIM = 0,

+    MBTK_USIM = 1,

+    MBTK_TEST_SIM = 2,

+    MBTK_TEST_USIM = 3,

+    MBTK_UNKNOWN = 4,

+} mbtk_sim_card_type_enum;

+

+typedef struct

+{

+    uint8_t p1_retry;

+    uint8_t p2_retry;

+    uint8_t puk1_retry;

+    uint8_t puk2_retry;

+} mbtk_pin_puk_last_times;

+

+typedef struct

+{

+    uint8_t format;

+    char plmn_name[16];

+}MBTK_SIM_PLMN_INFO_C;  //string type

+

+

+typedef struct

+{

+    uint8_t count;

+    uint8_t format;

+    MBTK_SIM_PLMN_INFO_C mbtk_plmn_name[24];

+} mbtk_plmn_info;

+

+typedef struct

+{

+ uint8_t old_pin_value[16];

+ uint8_t new_pin_value[16];

+} mbtk_change_pin_info;

+

+typedef struct

+{

+ uint8_t pin_value[16];

+ uint8_t puk_value[16];

+} mbtk_unlock_pin_info;

+

+typedef struct

+{

+ uint8_t pin_value[16];

+ uint8_t enable;

+} mbtk_enable_pin_info;

+

+typedef struct

+{

+    int sim;

+    int sim_card_type;

+    mbtk_pin_puk_last_times ql_last_times;

+} mbtk_sim_card_info;

+

+

+typedef struct{

+    uint8_t         mode;

+    uint32_t        oosPhase[3];   //单位为秒

+} mbtk_oos_info;

+

+typedef struct

+{

+    int8 ther;

+} mbtk_thermal_info_t;

+

+/**************led enum*********/

+typedef enum

+{

+    MBTK_LED_TYPE_NET,       //set net_led

+    MBTK_LED_TYPE_STATUS     //set status_led

+}mbtk_led_type;

+

+typedef enum

+{

+    MBTK_LED_STATUS_CLOSE,       //close led

+    MBTK_LED_STATUS_OPEN     //open led

+}mbtk_led_status;

+/**************led enum*********/

+

+/**************qser data_call*****************/

+typedef enum {

+    MBTK_APN_REQ_TYPE_SET = 0,   // set apn req

+    MBTK_APN_REQ_TYPE_ADD        // add apn req

+}mbtk_apn_req_type_enum;

+

+typedef enum {

+	MBTK_APN_AUTH_PROTO_DEFAULT = 0,

+	MBTK_APN_AUTH_PROTO_NONE,

+	MBTK_APN_AUTH_PROTO_PAP,

+	MBTK_APN_AUTH_PROTO_CHAP,

+#if 0

+	MBTK_APN_AUTH_PROTO_PAP_CHAP,

+    //NOT SUPPORT

+#endif

+} mbtk_apn_auth_proto_enum;

+

+typedef struct
+{
+    uint8 urc_id;
+    uint8 urc_data[5];
+} mbtk_ril_ecall_state_info_t;

+

+typedef struct {

+	int cid;                /*!< UMTS/CDMA profile ID. range: 0 - 7*/

+	mbtk_ip_type_enum ip_type;               /*!< Packet Data Protocol (PDP) type specifies the type of data payload

+	                                             exchanged over the airlink when the packet data session is

+	                                             established with this profile. */

+	mbtk_apn_req_type_enum req_type;          /*!< apn req type*/

+	mbtk_apn_auth_proto_enum auth_proto;         /*!< Authentication Protocol. */

+	uint8 apn_name[MBTK_APN_NAME_SIZE];        /*!< A string parameter that is a logical name used to select the GGSN

+	                                             and external packet data network. */

+	uint8 user_name[MBTK_APN_USERNAME_SIZE];    /*!< Username used during data network authentication. */

+	uint8 user_pass[MBTK_APN_PASSWORD_SIZE];    /*!< Password to be used during data network authentication. */

+    uint8 apn_type[MBTK_APN_TYPE_SIZE];

+} mbtk_qser_apn_info_s;

+/**************qser data_call*****************/

+

+
+typedef enum {
+    MBTK_ECALL_MSD_ITEM_VERSION = 0,
+    MBTK_ECALL_MSD_ITEM_MSG_ID,
+    MBTK_ECALL_MSD_ITEM_CONTROLTYPE,
+    MBTK_ECALL_MSD_ITEM_VIN,
+    MBTK_ECALL_MSD_ITEM_STORAGETYPE,
+    MBTK_ECALL_MSD_ITEM_TIMESTAMP,
+    MBTK_ECALL_MSD_ITEM_LOCATION,
+    MBTK_ECALL_MSD_ITEM_DIRECTION,
+    MBTK_ECALL_MSD_ITEM_LOCATIONN1,
+    MBTK_ECALL_MSD_ITEM_LOCATIONN2,
+    MBTK_ECALL_MSD_ITEM_NUMBEROFOCCUPANTS,
+    MBTK_ECALL_MSD_ITEM_ADDITIONALDATA,
+    MBTK_ECALL_MSD_ITEM_ALL_IN_ONE,
+    MBTK_ECALL_MSD_ITEM_ASI,
+    MBTK_ECALL_MSD_ITEM_VEHICLE_DIAGNOSTIC,
+    MBTK_ECALL_MSD_ITEM_CRASH_INFO,
+    MBTK_ECALL_MSD_ITEM_GNSS_TYPE
+} mbtk_ecall_msd_item_enum;
+
+typedef struct
+{
+    mbtk_ecall_msd_item_enum item_type;
+
+    uint8 data[64];
+} mbtk_ecall_msd_cfg_info_t;

+

+typedef enum {
+    MBTK_ECALL_ONLY_TYPE_DISABLE = 0,
+    MBTK_ECALL_ONLY_TYPE_ENABLE_ECALL,
+    MBTK_ECALL_ONLY_TYPE_ENABLE_NG_ECALL,
+    MBTK_ECALL_ONLY_TYPE_ENABLE_ALL,
+    MBTK_ECALL_ONLY_TYPE_CONF_NUM,
+    MBTK_ECALL_ONLY_TYPE_NORMAL
+} mbtk_ecall_only_type_enum;
+
+typedef enum {
+    MBTK_ECALL_SIM_TYPE_NO_SUPPORT = 0,
+    MBTK_ECALL_SIM_TYPE_SUPPORT_ECALL,
+    MBTK_ECALL_SIM_TYPE_SUPPORT_ECALL_ONLY
+} mbtk_ecall_sim_type_enum;
+
+typedef struct {
+    mbtk_ecall_only_type_enum active : 8;
+    mbtk_ecall_sim_type_enum sim_type : 8;     // Only for GET.
+    uint8 test_num[RIL_MAX_NUMBER_LEN];
+    uint8 reconfig_num[RIL_MAX_NUMBER_LEN];
+} mbtk_ecall_only_info_t;

+

+typedef enum {
+    MBTK_ECALL_DIAL_TYPE_TEST = 0,
+    MBTK_ECALL_DIAL_TYPE_RECONFIG,
+    MBTK_ECALL_DIAL_TYPE_MANUALLY,
+    MBTK_ECALL_DIAL_TYPE_AUTO,
+    MBTK_ECALL_DIAL_TYPE_NOT_ACTIVATED,
+    MBTK_ECALL_DIAL_TYPE_RELEASE
+} mbtk_ecall_dial_type_enum;

+

+typedef enum {
+    MBTK_ECALL_MODE_TYPE_EU = 0,
+    MBTK_ECALL_MODE_TYPE_ERA
+} mbtk_ecall_mode_type_enum;
+
+typedef struct {
+    uint32 type;            // mbtk_ecall_cfg_item_enum

+

+#if 0

+    uint32 timer_t3;    // ms

+    uint32 timer_t5;    // ms

+    uint32 timer_t6;    // ms

+    uint32 timer_t7;    // ms

+    uint32 timer_th;    // ms

+

+    uint32 timer_callback; // s (T9)

+    uint32 timer_cleardown; // s (T2)

+    uint32 timer_dereg;     // s (T10)

+    uint32 timer_dial;  // s

+    uint32 timer_redialtmr; // s

+    uint32 timer_sms;   // s

+

+    uint32 redialcnt;

+    uint32 smsprocess;

+    uint32 smsmsdcnt;

+#else

+    uint8 data_valid[MBTK_ECALL_CFG_ITEM_MAX];

+    uint32 data[MBTK_ECALL_CFG_ITEM_MAX];

+#endif

+} mbtk_ecall_cfg_info_t;
+
+typedef enum {
+    MBTK_ECALL_GAIN_MODE_TX = 0,
+    MBTK_ECALL_GAIN_MODE_RX,
+    MBTK_ECALL_GAIN_MODE_SIDETONE
+} mbtk_ecall_gain_mode_enum;
+
+typedef struct {
+    mbtk_ecall_gain_mode_enum mode;
+
+    int8 gain;
+} mbtk_ecall_gain_info_t;

+

+typedef enum {

+    MBTK_ECALL_URC_ID_ALACK = 0,    // AL-ACK signal received (refer to : urc_data)

+    MBTK_ECALL_URC_ID_SYNC_LOST,    // eIM lost synchronization with PSAP

+                                    // (A resynch occurs after the synchronization is lost.)

+    MBTK_ECALL_URC_ID_NACK,         // NACK signal received

+    MBTK_ECALL_URC_ID_RESERVED_3,

+    MBTK_ECALL_URC_ID_RESERVED_4,

+    MBTK_ECALL_URC_ID_RESERVED_5,   // 5

+    MBTK_ECALL_URC_ID_3GPP_FATAL,   // eIM is terminated: fatal error (3GPP Abort function)

+    MBTK_ECALL_URC_ID_CALL_DROP,    // eIM is terminated: call drop

+    MBTK_ECALL_URC_ID_GENERIC,      // Generic error

+    MBTK_ECALL_URC_ID_MSD_REQ,      // PSAP request MSD (Only for PULL modem)

+    MBTK_ECALL_URC_ID_MSD_SEND_START,   // 10 : eIM starts sending MSD

+    MBTK_ECALL_URC_ID_INITIATION,   // The eIM starts sending the Initiation signal (Only for PUSH modem).

+                                    // It also indicates that the call setup is completed.

+    MBTK_ECALL_URC_ID_SEND_MSD,     // PUSH: SEND_MSD -> MSD_SEND_START

+                                    // PULL: SEND_MSD -> MSD_REQ -> MSD_SEND_START

+    MBTK_ECALL_URC_ID_SEND_MSD_FULL,// SEND MSD signal received too often, PSAP sync failure assumed

+    MBTK_ECALL_URC_ID_SYNCED_PSAP,  // IVS eIM is synced with PSAP

+    MBTK_ECALL_URC_ID_SYNCED_PSAP_EIM,  // 15: IVS eIM is synced with PSAP eIM

+    MBTK_ECALL_URC_ID_LLACK,        // Link layer ACK received

+    MBTK_ECALL_URC_ID_HLACK,        //  Higher Layer ACK received (similar to AL-ACK (#0) but without data)

+    MBTK_ECALL_URC_ID_EIM_RESET,    // The eIM transmitter idles after a full reset. The eIM transmitter is reset after sync loss

+                                    // (for example, because of the end of PSAP transmission).

+    MBTK_ECALL_URC_ID_EIM_IDLES,    // The eIM transmitter idles after the transmission of the Initiation signal (push mode)

+    MBTK_ECALL_URC_ID_MSD_UPDATE,   // 20 : MSD update request is received.

+    MBTK_ECALL_URC_ID_MSD_UPDATE_DONE, // MSD update is done.

+    MBTK_ECALL_URC_ID_MSD_UPDATE_ERR, // MSD update request cannot be processed.

+    MBTK_ECALL_URC_ID_T3_EXPIRED,   // T3 expired

+    MBTK_ECALL_URC_ID_T5_EXPIRED,   // T5 expired

+    MBTK_ECALL_URC_ID_T6_EXPIRED,   // 25 : T6 expired

+    MBTK_ECALL_URC_ID_T7_EXPIRED,   // T7 expired

+    MBTK_ECALL_URC_ID_TH_EXPIRED,   // TH expired

+    MBTK_ECALL_URC_ID_RESERVED_28,

+    MBTK_ECALL_URC_ID_RESERVED_29,

+    MBTK_ECALL_URC_ID_RESERVED_30,  // 30

+    MBTK_ECALL_URC_ID_IVS_EVENT_TIMEOUT,

+    MBTK_ECALL_URC_ID_PSAP_REQ,     // Only for ERA

+    MBTK_ECALL_URC_ID_MSD_SEND_FAIL_FOR_NG  // NG-eCall fail to transfer MSD

+} mbtk_ecall_urc_id_enum;

+

+

+int ipv6_2_str(const void *ipv6, void *ipv6_str);

+

+mbtk_info_handle_t* mbtk_info_handle_get();

+

+int mbtk_info_handle_free(mbtk_info_handle_t** handle);

+

+/*

+* Get platform version.

+*/

+int mbtk_version_get(mbtk_info_handle_t* handle, void *version);

+

+/*

+* Get platform model.

+*/

+int mbtk_model_get(mbtk_info_handle_t* handle, void *model);

+

+/*

+* Get platform IMEI.

+*/

+int mbtk_imei_get(mbtk_info_handle_t* handle, void *imei);

+

+/*

+* Get platform SN.

+*/

+int mbtk_sn_get(mbtk_info_handle_t* handle, void *sn);

+

+/*

+* Get platform MEID.

+*/

+int mbtk_meid_get(mbtk_info_handle_t* handle, void *meid);

+

+/*

+* Return VoLTE state.

+*/

+int mbtk_volte_state_get(mbtk_info_handle_t* handle, int *volte_state);

+

+/*

+* Return modem state.

+*/

+int mbtk_get_modem_fun(mbtk_info_handle_t* handle, int* fun);

+

+/*

+* Set modem state.

+*/

+int mbtk_set_modem_fun(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);

+

+

+/*

+* Set VoLTE state.

+*

+* volte_state:

+* 0 : Close VoLTE.

+* 1 : Open VoLTE.

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_volte_state_set(mbtk_info_handle_t* handle, int volte_state);

+

+/*

+* Get platform IMSI.

+*/

+int mbtk_imsi_get(mbtk_info_handle_t* handle, void *imsi);

+

+/*

+* Get platform ICCID.

+*/

+int mbtk_iccid_get(mbtk_info_handle_t* handle, void *iccid);

+

+/*

+* Get current phone number.

+*/

+int mbtk_phone_number_get(mbtk_info_handle_t* handle, void *phone_number);

+

+/*

+* Get available network.

+*/

+int mbtk_available_net_get(mbtk_info_handle_t* handle, list_node_t **net_list);

+

+/*

+* Set network select mode. (+COPS=...)

+*/

+int mbtk_net_sel_mode_set(mbtk_info_handle_t* handle, const mbtk_net_info_t *net);

+

+/*

+* Get network select mode. (+COPS?)

+*/

+int mbtk_net_sel_mode_get(mbtk_info_handle_t* handle, mbtk_net_info_t *net);

+

+/*

+* Get platform support bands.

+*/

+int mbtk_support_band_get(mbtk_info_handle_t* handle, mbtk_band_info_t *band);

+

+/*

+* Get platform current bands.

+*/

+int mbtk_current_band_get(mbtk_info_handle_t* handle, mbtk_band_info_t *band);

+

+/*

+* Set platform current bands.

+*/

+int mbtk_current_band_set(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);

+

+/*

+* Get current cell infomation.

+*/

+int mbtk_cell_get(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);

+

+/*

+* Set AT*CELL.

+*/

+int mbtk_cell_set(mbtk_info_handle_t* handle, char * info, char* response);

+

+/*

+* Get current APN informations.

+*/

+int mbtk_apn_get(mbtk_info_handle_t* handle, int *apn_num, mbtk_apn_info_t apns[]);

+

+/*

+* Set current QSER APN informations.

+*/

+int mbtk_qser_apn_set(mbtk_info_handle_t* handle, mbtk_qser_apn_info_s *apninfo, unsigned char *cid);

+

+/*

+* Set current QSER APN informations.

+*/

+int mbtk_qser_apn_get(mbtk_info_handle_t* handle, int *apn_num, mbtk_qser_apn_info_s apns[]);

+

+/*

+* Set current APN informations.

+*/

+int mbtk_apn_set(mbtk_info_handle_t* handle, int cid, mbtk_ip_type_enum ip_type, const void* apn_name,

+                    const void *user_name, const void *user_pass, const void *auth);

+

+/*

+* Delete apn.

+*/

+int mbtk_apn_del(mbtk_info_handle_t* handle, unsigned char profile_idx);

+

+/*

+* Start data call.

+*/

+int mbtk_data_call_start(mbtk_info_handle_t* handle, int cid, int auto_conn_interval, bool boot_conn, int timeout);

+

+/*

+* Stop data call.

+*/

+int mbtk_data_call_stop(mbtk_info_handle_t* handle, int cid, int timeout);

+

+/*

+* Get data call state.

+*/

+int mbtk_data_call_state_get(mbtk_info_handle_t* handle, int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6);

+

+/*

+* Get current network signal.

+*/

+int mbtk_net_signal_get(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);

+

+/*

+* Get current network register information.

+*/

+int mbtk_net_reg_get(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);

+

+/*

+* Get current IMS enable or not.

+*/

+int mbtk_net_ims_get(mbtk_info_handle_t* handle, int* enable);

+

+/*

+* Set IMS enable or not. This function takes effect after starting the device.

+*/

+int mbtk_net_ims_set(mbtk_info_handle_t* handle, int enable);

+

+/*

+* Get current network IMS register state.

+*/

+int mbtk_net_ims_reg_state_get(mbtk_info_handle_t* handle, int* reg);

+

+/*

+* Get radio state.

+*/

+int mbtk_radio_state_get(mbtk_info_handle_t* handle, int *radio_state);

+

+/*

+* Set radio state.

+*/

+int mbtk_radio_state_set(mbtk_info_handle_t* handle, int radio_state);

+

+/*

+* Return sms cmgf.

+*/

+int mbtk_sms_cmgf_get(mbtk_info_handle_t* handle, int *volte_state);

+

+/*

+* Set sms cmgf.

+*

+* volte_state:

+* 0 : PDU mode.

+* 1 :  text mode.

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_cmgf_set(mbtk_info_handle_t* handle, int mode);

+

+/*

+* Set sms cmgs.

+*

+if PDU mode (+CMGF=0):

++CMGS=<length><CR>

+PDU is given<ctrl-Z/ESC>

+

+if text mode (+CMGF=1):

++CMGS=<da>[,<toda>]<CR>

+text is entered<ctrl-Z/ESC>

+

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_cmgs_set(mbtk_info_handle_t* handle, char * cmgs, char *resp);

+

+/*

+* Set sms cmgw.

+*

+if text mode (+CMGF=1):

++CMGW=<oa/da>[,<tooa/toda>[,<stat>]]

+<CR>

+text is entered<ctrl-Z/ESC>

+if PDU mode (+CMGF=0):

++CMGW=<length>[,<stat>]<CR>PDU is

+given<ctrl-Z/ESC>

+

+*/

+int mbtk_sms_cmgw_set(mbtk_info_handle_t* handle, char * cmgw, char *resp);

+

+/*

+* Set sms cmgd.

+*

+* +CMGD=<index>[,<delflag>]

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_cmgd_set(mbtk_info_handle_t* handle, char * cmdg);

+

+/*

+* Get sms cmgd.

+*

+* +CMGD: (XXX,XXX)(0-4)

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_cmgd_get(mbtk_info_handle_t* handle, char * cmdg);

+

+/*

+* Set sms cmgl.

+*

+* AT+CMGL[=<stat>]

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_cmgl_set(mbtk_info_handle_t* handle, char * cmgl, char *resp);

+

+/*

+* Return sms csca.

+*/

+int mbtk_sms_csca_get(mbtk_info_handle_t* handle, char *buf);

+

+/*

+* Set sms csca.

+*

+* AT+CSCA=<number> [,<type>]

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_csca_set(mbtk_info_handle_t* handle, char * csca);

+

+/*

+* Set sms csmp.

+*

+* AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_csmp_set(mbtk_info_handle_t* handle, char * csmp);

+

+/*

+* Set sms cscb.

+*

+* AT+CSCB=<[<mode>[,<mids>[,<dcss>]]]>

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_cscb_set(mbtk_info_handle_t* handle, char * cscb);

+

+/*

+* Set sms cnmi.

+*

+at+cnmi=1,2

+

+OK

+if sending fails:

++CMS ERROR: <err>

+*/

+int mbtk_sms_cnmi_set(mbtk_info_handle_t* handle);

+

+/*

+* Set sms cmss.

+*

++CMSS=<index>[,<da>[,<toda>]]

+

+if sending successful:

++CMSS: <mr>

+OK

+if sending fails:

++CMS ERROR: <err>

+*/

+int mbtk_sms_cmss_set(mbtk_info_handle_t* handle, char * cmss, char *resp);

+

+/*

+* Return sms cmgf.

+*/

+int mbtk_sms_cpms_get(mbtk_info_handle_t* handle, char * mem);

+

+/*

+* Set sms cpms.

+*

+* AT+CPMS=<mem1>[,<mem2>[,<mem3>]]

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_cpms_set(mbtk_info_handle_t* handle, char * mem, char* response);

+

+/*

+* Set sms cm.

+*

+* +CMGR=<index>

+

+if PDU mode (+CMGF=0) ��command successful:

++CMGR: <stat>,[<alpha>],<length><CR><LF><pdu>

+OK

+if text mode (+CMGF=1), command successful and SMS-DELIVER:

++CMGR:<stat>,<oa>,[<alpha>],<scts>[,<tooa>,<fo>,<pid>,<dcs

+>, <sca>,<tosca>,<length>]<CR><LF><data>

+OK

+if text mode (+CMGF=1), command successful and SMS-SUBMIT:

++CMGR:

+<stat>,<da>,[<alpha>][,<toda>,<fo>,<pid>,<dcs>,[<vp>],

+<sca>,<tosca>,<length>]<CR><LF><data>

+OK

+otherwise:

++CMS ERROR: <err>

+*

+* Restarting takes effect after execution.

+*/

+int mbtk_sms_cmgr_set(mbtk_info_handle_t* handle, int index, char *resp);

+

+/*

+* Get sim state.

+*/

+int mbtk_sim_state_get(mbtk_info_handle_t* handle, mbtk_sim_state_enum *sim_state);

+

+/*

+* Get sim card type.

+*/

+int mbtk_sim_card_type_get(mbtk_info_handle_t* handle, mbtk_sim_card_type_enum *sim_card_type);

+

+/*

+* Get PIN’s number of remaining retry

+*/

+int mbtk_pin_last_num_get(mbtk_info_handle_t* handle, mbtk_pin_puk_last_times *last_times);

+

+/*

+* Get plmn list

+*/

+int mbtk_get_plmn_list(mbtk_info_handle_t* handle, mbtk_plmn_info *pin);

+

+/*

+* Get system temperature.

+*

+* type[IN]:

+*   0: Soc temperature.

+*   1: RF temperature.

+* temp[OUT]:

+*   temperature in celsius.

+*/

+int mbtk_temp_get(mbtk_info_handle_t* handle, int type, mbtk_thermal_info_t* temp);

+

+/*

+* Set sim power state.

+* power:

+* 0: Sim power off.

+* 1: Sim power on.

+*/

+int mbtk_sim_power_set(int power);

+

+/*

+*enable PIN

+*/

+int mbtk_enable_pin(mbtk_info_handle_t* handle, mbtk_enable_pin_info *pin);

+

+/*

+* GET PIN STATE

+*/

+int mbtk_get_pin_state(mbtk_info_handle_t* handle, mbtk_pin_state_enum *pin_state);

+

+/*

+*Verify PIN

+*/

+int mbtk_verify_pin(mbtk_info_handle_t* handle, char *pin);

+

+/*

+*change PIN

+*/

+int mbtk_change_pin(mbtk_info_handle_t* handle, mbtk_change_pin_info *pin);

+

+/*

+*unlock PIN

+*/

+int mbtk_unlock_pin(mbtk_info_handle_t* handle, mbtk_unlock_pin_info *pin);

+

+

+/*

+* System power.

+* type:

+* 0: Reboot system.

+* 1: Poweroff system.

+* 2: Halt system.

+*/

+int mbtk_system_reboot(int type);

+

+/*

+* Get time type.

+*/

+int mbtk_time_get(mbtk_info_handle_t* handle, int *time_type);

+

+/*

+* Get net time.

+*/

+int mbtk_net_time_get(mbtk_info_handle_t* handle, char* time_str);

+

+/*

+* Absolute time conversion

+*/

+int mbtk_get_abs_time(char *time_str, time_t *time_out);

+

+/*

+* Set time.

+*

+* time_type:

+* 0: Cell time

+* 1: NTP time

+* 2: User time

+* time_str: "YYYY-MM-DD HH:MM:SS"

+*/

+int mbtk_time_set(mbtk_info_handle_t* handle, mbtk_time_type_enum time_type, char* time_str);

+

+//call a phone number

+int mbtk_call_start(mbtk_info_handle_t* handle, char* phone_number);

+//answer a call

+int mbtk_call_answer(mbtk_info_handle_t* handle);

+//hang up all call

+int mbtk_call_hang(mbtk_info_handle_t* handle);

+//hang up a call

+int mbtk_a_call_hang(mbtk_info_handle_t* handle, int phone_id);

+//hang up waiting or background call

+int mbtk_waiting_or_background_call_hang(mbtk_info_handle_t* handle);

+//hang up foreground resume background call

+int mbtk_foreground_resume_background_call_hang(mbtk_info_handle_t* handle);

+//get call infomation

+int mbtk_call_reg_get(mbtk_info_handle_t* handle, mbtk_call_info_t *reg);

+//set call mute

+int mbtk_mute_state_set(mbtk_info_handle_t* handle, int mute_state);

+//get mute state

+int mbtk_mute_state_get(mbtk_info_handle_t* handle, int *mute_state);

+//Wake-up control

+int mbtk_wakeup_state_set(mbtk_info_handle_t* handle, uint32 wakeup_state);

+//Get the searching interval of OOS

+int mbtk_oos_get(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);

+//Set the searching interval of OOS

+int mbtk_oos_set(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);

+

+

+//set dtmf character

+int mbtk_dtmf_send(mbtk_info_handle_t* handle, mbtk_call_dtmf_info_t *dtmf_character);

+int mbtk_ceer_get(mbtk_info_handle_t* handle, void *ceer);

+

+//set led

+int mbtk_led_set(mbtk_info_handle_t* handle, mbtk_led_type type, mbtk_led_status status);

+

+
+/*
+* Set msd item.
+*
+*/
+int mbtk_ecall_msd_item_set(mbtk_info_handle_t* handle, const mbtk_ecall_msd_cfg_info_t *msd_cfg);

+
+/*
+* Generate msd after msd item set.
+*
+*/
+int mbtk_ecall_msd_gen(mbtk_info_handle_t* handle);

+
+/*
+* Set ecall msd.
+*
+*/
+int mbtk_ecall_msd_set(mbtk_info_handle_t* handle, const void* msd);

+
+/*
+* Get ecall msd.
+*
+*/
+int mbtk_ecall_msd_get(mbtk_info_handle_t* handle, void* msd);

+
+
+/*
+* Set ecall msd item.
+*
+*/
+int mbtk_ecall_push(mbtk_info_handle_t* handle);

+
+/*
+* Set ecall only configs.
+*
+*/
+int mbtk_ecall_only_set(mbtk_info_handle_t* handle, const mbtk_ecall_only_info_t* info);

+
+/*
+* Get ecall only configs.
+*
+*/
+int mbtk_ecall_only_get(mbtk_info_handle_t* handle, mbtk_ecall_only_info_t* info);

+
+/*
+* Set ecall network reg.
+*
+*/
+int mbtk_ecall_reg_set(mbtk_info_handle_t* handle, int reg);

+
+/*
+* Start ecall dial start.
+*
+*/
+int mbtk_ecall_dial_start(mbtk_info_handle_t* handle, mbtk_ecall_dial_type_enum type);

+
+/*
+* Get ecall dial state.
+*
+*/
+int mbtk_ecall_dial_state_get(mbtk_info_handle_t* handle, mbtk_ecall_dial_type_enum* type);

+
+/*
+* Set ecall mode.
+*
+*/
+int mbtk_ecall_mode_set(mbtk_info_handle_t* handle, mbtk_ecall_mode_type_enum mode);

+
+/*
+* Get ecall mode.
+*
+*/
+int mbtk_ecall_mode_get(mbtk_info_handle_t* handle, mbtk_ecall_mode_type_enum *mode);

+
+/*
+* Set ecall configs.
+*
+*/
+int mbtk_ecall_cfg_set(mbtk_info_handle_t* handle, const mbtk_ecall_cfg_info_t *cfg);

+
+/*
+* Get ecall configs.
+*
+*/
+int mbtk_ecall_cfg_get(mbtk_info_handle_t* handle, mbtk_ecall_cfg_info_t* cfg);

+
+/*
+* Set ecall sms number.
+*
+*/
+int mbtk_ecall_sms_number_set(mbtk_info_handle_t* handle, const void *number);

+
+/*
+* Get ecall sms number.
+*
+*/
+int mbtk_ecall_sms_number_get(mbtk_info_handle_t* handle, void *number);

+
+/*
+* Set ecall mute speaker.
+*
+*/
+int mbtk_ecall_mute_spk_set(mbtk_info_handle_t* handle, int mute);

+
+/*
+* Set ecall dsp gain.
+*
+*/
+int mbtk_ecall_dsp_gain_set(mbtk_info_handle_t* handle, const mbtk_ecall_gain_info_t *gain_info);

+

+/*

+* Set pdp state change callback function.

+*/

+int mbtk_pdp_state_change_cb_reg(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+

+/*

+* Set network state change callback function.

+*/

+int mbtk_net_state_change_cb_reg(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+

+/*

+* Set call state change callback function.

+*/

+int mbtk_call_state_change_cb_reg(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+

+/*

+* Set sms state change callback function.

+*/

+int mbtk_sms_state_change_cb_reg(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+

+/*

+* Set radio state change callback function.

+*/

+int mbtk_radio_state_change_cb_reg(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+

+/*

+* Set sim state change callback function.

+*/

+int mbtk_sim_state_change_cb_reg(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+

+/*

+* Set signal state change callback function.

+*/

+int mbtk_signal_state_change_cb_reg(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+

+/*

+* Set ril server state change callback function.

+*/

+int mbtk_ril_server_state_change_reg(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+

+int mbtk_ecall_state_change_cb_reg(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);

+

+int mbtk_sms_cnmi_set(mbtk_info_handle_t* handle);

+

+int mbtk_get_modem_version(mbtk_info_handle_t* handle, void *modem_version);

+

+//get fplmn list

+int mbtk_fplmn_get(mbtk_info_handle_t *handle, void *fplmn);

+

+//set fplmn list

+int mbtk_fplmn_set(mbtk_info_handle_t *handle, void *fplmn);

+

+

+#endif /* _MBTK_INFO_API_H */

diff --git a/mbtk/include/mbtk/mbtk_led_control.h b/mbtk/include/mbtk/mbtk_led_control.h
new file mode 100755
index 0000000..7ffe279
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_led_control.h
@@ -0,0 +1,29 @@
+#ifndef __MBTK_LED_CONTROL_H__
+#define __MBTK_LED_CONTROL_H__
+
+typedef enum
+{
+    MBTK_LED_STATUS_CLOSE = 0,	/*close status_led*/
+    MBTK_LED_STATUS_OPEN  = 1,	/*open status_led*/
+}mbtk_led_status_type;
+
+typedef enum
+{
+    MBTK_LED_STATUS = 0,	/*status_led*/
+    MBTK_LED_NET    = 1,	/*net_led*/
+	
+	MBTK_LED_MUM
+}mbtk_led_all;
+
+typedef struct
+{
+	int led_type;
+    int status;
+}led_info_s;
+
+
+int mbtk_led_set(led_info_s led_info);
+
+#endif
+
+
diff --git a/mbtk/include/mbtk/mbtk_list.h b/mbtk/include/mbtk/mbtk_list.h
new file mode 100755
index 0000000..bab5bb3
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_list.h
@@ -0,0 +1,63 @@
+/*
+ * mbtk_list.h
+ *
+ *  Created on: Aug 18, 2020
+ *      Author: lb
+ */
+
+#ifndef MBTK_LIST_H_
+#define MBTK_LIST_H_
+#include "mbtk_type.h"
+
+typedef struct list_arraynode
+{
+    void *data;
+    struct list_arraynode *next;
+} list_arraynode_t;
+
+typedef struct list_treenode
+{
+    list_arraynode_t *data;
+    int count;
+    struct list_treenode *left;
+    struct list_treenode *right;
+} list_treenode_t;
+
+typedef int (*list_sort_func)(void *data1, void *data2);
+typedef void (*list_free_func)(void *data);
+
+typedef struct list_node
+{
+    uint32 size;
+    list_sort_func sort_func;
+    list_free_func free_func;
+
+    uint32 cur_index;
+    list_arraynode_t *cur_array_data;
+
+    list_arraynode_t array_data;
+    list_treenode_t tree_data;
+} list_node_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+list_node_t* list_create(list_free_func free_func);
+uint32 list_size(list_node_t *list);
+void list_add(list_node_t *list, void *data);
+void list_add_unique(list_node_t *list, void *data, uint32 len);
+void* list_remove(list_node_t *list, void *data);
+void* list_get(list_node_t *list, uint32 index);
+void* list_remove_by_content(list_node_t *list, void *data, uint32 data_len);
+void list_first(list_node_t *list);
+void* list_next(list_node_t *list);
+void list_sort(list_node_t *list, list_sort_func sort_func);
+void list_free(list_node_t *list);
+void list_clear(list_node_t *list);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MBTK_LIST_H_ */
+
diff --git a/mbtk/include/mbtk/mbtk_log.h b/mbtk/include/mbtk/mbtk_log.h
new file mode 100755
index 0000000..acddb7c
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_log.h
@@ -0,0 +1,178 @@
+#ifndef MBTK_LOG_INCLUDE
+#define MBTK_LOG_INCLUDE
+#include <string.h>
+
+#ifndef MBTK_ANDROID_LOG
+//#define MBTK_ANDROID_LOG
+#endif
+
+#ifdef MBTK_ANDROID_LOG
+
+#ifndef LOG_TAG
+#define LOG_TAG "mbtk_log"
+#endif
+
+// Print ALOGV log.
+#ifndef LOG_NDEBUG
+//#define LOG_NDEBUG 0
+#endif
+
+#include <cutils/log.h>
+
+#define LOGV(fmt, arg...) ALOGV("Line-%d: " fmt,__LINE__,##arg)
+#define LOGI(fmt, arg...) ALOGI("Line-%d: " fmt,__LINE__,##arg)
+#define LOGD(fmt, arg...) ALOGD("Line-%d: " fmt,__LINE__,##arg)
+#define LOGW(fmt, arg...) ALOGW("Line-%d: " fmt,__LINE__,##arg)
+#define LOGE(fmt, arg...) ALOGE("Line-%d: " fmt,__LINE__,##arg)
+
+#else /* MBTK_ANDROID_LOG */
+
+//#include <log.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+#ifndef UNUSED
+#define UNUSED(a)    (void)(a)
+#endif
+
+//#include "pxa_dbg.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void mbtk_log(int level, const char *format, ...);
+void mbtk_log_init(char *path, char *tag);
+void log_hex(const char *tag, const void *data, int data_len);
+#ifdef __cplusplus
+}
+#endif
+
+#ifndef LOG_ERR_LEVEL
+#define LOG_ERR_LEVEL  3      /* error conditions */
+#endif
+#ifndef LOG_WARN_LEVEL
+#define LOG_WARN_LEVEL 4   /* warning conditions */
+#endif
+#ifndef LOG_INFO_LEVEL
+#define LOG_INFO_LEVEL 6      /* informational */
+#endif
+#ifndef LOG_DEBUG_LEVEL
+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */
+#endif
+#ifndef LOG_VERBOSE_LEVEL
+#define LOG_VERBOSE_LEVEL 8
+#endif
+
+#if 0
+#define LOGV(fmt, args ...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGI(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGD(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGW(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#define LOGE(fmt, args...) \
+    do{ \
+		char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
+    } while(0)
+
+#else
+
+#define LOGV(fmt, args ...) \
+    do{ \
+        mbtk_log(LOG_VERBOSE_LEVEL, "%s()#%d: " fmt, __FUNCTION__, __LINE__, ##args); \
+    } while(0)
+
+#define LOGI(fmt, args...) \
+    do{ \
+        mbtk_log(LOG_INFO_LEVEL, "%s()#%d: " fmt, __FUNCTION__, __LINE__, ##args); \
+    } while(0)
+
+#define LOGD(fmt, args...) \
+    do{ \
+        mbtk_log(LOG_DEBUG_LEVEL, "%s()#%d: " fmt, __FUNCTION__, __LINE__, ##args); \
+    } while(0)
+
+#define LOGW(fmt, args...) \
+    do{ \
+        mbtk_log(LOG_WARN_LEVEL, "%s()#%d: " fmt, __FUNCTION__, __LINE__, ##args); \
+    } while(0)
+
+#define LOGE(fmt, args...) \
+        do{ \
+            mbtk_log(LOG_ERR_LEVEL, "%s()#%d: " fmt, __FUNCTION__, __LINE__, ##args); \
+        } while(0)
+#endif
+
+#endif
+
+#define MBTK_SOURCE_INFO_PRINT(name) \
+    do{ \
+        LOGD("%s : %s(%s)", name, MBTK_BUILD_GIT, MBTK_BUILD_TIME); \
+        printf("%s : %s(%s)\n", name, MBTK_BUILD_GIT, MBTK_BUILD_TIME); \
+    } while(0)
+
+
+void mbtk_debug_open(const char *log_file, bool thread_support);
+
+void mbtk_lib_info_print();
+
+#endif /* MBTK_LOG_INCLUDE */
diff --git a/mbtk/include/mbtk/mbtk_loop_buffer.h b/mbtk/include/mbtk/mbtk_loop_buffer.h
new file mode 100755
index 0000000..314978d
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_loop_buffer.h
@@ -0,0 +1,34 @@
+/*
+* mbtk_loop_buffer.h
+*
+* MBTK loop buffer header.
+*
+* Author : lb
+* Date   : 2024/12/5 19:46:11
+*/
+#ifndef _MBTK_LOOP_BUFFER_H
+#define _MBTK_LOOP_BUFFER_H
+#include "mbtk_type.h"
+
+typedef void mbtk_loop_buff_handle;
+
+mbtk_loop_buff_handle* mbtk_loopbuff_get(int size);
+
+int mbtk_loopbuff_free(mbtk_loop_buff_handle* handle);
+
+int mbtk_loopbuff_write(mbtk_loop_buff_handle* handle, const void *data, int data_len);
+
+int mbtk_loopbuff_read(mbtk_loop_buff_handle* handle, void *data, int data_len);
+
+int mbtk_loopbuff_writen(mbtk_loop_buff_handle* handle, const void *data, int data_len);
+
+int mbtk_loopbuff_readn(mbtk_loop_buff_handle* handle, void *data, int data_len);
+
+// Only for read seek.
+int mbtk_loopbuff_seek(mbtk_loop_buff_handle* handle, int offset);
+
+int mbtk_loopbuff_size(mbtk_loop_buff_handle* handle);
+
+void mbtk_loopbuff_print(mbtk_loop_buff_handle* handle);
+
+#endif /* _MBTK_LOOP_BUFFER_H */
diff --git a/mbtk/include/mbtk/mbtk_lpm.h b/mbtk/include/mbtk/mbtk_lpm.h
new file mode 100755
index 0000000..10e1175
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_lpm.h
@@ -0,0 +1,38 @@
+#ifndef __MBTK_LPM_H__

+#define __MBTK_LPM_H__

+

+typedef enum 

+{

+    E_MBTK_LPM_FALLING	= 0, /* Falling, Means wakeupin falling to wakeup the module, or wakeupout falling to wakeup mcu. */

+    E_MBTK_LPM_RISING	= 1, /* Rising, Means  wakeupin rising to wakeup the module,  or wakeupout rising to wakeup  mcu. */

+}mbtk_lpm_edge_t;

+

+/* Callback function registered via Mbtk_Lpm_Init();

+ * It will be called when wakeup_in state changed.

+ * lpm_edge: report the wakeup_in state.

+*/

+typedef void (*mbtk_lpm_handler_t)

+(

+	mbtk_lpm_edge_t lpm_edge

+);

+

+/* Init MBTK LPM Init function.

+ * Para:

+ * 	mbtk_lpm_handler: the callback handler.

+ * 	

+ * Return value:

+ *	0  --> success

+ * 	-1 --> failed

+*/

+extern int mbtk_lpm_init(mbtk_lpm_handler_t mbtk_lpm_handler);

+

+/* Deinit MBTK LPM function

+ * Rmmod MBTK_lpm kmod, remove lpm handler.

+ * Return value:

+ * 	0  --> success

+ *	-1 --> failed 

+*/

+extern int mbtk_lpm_deinit(void);

+

+#endif // __MBTK_LPM_H__

+

diff --git a/mbtk/include/mbtk/mbtk_map.h b/mbtk/include/mbtk/mbtk_map.h
new file mode 100755
index 0000000..d0ed1d2
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_map.h
@@ -0,0 +1,44 @@
+/*
+ * mbtk_map.h
+ *
+ *  Created on: Aug 18, 2020
+ *      Author: lb
+ */
+
+#ifndef MBTK_MAP_H_
+#define MBTK_MAP_H_
+#include "mbtk_type.h"
+
+typedef void (*map_free_func)(void *data);
+
+typedef struct map_data
+{
+    char *key;
+    void *value;
+    struct map_data *next;
+} map_data_t;
+
+typedef struct
+{
+    uint32 size;
+    uint32 capacity;
+    uint32 cur_index;
+    map_data_t *cur_data;
+    map_free_func free_func;
+
+    map_data_t **map_array;
+} map_node_t;
+
+map_node_t* map_create(uint32 capacity, map_free_func free_func);
+uint32 map_size(map_node_t* map);
+uint32 map_hash(const char* key, uint32 capacity);
+void map_put(map_node_t* map, const char* key, void* value);
+void* map_get(map_node_t* map, char* key);
+void* map_remove(map_node_t* map, char* key);
+void map_first(map_node_t *map);
+void* map_next(map_node_t *map);
+void map_clear(map_node_t* map);
+void map_free(map_node_t* map);
+
+#endif /* MBTK_MAP_H_ */
+
diff --git a/mbtk/include/mbtk/mbtk_mbedtls.h b/mbtk/include/mbtk/mbtk_mbedtls.h
new file mode 100755
index 0000000..7a11c4e
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_mbedtls.h
@@ -0,0 +1,106 @@
+/*-----------------------------------------------------------------------------------------------*/

+/**

+  @file mbtk_mbedtls.h

+  @brief MBEDTLS API

+*/

+/*-----------------------------------------------------------------------------------------------*/

+

+/*-------------------------------------------------------------------------------------------------

+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.

+  mobiletek Wireless Solution Proprietary and Confidential.

+-------------------------------------------------------------------------------------------------*/

+

+/*-------------------------------------------------------------------------------------------------

+  EDIT HISTORY

+  This section contains comments describing changes made to the file.

+  Notice that changes are listed in reverse chronological order.

+  $Header: $

+  when       who          what, where, why

+  --------   ---------    -----------------------------------------------------------------

+  20250409    yq.wang      Created .

+-------------------------------------------------------------------------------------------------*/

+#ifndef __MBTK_MBEDTLS_H__

+#define __MBTK_MBEDTLS_H__

+#include <stdbool.h>

+

+#include <mbedtls/ssl.h>

+#include <mbedtls/entropy.h>

+#include <mbedtls/ctr_drbg.h>

+#include <mbedtls/error.h>

+#include <mbedtls/debug.h>

+#include <mbedtls/x509_crt.h>

+#include <mbedtls/pk.h>

+#include <mbedtls/ssl.h>

+#include <mbedtls/net_sockets.h>

+

+#define MBTK_MBEDTLS_SSL_IS_CLIENT MBEDTLS_SSL_IS_CLIENT

+#define MBTK_MBEDTLS_SSL_IS_SERVER MBEDTLS_SSL_IS_SERVER

+

+#define MBTK_MBEDTLS_SSL_TRANSPROT_STREAM MBEDTLS_SSL_TRANSPORT_STREAM

+#define MBTK_MBEDTLS_SSL_TRANSPROT_DATAGRAM MBEDTLS_SSL_TRANSPORT_DATAGRAM

+

+#define MBTK_MBEDTLS_SSL_PRESET_DEFAULT MBEDTLS_SSL_PRESET_DEFAULT

+#define MBTK_MBEDTLS_SSL_PRESET_SUITEB MBEDTLS_SSL_PRESET_SUITEB

+

+#define MBTK_MBEDTLS_SSL_VERIFY_NONE MBEDTLS_SSL_VERIFY_NONE

+#define MBTK_MBEDTLS_SSL_VERIFY_OPTIONAL MBEDTLS_SSL_VERIFY_OPTIONAL

+#define MBTK_MBEDTLS_SSL_VERIFY_REQUIRED MBEDTLS_SSL_VERIFY_REQUIRED

+

+#define MBTK_MBEDTLS_SSL_RENEGOTIATION_ENABLED MBEDTLS_SSL_RENEGOTIATION_ENABLED

+#define MBTK_MBEDTLS_SSL_RENEGOTIATION_DISABLED MBEDTLS_SSL_RENEGOTIATION_DISABLED

+

+#define MBTK_MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION

+#define MBTK_MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION

+#define MBTK_MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE

+

+#define MBTK_MBEDTLS_SSL_MINOR_VERSION_2 MBEDTLS_SSL_MINOR_VERSION_2

+#define MBTK_MBEDTLS_SSL_MINOR_VERSION_3 MBEDTLS_SSL_MINOR_VERSION_3

+#define MBTK_MBEDTLS_SSL_MINOR_VERSION_4 MBEDTLS_SSL_MINOR_VERSION_4

+

+#define MBTK_MBEDTLS_SSL_MD_MD5 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_MD5)

+#define MBTK_MBEDTLS_SSL_MD_SHA1 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1)

+#define MBTK_MBEDTLS_SSL_MD_SHA224 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA224)

+#define MBTK_MBEDTLS_SSL_MD_SHA256 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256)

+#define MBTK_MBEDTLS_SSL_MD_SHA384 MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384)

+

+typedef enum {

+    MBTK_MBEDTLS_SSL_RESULT_SUCCESS = 0,

+    MBTK_MBEDTLS_SSL_RESULT_FAIL

+}mbtk_mbedtls_ssl_result_e;

+

+typedef struct {

+    int fd;

+    mbedtls_entropy_context *entropy;

+    mbedtls_ctr_drbg_context *ctr_drbg;

+    mbedtls_ssl_context *ssl;

+    mbedtls_ssl_config *conf;

+    mbedtls_x509_crt *cacert;

+    mbedtls_x509_crt *clientcert;

+    mbedtls_pk_context *clientkey;

+} mbtk_mbedtls_ssl_info_s;

+

+typedef struct {

+    bool load_cert;                /* Whether to load the certificate */

+    const char *ca_file;           /* the file with the CA certificate(s) */

+    const char *crt_file;          /* the file with the client certificate */

+    const char *key_file;          /* the file with the client key */

+    const unsigned char *pers_str; /* Personalized string, distinguish between different application scenarios of random number sequence */

+    int pers_str_size;             /* Personalized string length */

+    int type;                      /* Client/server */

+    int transprot;                 /* Transport protocol */

+    int preset;                    /* The default security configuration level */

+    int auth_mode;                 /* Set the certificate authentication mode for SSL/TLS connections */

+    int renegotiation;             /* Enables or disables the session renegotiation function */

+    int allow_legacy;              /* Controls whether to enable compatibility support for TLS renegotiation of earlier versions */

+    int min_version;               /* minimum protocol version accepted */

+    int max_version;               /* maximum protocol version accepted */

+    uint32_t allowed_mds;          /* List of allowed hashing algorithms (e.g. SHA-256) */

+}mbtk_mbedtls_ssl_options_s;

+

+mbtk_mbedtls_ssl_result_e mbtk_mbedtls_ssl_options_default(mbtk_mbedtls_ssl_options_s *opt);

+int mbtk_mbedtls_ssl_write(mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len );

+int mbtk_mbedtls_ssl_read(mbedtls_ssl_context *ssl, unsigned char *buf, size_t len );

+mbtk_mbedtls_ssl_result_e mbtk_mbedtls_ssl_init(int fd , mbtk_mbedtls_ssl_options_s *opt, mbtk_mbedtls_ssl_info_s* inter_info);

+mbtk_mbedtls_ssl_result_e mbtk_mbedtls_ssl_deinit(mbtk_mbedtls_ssl_info_s* inter_info);

+

+#endif

diff --git a/mbtk/include/mbtk/mbtk_mqtt.h b/mbtk/include/mbtk/mbtk_mqtt.h
new file mode 100755
index 0000000..02c54e1
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_mqtt.h
@@ -0,0 +1,107 @@
+#ifndef MBTK_MQTT_H
+#define MBTK_MQTT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "mqtt/MQTTClient.h"
+#include "mqtt/MQTTLinux.h"
+enum  iot_ctrl_status_t
+{
+	IOT_STATUS_LOGIN,
+	IOT_STATUS_CONNECT,
+	IOT_STATUS_DROP,
+};
+typedef void  (*pMessageArrived_Fun)(void*,int len);
+
+#define MQTT_TOPIC_SIZE     (128)		//订阅和发布主题长度
+#define MQTT_BUF_SIZE       (8 * 1024) 	//接收后发送缓冲区大小
+#define MQTT_CONFIG_SIZE    256
+#define MBTK_IMQTT_USER_NAME_LEN   (100)
+#define MBTK_IMQTT_CLIENT_ID_LEN   (160)
+#define MBTK_IMQTT_PASSWORD_LEN    (160)
+#define MBTK_ITOPIC_PATH_MAX_LEN (MBTK_IMQTT_CLIENT_ID_LEN+40) //160+40
+
+#define MQTT_HOST "***.***.***.***"		//ip地址
+#define MQTT_PORT 61613					//端口号
+#define MQTT_USER "admin"				//用户名
+#define MQTT_PASS "password"			//密码
+#define MQTT_CLIENT_ID "17849359"		//客户端标识
+
+typedef struct {
+    Network* network;
+    Client Client;
+    char sub_topic[MQTT_TOPIC_SIZE];		//存放订阅主题
+    char pub_topic[MQTT_TOPIC_SIZE];		//存放发布主题
+    char mqtt_buffer[MQTT_BUF_SIZE];		//发送缓冲区
+    char mqtt_read_buffer[MQTT_BUF_SIZE];	//接收缓冲区
+
+    unsigned char willFlag;
+    MQTTPacket_willOptions will;
+    char will_topic[MQTT_TOPIC_SIZE];		//存放遗嘱主题
+
+    pMessageArrived_Fun DataArrived_Cb;
+
+    char mqtt_host[MQTT_CONFIG_SIZE] ;
+    char mqtt_client_id[MQTT_CONFIG_SIZE];
+    char mqtt_user[MQTT_CONFIG_SIZE];
+    char mqtt_pass[MQTT_CONFIG_SIZE];
+    int mqtt_port;
+    int keepAliveInterval;
+    int mqtt_version;
+}Cloud_MQTT_t;
+
+typedef struct{
+    enum iot_ctrl_status_t iotstatus;
+    char model[5];
+    char company[32];
+} iot_device_info_t;//主题结构体
+
+
+struct opts_struct {
+    char    *clientid;
+    int     nodelimiter;
+    char    *delimiter;
+    enum    QoS qos;
+    char    *username;
+    char    *password;
+    char    *host;
+    int     port;
+    int     showtopics;
+}; //结构体
+
+typedef struct mbtk_mqtt_device_session{
+    char product_key[MQTT_CONFIG_SIZE];
+    char product_secret[MQTT_CONFIG_SIZE];
+    char device_name[MQTT_CONFIG_SIZE];
+    char device_secret[MQTT_CONFIG_SIZE];
+    int host;
+    int port;
+} mbtk_mqtt_device_session_t;
+
+void mqtt_module_init(void);
+int mqtt_data_write(char *pbuf, int len, char retain);
+
+void iot_mqtt_init(Cloud_MQTT_t *piot_mqtt,char *host,int port ,char *clientid,char *user,char *pass,int keepAliveInterval,int version,char *sub_topic,char *pub_topic,pMessageArrived_Fun mqtt_data_rx_cb);
+int mqtt_will_msg_set(Cloud_MQTT_t *piot_mqtt, char *pbuf, int len);
+int mqtt_device_connect(Cloud_MQTT_t *piot_mqtt);
+int mqtt_device_disconnect(Cloud_MQTT_t *piot_mqtt);
+int mbtk_aliyun_mqtt_one_type_one_secret_unregin_device_connect(Cloud_MQTT_t *piot_mqtt);
+void mbtk_aliyun_mqtt_one_type_one_secret_unregin_set_info_init(Cloud_MQTT_t *piot_mqtt,mbtk_mqtt_device_session_t *device,int keepAliveInterval,int version,pMessageArrived_Fun mqtt_data_rx_cb);
+int mbtk_aliyun_mqtt_one_type_one_secret_unregin_get_regin_info(char *clientId, char *deviceToken);
+void iot_aliyun_mqtt_one_type_one_secret_unregin_connect_init(Cloud_MQTT_t *piot_mqtt,mbtk_mqtt_device_session_t *device, char *clientId, char *deviceToken,
+         int keepAliveInterval,int version,char *sub_topic,char *pub_topic,pMessageArrived_Fun mqtt_data_rx_cb);
+void mqtt_data_rx_cb(void *pbuf, int len);
+void *cloud_mqtt_thread(void *arg);
+int mbtk_MQTTSubscribe(Client* c, const char* topicFilter, enum QoS qos, messageHandler messageHandler);
+int mbtk_MQTTUnsubscribe(Client* c, const char* topicFilter);
+int mbtk_MQTTPublish(char *pbuf, int len, char retain,Client* c,const char* pub_topic,enum QoS qos,char dup);
+#define mDEBUG(fmt, ...)  printf("%s[%s](%d):" fmt,__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mbtk/include/mbtk/mbtk_mtd.h b/mbtk/include/mbtk/mbtk_mtd.h
new file mode 100755
index 0000000..b2935b9
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_mtd.h
@@ -0,0 +1,28 @@
+/*
+* mbtk_mtd.h
+*
+* MBTK mtd partition utils header.
+*
+* Author : lb
+* Date   : 2024/2/26 16:03:50
+*/
+#ifndef _MBTK_MTD_H
+#define _MBTK_MTD_H
+#include "mbtk_type.h"
+
+#define MBTK_PARTITION_NUM_MAX 40
+
+typedef struct {
+    char name[32];
+    char dev[16];
+    uint32 partition_start;
+    uint32 partition_size;
+    uint32 erase_size;
+
+    bool used;
+} mbtk_partition_info_t;
+
+mbtk_partition_info_t* mbtk_partition_get();
+int mbtk_partition_get_by_name(char *partition_name, mbtk_partition_info_t *info);
+
+#endif /* _MBTK_MTD_H */
diff --git a/mbtk/include/mbtk/mbtk_net_control.h b/mbtk/include/mbtk/mbtk_net_control.h
new file mode 100755
index 0000000..2cfe788
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_net_control.h
@@ -0,0 +1,85 @@
+/*************************************************************
+Description:
+    Header file for network control.
+Author:
+    LiuBin
+Date:
+    2019/7/24 17:18:43
+*************************************************************/
+#ifndef _MBTK_NET_CONTROL_H
+#define _MBTK_NET_CONTROL_H
+#include "mbtk_type.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*************************************************************
+    Constants and Macros
+*************************************************************/
+
+
+/*************************************************************
+    Definitions:enum,struct,union,class
+*************************************************************/
+typedef enum {
+    MBTK_NET_STATE_OFF,     /* Network off */
+    MBTK_NET_STATE_CONN,     /* Network connected */
+    MBTK_NET_STATE_CONN_2G,  // 2
+    MBTK_NET_STATE_CONN_3G,  // 3
+    MBTK_NET_STATE_CONN_4G,  // 4
+    MBTK_NET_STATE_CONN_UNKNOWN
+} mbtk_net_state_t;
+
+typedef enum {
+    MBTK_NET_CHANGE_IF,         // Interface changed.
+    MBTK_NET_CHANGE_ADDR        // Address changed
+} mbtk_net_change_type_t;
+
+typedef enum {
+    MBTK_NET_IF_CHANGE_TYPE_ADD,       // Interface add.
+    MBTK_NET_IF_CHANGE_TYPE_DEL        // Interface delete.
+} mbtk_net_if_change_type_t;
+
+typedef enum {
+    MBTK_NET_IF_CHANGE_STATE_UP,       // Interface up.
+    MBTK_NET_IF_CHANGE_STATE_DOWN        // Interface down.
+} mbtk_net_if_change_state_t;
+
+typedef enum {
+    MBTK_NET_ADDR_CHANGE_TYPE_ADD,       // Address add.
+    MBTK_NET_ADDR_CHANGE_TYPE_DEL        // Address delete.
+} mbtk_net_addr_change_type_t;
+
+typedef struct {
+    int if_index;
+    char if_name[100];
+    mbtk_net_if_change_type_t type;
+    mbtk_net_if_change_state_t state;
+} mbtk_net_if_change_info_t;
+
+typedef struct {
+    int if_index;
+    char if_name[100];
+    mbtk_net_addr_change_type_t type;
+    char addr[100];
+} mbtk_net_addr_change_info_t;
+
+typedef void (*mbtk_net_state_callback_func)(mbtk_net_change_type_t type, const void *data);
+
+/*************************************************************
+    Extern variables
+*************************************************************/
+
+
+/*************************************************************
+    Public Function Declaration
+*************************************************************/
+mbtk_net_state_t mbtk_net_state_get();
+int mbtk_net_enable(bool enable);
+int mbtk_net_monitor_reg(const char* if_name, mbtk_net_state_callback_func state_cb);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif /* _MBTK_NET_CONTROL_H */
diff --git a/mbtk/include/mbtk/mbtk_ntp.h b/mbtk/include/mbtk/mbtk_ntp.h
new file mode 100755
index 0000000..1b3b926
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_ntp.h
@@ -0,0 +1,39 @@
+#ifndef __MBTK_NTP_H__
+#define __MBTK_NTP_H__
+
+
+/*****************************************************************
+* Function:     mbtk_at_systime
+*
+* Description:  
+*               This function is used to get the time from ntp server "cn.pool.ntp.org"
+*
+* Parameters:
+*               null
+*
+* Return:
+*               time_t is success
+*               0 is fail
+*****************************************************************/
+int mbtk_at_systime(void);
+
+/*****************************************************************
+* Function:     mbtk_ntp_server_set
+*
+* Description:  
+*               This function is used to set the ip address and port of NTP server.
+*               return the time obtained from ntp.
+*
+* Parameters:
+*               server_ip  : NTP server
+*
+*		        port : ntp port
+*
+* Return:
+*               time_t is success
+*               0 is fail
+*****************************************************************/
+time_t mbtk_ntp_server_set(const char* server_ip, const char * port);
+
+
+#endif
\ No newline at end of file
diff --git a/mbtk/include/mbtk/mbtk_openssl.h b/mbtk/include/mbtk/mbtk_openssl.h
new file mode 100755
index 0000000..ab2f7ca
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_openssl.h
@@ -0,0 +1,82 @@
+/*-----------------------------------------------------------------------------------------------*/

+/**

+  @file mbtk_openssl.h

+  @brief OPENSSL API

+*/

+/*-----------------------------------------------------------------------------------------------*/

+

+/*-------------------------------------------------------------------------------------------------

+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.

+  mobiletek Wireless Solution Proprietary and Confidential.

+-------------------------------------------------------------------------------------------------*/

+

+/*-------------------------------------------------------------------------------------------------

+  EDIT HISTORY

+  This section contains comments describing changes made to the file.

+  Notice that changes are listed in reverse chronological order.

+  $Header: $

+  when       who          what, where, why

+  --------   ---------    -----------------------------------------------------------------

+  20250410    yq.wang      Created .

+-------------------------------------------------------------------------------------------------*/

+#ifndef __MBTK_OPENSSL_H__

+#define __MBTK_OPENSSL_H__

+#include <stdbool.h>

+#include <openssl/ssl.h>

+#include <openssl/err.h>

+

+#define MBTK_OPENSSL_FILETYPE_PEM SSL_FILETYPE_PEM

+#define MBTK_OPENSSL_FILETYPE_ASN1 SSL_FILETYPE_ASN1

+

+#define MBTK_OPENSSL_VERIFY_NONE SSL_VERIFY_NONE

+#define MBTK_OPENSSL_VERIFY_PEER SSL_VERIFY_PEER

+//The following is valid only on the server side

+#define MBTK_OPENSSL_VERIFY_FAIL_IF_NO_PEER_CERT SSL_VERIFY_FAIL_IF_NO_PEER_CERT

+#define MBTK_OPENSSL_VERIFY_CLIENT_ONCE SSL_VERIFY_CLIENT_ONCE

+

+#define MBTK_OPENSSL_INIT_LOAD_SSL_STRINGS OPENSSL_INIT_LOAD_SSL_STRINGS

+#define MBTK_OPENSSL_INIT_LOAD_CRYPTO_STRINGS OPENSSL_INIT_LOAD_CRYPTO_STRINGS

+#define MBTK_OPENSSL_INIT_ADD_ALL_CIPHERS OPENSSL_INIT_ADD_ALL_CIPHERS

+#define MBTK_OPENSSL_INIT_ADD_ALL_DIGESTS OPENSSL_INIT_ADD_ALL_DIGESTS

+#define MBTK_OPENSSL_INIT_NO_LOAD_SSL_STRINGS OPENSSL_INIT_NO_LOAD_SSL_STRINGS

+#define MBTK_OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS

+

+#define MBTK_OPENSSL_SAFETY_LEVEL_0 0

+#define MBTK_OPENSSL_SAFETY_LEVEL_1 1

+#define MBTK_OPENSSL_SAFETY_LEVEL_2 2

+#define MBTK_OPENSSL_SAFETY_LEVEL_3 3

+#define MBTK_OPENSSL_SAFETY_LEVEL_4 4

+#define MBTK_OPENSSL_SAFETY_LEVEL_5 5

+

+typedef int (*mbtk_verify_callback)(int preverify_ok, X509_STORE_CTX *x509_ctx);

+

+typedef enum {

+    MBTK_OPENSSL_RESULT_SUCCESS = 0,

+    MBTK_OPENSSL_RESULT_FAIL

+}mbtk_openssl_result_e;

+

+typedef struct {

+    int fd;

+    SSL_CTX *ctx;

+    SSL *ssl;

+} mbtk_openssl_info_s;

+

+typedef struct {

+    bool load_cert;                 /* Whether to load the certificate */

+    const char *ca_file;            /* the file with the CA certificate(s) */

+    const char *crt_file;           /* the file with the client certificate */

+    const char *key_file;           /* the file with the client key */

+    int ssl_filetype;               /* Specifies the encoding format of the certificate file */

+    int verify_mode;                /* Verification mode */

+    mbtk_verify_callback verify_cb; /* Custom validation callback functions */

+    uint64_t init_opts;             /* The bit mask of the initialization option */

+    int safety_level;               /* Set security level(0-5) */

+}mbtk_openssl_options_s;

+

+mbtk_openssl_result_e mbtk_openssl_options_default(mbtk_openssl_options_s *opt);

+int mbtk_openssl_write(SSL *ssl, const void *buf, int len);

+int mbtk_openssl_read(SSL *ssl, void *buf, int len);

+mbtk_openssl_result_e mbtk_openssl_init(int fd, mbtk_openssl_options_s *opt, mbtk_openssl_info_s *inter_info);

+mbtk_openssl_result_e mbtk_openssl_deinit(mbtk_openssl_info_s *inter_info);

+

+#endif
\ No newline at end of file
diff --git a/mbtk/include/mbtk/mbtk_pdu_sms.h b/mbtk/include/mbtk/mbtk_pdu_sms.h
new file mode 100755
index 0000000..83ab0d2
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_pdu_sms.h
@@ -0,0 +1,431 @@
+//

+// Created by hitmoon on 15-12-9.

+//

+

+#ifndef SMS_SMS_H

+#define SMS_SMS_H

+

+#include <string.h>

+#include "mbtk_utf.h"

+#include "mbtk_type.h"

+

+#define MAX_SMS_NR 32

+

+//typedef int bool;

+

+#define true 1

+#define false 0

+

+enum EnumDCS {

+    BIT7 = 0,            // GSM 字符集

+    BIT8 = 1,            // ASCII字符集

+    UCS2 = 2             // Unicode 字符集

+};

+

+enum EnumUDL {

+    BIT7UDL = 160,

+    BIT8UDL = 140,

+    UCS2UDL = 70

+};

+

+enum EnumCSMIEI {

+    BIT8MIEI = 0,

+    BIT16MIEI = 8

+};

+

+struct PDUUDH {

+    unsigned int count;    // 信息元素数据字节数

+    char IEI;           // 信息元素标识

+    char *IED;          // 信息元素数据

+};

+

+// 用户数据头

+struct UDHS {

+    int count;

+    struct PDUUDH *UDH;

+};

+

+// 用户数据数组,用于拆分短信

+struct UDS {

+    unsigned int total;

+    char **Data;

+};

+

+// 编码后短信

+struct PDUS {

+    unsigned int count;

+    char **PDU;

+};

+

+struct ByteArray {

+    char *array;

+    unsigned int len;

+};

+

+struct SMS_Struct {

+    char *SCA;         // 服务中心地址

+    char *OA;          // 发送方地址

+    char *SCTS;        // 服务中心时间戳

+    struct UDHS *UDH;     // 用户数据头

+    char *UD;          // 用户数据

+

+    bool RP;              // 应答路径

+    bool UDHI;            // 用户数据头标识

+    bool SRI;             // 状态报告指示

+    bool MMS;             // 更多信息发送

+    int MTI;              // 信息类型指示

+

+    char PID;          // PID 协议标识

+

+    enum EnumDCS DCS;      // 数据编码方案

+    bool TC;              // 文本压缩指示 0: 未压缩 1:压缩

+    int MC;               // 消息类型 -1: 无 1:移动设备特定类型 2:SIM特定类型 3:终端设备特定类型

+

+};

+

+/* mbtk sms start */

+

+#define REPLACEMENT_CHAR    (UTF32)0x0000FFFD

+#define MAX_UNI_BMP         (UTF32)0x0000FFFF

+#define MAX_UNI_UCS2        MAX_UNI_BMP

+#define MAX_UTF16           (UTF32)0x0010FFFF

+#define MAX_UTF32           (UTF32)0x7FFFFFFF

+#define MAX_LEGAL_UTF32     (UTF32)0x0010FFFF

+

+#define MDAPI_TIME_STR_SIZE         22

+#define MDAPI_PHONE_NUMBER_SIZE     32

+#define MDAPI_MAX_PDU_SIZE          512

+#define MAX_CONCATENATED_MSG 32

+#define MAX_7BIT_MSG_LEN    153

+#define MAX_UCS2_MSG_LEN    67

+#define MAX_8BIT_MSG_LEN    268 //134*2

+

+#define SMS_DELIVER         0x00

+#define SMS_DELIVER_REPORT  0x00

+#define SMS_SUBMIT          0x01

+#define SMS_SUBMIT_REPORT   0x01

+#define SMS_STATUS_REPORT   0x02

+#define SMS_STATUS_COMMAND  0x02

+

+

+#define STATUS_SUCCESS          0

+#define STATUS_MEM_EXHAUSTED    (-0xC0000)

+#define STATUS_ILLEGAL_UTF8     (-0xC0001)

+#define STATUS_ILLEGAL_UTF16    (-0xC0002)

+#define STATUS_ILLEGAL_UTF32    (-0xC0003)

+#define STATUS_ILLEGAL_UCS2     (-0xC0004)

+#define STATUS_NULL_POINTER     (-0x00001)

+

+

+#define SUR_HIGH_START  (UTF32)0xD800

+#define SUR_HIGH_END    (UTF32)0xDBFF

+#define SUR_LOW_START   (UTF32)0xDC00

+#define SUR_LOW_END     (UTF32)0xDFFF

+

+

+

+/*

+ * Unix/Linux

+ */

+typedef char kal_int8;

+

+typedef unsigned char kal_uint8;

+

+typedef short kal_int16;

+

+typedef unsigned short kal_uint16;

+

+typedef int kal_int32;

+

+typedef unsigned int kal_uint32;

+

+/**/

+typedef long long kal_int64;

+

+/**/

+typedef unsigned long long kal_uint64;

+

+typedef char kal_char;

+

+

+

+

+enum SMS_VPF_E

+{

+    SMS_VPF_NO_PRESENT  = 0x00,

+    SMS_VPF_RESORVED    = 0x01,

+    SMS_VPF_RELATIVE    = 0x02,

+    SMS_VPF_ABSOLUTE    = 0x03,

+    SMS_VPF_INVALID     = 0xFF,

+};

+

+

+enum SMS_ADDR_NUM_PLAN

+{

+    SMS_NP_UNKOWN       = 0x00,

+    SMS_NP_ISDNTEL      = 0x01,

+    SMS_NP_DATA         = 0x03,

+    SMS_NP_TELIX        = 0x04,

+    SMS_NP_NATIONAL     = 0x08,

+    SMS_NP_PRIVATE      = 0x09,

+    SMS_NP_RESERVED     = 0xFF,

+};

+

+enum SMS_ADDR_TYPE

+{

+    SMS_TON_UNKNOWN         = 0,

+    SMS_TON_INTERNATIONAL   = 1,

+    SMS_TON_NATIONAL        = 2,

+    SMS_TON_NETWORKSPECIFIC = 3,

+    SMS_TON_SUBSCRIBER      = 4,

+    SMS_TON_ALPHANUMERIC    = 5,

+    SMS_TON_ABBREVIATED     = 6,

+    SMS_TON_RESERVED        = 7

+};

+

+enum SMS_ADDR_ENCODE_TYPE

+{

+    SMS_ENCODE_SCA      = 0,

+    SMS_ENCODE_OADA     = 1,

+    SMS_ENCODE_INVALID  = 0xFF,

+};

+

+enum MDAPI_RET_e {

+    MDAPI_RET_SUCCESS       = 0,

+    MDAPI_RET_ERROR         = 1,

+    MDAPI_RET_TIMEOUT       = 2,

+    MDAPI_RET_NOT_SUPPORT   = 3,

+};

+

+enum MDAPI_SMS_CHARSET_E

+{

+    MDAPI_SMS_CHARSET_GSM_7BIT  = 0x00000000,

+    MDAPI_SMS_CHARSET_GSM_8BIT  = 0x00000001,

+    MDAPI_SMS_CHARSET_UCS2      = 0x00000002,

+    MDAPI_SMS_CHARSET_INVALID,

+};

+

+enum MDAPI_SMS_POSITION_E

+{

+    MDAPI_SMS_POS_INBOX     = 0x00000001,

+    MDAPI_SMS_POS_SENTBOX   = 0x00000002,

+    MDAPI_SMS_POS_DRAFBOX   = 0x00000003,

+    MDAPI_SMS_POS_OUTBOX    = 0x00000004,

+    MDAPI_SMS_POS_INVALID,

+};

+

+/* */

+enum  MDAPI_SMS_MSGTYPE_E

+{

+    MDAPI_SMS_NORMAL_MSG    = 0x00000000,

+    MDAPI_SMS_MSG_REPORT    = 0x00000001,

+    MDAPI_SMS_MMS_ALERT     = 0x00000002,

+    MDAPI_SMS_VOICE_MAIL    = 0x00000003,

+    MDAPI_SMS_MSGTYPE_INVALID,

+};

+

+typedef struct _mdapi_sms_setting {

+    kal_int8 rd;    /* reject duplicate */

+    kal_int8 vpf;   /* validity peroid format */

+    kal_int8 srr;   /* status report request */

+    kal_int8 rp;    /* replay path */

+    kal_int32 validity_period;   /* validity peroid */

+} mdapi_sms_settings_t;

+

+typedef struct _mdapi_sms_record {

+    kal_int32 msg_id;

+    kal_int32 is_read;

+    kal_int32 position;

+    kal_int32 result;

+    kal_int32 msg_type;

+    kal_int32 sms_class;

+    kal_int32 total_pack;

+    kal_int32 curr_pack;

+    kal_int32 ref_num;

+    kal_int32 msg_location;

+    kal_int16 charset;

+    kal_char  time[MDAPI_TIME_STR_SIZE];            /*YYYY-MM-DD HH:MM:SS*/

+    kal_char  phone_number[MDAPI_PHONE_NUMBER_SIZE];

+    kal_char  *msg_content;

+} mdapi_sms_record_t;

+

+typedef struct _smsbuf {

+    kal_uint8 *curbyte;

+    kal_uint8 *finalbyte;

+    kal_uint8 *septet_start;

+    kal_uint8 curbit;

+    kal_uint8 smsbuf[512];

+} smsbuf_t;

+

+static const kal_int32 UTF16_HALF_SHIFT  = 10; /* used for shifting by 10 bits */

+static const UTF32 UTF16_HALF_BASE = 0x0010000UL;

+static const UTF32 UTF16_HALF_MASK = 0x3FFUL;

+

+static const unsigned char utf8_tailing_bytes[256] = {

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

+    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,

+    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,

+    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,

+    3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5

+};

+

+static const UTF32 utf8_offsets[6] = {

+    0x00000000UL,

+    0x00003080UL,

+    0x000E2080UL,

+    0x03C82080UL,

+    0xFA082080UL,

+    0x80282080UL

+};

+

+#define MAX_OUT_SIZE 512

+#define MAX_PDU_SIZE 512

+

+typedef struct latin1_to_gsm_extable {

+    kal_int8 symbol;

+    kal_uint8 value;

+} Latin1_to_Gsm_ExTable;

+

+

+

+static const UTF8 first_byte_mark[7] = {

+    0x00,

+    0x00,

+    0xC0,

+    0xE0,

+    0xF0,

+    0xF8,

+    0xFC

+};

+

+

+int smsPduEncode(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu);

+

+int smsPduDecode(const char *pdu_str, int pdu_len, char *da_num, char *smsc, char *msg, int *charset, int *curr_pack, int *total_pack, char *date);

+

+kal_int32 _mdapi_sms_get_msg_num(const char *msg, int charset, kal_int32 *msg_num, kal_int32 *msg_len);

+

+kal_int32 _mdapi_sms_encode_addr(smsbuf_t *buf, kal_int8 *smsc, kal_int32 type);

+

+kal_int32 _mdapi_sms_encode_pdu(mdapi_sms_record_t *sms,kal_int8 *smsc, mdapi_sms_settings_t *settings, kal_char *start, kal_int32 send_size, kal_uint8 *udh, kal_char *output, kal_int32 out_len, kal_int32 *sca_out_len);

+

+void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr);

+/* mbtk sms end */

+

+

+// 短信解码

+struct SMS_Struct PDUDecoding(const char *data);

+

+// 短信编码, 自动确定编码方案

+struct PDUS *PDUEncoding(char *SCA, char *DA, char *UDC, struct UDHS *udhs);

+

+// 短信编码真正的工作

+/// 发送方PDU格式(SMS-SUBMIT-PDU)

+/// SCA(Service Center Adress):短信中心,长度1-12

+/// PDU-Type(Protocol Data Unit Type):协议数据单元类型,长度1

+/// MR(Message Reference):消息参考值,为0~255。长度1

+/// DA(Destination Adress):接收方SME的地址,长度2-12

+/// PID(Protocol Identifier):协议标识,长度1

+/// DCS(Data Coding Scheme):编码方案,长度1

+/// VP(Validity Period):有效期,长度为1(相对)或者7(绝对或增强)

+/// UDL(User Data Length):用户数据段长度,长度1

+/// UD(User Data):用户数据,长度0-140

+

+struct PDUS *PDUDoEncoding(char *SCA, char *DA, char *UDC, struct UDHS *udhs, enum EnumDCS DCS);

+

+

+// 服务中心地址解码

+char *SCADecoding(const char *data, int *EndIndex);

+

+// 原始地址解码

+char *OADecoding(const char *data, int index, int *EndIndex);

+

+// 服务中心时间戳解码

+char *SCTSDecoding(const char *data, int index);

+

+// BCD 解码

+int BCDDecoding(const char *data, int index, bool isMSB);

+

+// 用户数据头解码

+struct UDHS *UDHDecoding(const char *data, int index);

+

+// 用户数据解码

+char *UserDataDecoding(const char *data, int index, bool UDHI, enum EnumDCS dcs);

+

+// 7-Bit编码解压缩

+char *BIT7Unpack(const char *data, int index, int Septets, int FillBits);

+

+// 转换GSM字符编码到Unicode编码

+char *BIT7Decoding(char *BIT7Data, unsigned int size);

+

+// 7-Bit序列和Unicode编码是否相同

+int isBIT7Same(u_int16_t UCS2);

+

+// 判断是否是GSM字符串

+int isGSMString(char *Data);

+

+// 用户数据拆分

+struct UDS *UDCSplit(char *UDC, struct UDHS *uhds, enum EnumDCS DCS);

+

+// 获得用户数据头长度

+int getUDHL(struct UDHS *udhs);

+

+// 计算需要的7-Bit编码字节数

+int SeptetsLength(char *source);

+

+// 将7-Bit编码字节数换算成UCS2编码字符数

+int SeptetsToChars(char *source, int index, int septets);

+

+// 在用户数据头中增加长短信信息元素

+struct UDHS *UpdateUDH(struct UDHS *udhs, int CSMMR, int total, int index);

+

+//单条短信编码

+char *SoloPDUEncoding(char *SCA, char *DA, char *UC, struct UDHS *udhs, enum EnumDCS DCS);

+

+// SCA编码

+char *SCAEncoding(char *SCA);

+

+// PDUTYPE 编码

+char *PDUTypeEncoding(bool UDH);

+

+// MR,消息参考值

+char *MREncoding();

+

+//接收方SME地址

+char *DAEncoding(char *DA);

+

+// 协议标识

+char *PIDEncoding();

+

+// 编码方案

+char *DCSEncoding(char *UD, enum EnumDCS DCS);

+

+// 用户数据长度及内容

+char *UDEncoding(char *UD, struct UDHS *udhs, enum EnumDCS DCS);

+

+// 用户数据头编码

+char *UDHEncoding(struct UDHS *udhs, int *UDHL);

+

+// 用户数据内容编码

+char *UDCEncoding(char *UDC, int *UDCL, int UDHL, enum EnumDCS DCS);

+

+// 将UCS2编码字符串转换成7-Bit编码字节 序列

+struct ByteArray *BIT7Encoding(char *UDC, int *Septets);

+

+//  7-Bit编码压缩

+char *BIT7Pack(struct ByteArray *Bit7Array, int UDHL);

+

+void sms_init();

+

+#endif //SMS_SMS_H

diff --git a/mbtk/include/mbtk/mbtk_power.h b/mbtk/include/mbtk/mbtk_power.h
new file mode 100755
index 0000000..70175f8
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_power.h
@@ -0,0 +1,15 @@
+#ifndef __MBTK_POWER_H__
+#define __MBTK_POWER_H__
+
+#include "mbtk_log.h"
+
+typedef enum{
+    MBTK_POWER_RESULT_SUCCESS = 0,
+    MBTK_POWER_RESULT_GNSS_TIMEOUT,
+    MBTK_POWER_RESULT_GNSS_CLOSE_FAIL,
+    MBTK_POWER_RESULT_NO_SLEEP_NODE,
+    MBTK_POWER_RESULT_UKNOWN_ERROR
+}mbtk_power_result_type;
+
+int mbtk_system_sleep(void);
+#endif
\ No newline at end of file
diff --git a/mbtk/include/mbtk/mbtk_queue.h b/mbtk/include/mbtk/mbtk_queue.h
new file mode 100755
index 0000000..9119355
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_queue.h
@@ -0,0 +1,71 @@
+/*************************************************************
+Description:
+    mbtk_queue.h
+    Used to define mobiletek standard queue interfaces
+Author:
+    YangDagang
+Date:
+    2019-7-13
+*************************************************************/
+#ifndef __MBTK_QUEUE_H__
+#define __MBTK_QUEUE_H__
+
+#include "mbtk_type.h"
+#include <pthread.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*************************************************************
+    Constants and Macros
+*************************************************************/
+#define MBTK_QUEUE_MAX_NUM 500
+#define task_mutex pthread_mutex_t
+
+/*************************************************************
+    Definitions:enum,struct,union
+*************************************************************/
+
+typedef struct{
+    task_mutex crit_sect; //User-defined data type
+} mbtk_mutex;
+
+typedef struct node
+{
+    void *payload;
+    int count;          //only used to count for internal
+    mbtk_mutex mutex;   //only used to count for internal
+    struct node *front;
+    struct node *rear;
+} mbtk_queue_node_t;
+
+/*************************************************************
+    Variables:local,extern
+*************************************************************/
+
+/*************************************************************
+    Local Function Declaration
+*************************************************************/
+
+/*************************************************************
+    Extern Function Declaration
+*************************************************************/
+extern void mbtk_mutex_init(mbtk_mutex *mutex);
+extern void mbtk_mutex_deinit(mbtk_mutex *mutex);
+extern void mbtk_mutex_lock(mbtk_mutex *mutex);
+extern void mbtk_mutex_unlock(mbtk_mutex *mutex);
+
+extern void mbtk_queue_init(mbtk_queue_node_t *queue);
+extern int mbtk_queue_put(mbtk_queue_node_t *queue,void *payload);
+extern void* mbtk_queue_get(mbtk_queue_node_t *queue);
+extern int mbtk_queue_insert(mbtk_queue_node_t *queue,void *payload);
+extern bool mbtk_queue_empty(mbtk_queue_node_t *queue);
+extern bool mbtk_queue_is_full(mbtk_queue_node_t *queue);
+extern void mbtk_queue_deinit(mbtk_queue_node_t *queue);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif /* __MBTK_QUEUE_H__ */
diff --git a/mbtk/include/mbtk/mbtk_ril_api.h b/mbtk/include/mbtk/mbtk_ril_api.h
new file mode 100755
index 0000000..845898f
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_ril_api.h
@@ -0,0 +1,1646 @@
+/*
+*
+* Data : 2024/07/19 11:24:09
+* Author : LiuBin
+*/
+#ifndef _MBTK_INFO_API_2_H
+#define _MBTK_INFO_API_2_H
+#include <netinet/in.h>
+
+#include "mbtk_type.h"
+#include "mbtk_list.h"
+#include "mbtk_log.h"
+#include "mbtk_utils.h"
+#include "mbtk_pdu_sms.h"
+
+// LOG_DEBUG_LEVEL 7
+#define LOG LOGI
+
+#define MBTK_APN_CID_MIN 1
+#define MBTK_APN_CID_MAX 7
+#define CELL_NUM_MAX 15
+#if 1
+#define APN_STR_MAX 128
+#define APN_NAME_STR_MAX (150+1)
+#else
+#define APN_STR_MAX 64
+#define APN_NAME_STR_MAX (64+1)
+#endif
+#define RIL_PIN_STR_MAX 16
+#define RIL_DATA_CALL_RETRY_MAX 20
+#define RIL_MAX_NUMBER_LEN 40
+#define MBTK_ECALL_MSD_LEN_MAX      600
+
+typedef void mbtk_ril_handle;
+
+typedef void (*mbtk_ril_callback_func)(const void* data, int data_len);
+
+typedef enum
+{
+    ATPORTTYPE_NON = -1,
+    ATPORTTYPE_0 = 0,       // /tmp/atcmd_at
+    ATPORTTYPE_1,           // /tmp/atcmd_at_1
+    ATPORTTYPE_2,           // /tmp/atcmd_at_2
+
+    ATPORTTYPE_NUM,
+
+    MBTK_AT_PORT_DEF = ATPORTTYPE_0,        // Generic Port
+    MBTK_AT_PORT_VOICE = ATPORTTYPE_1,      // Voice Call Port
+    MBTK_AT_PORT_DATA = ATPORTTYPE_2       // Data Call Port
+} ATPortType_enum;
+
+typedef enum {
+    MBTK_RIL_CID_NUL = 0,   // Auto set cid.
+    MBTK_RIL_CID_DEF = MBTK_APN_CID_MIN,
+    MBTK_RIL_CID_1 = MBTK_RIL_CID_DEF,
+    MBTK_RIL_CID_2,
+    MBTK_RIL_CID_3,
+    MBTK_RIL_CID_4,
+    MBTK_RIL_CID_5,
+    MBTK_RIL_CID_6,
+    MBTK_RIL_CID_7 = MBTK_APN_CID_MAX
+} mbtk_ril_cid_enum;
+
+typedef enum {
+    MBTK_RIL_ERR_SUCCESS = 0,
+    MBTK_RIL_ERR_INITED,
+    MBTK_RIL_ERR_NOT_INIT,
+    MBTK_RIL_ERR_PORT,          // AT port error.
+    MBTK_RIL_ERR_PORT_NOT_CLOSE, // Has at port not close.
+    MBTK_RIL_ERR_PARAMETER,     // Parameter error.
+    MBTK_RIL_ERR_FORMAT,       // Packet format error.
+    MBTK_RIL_ERR_SEND_PACK,    // Packet send fail.
+    MBTK_RIL_ERR_REQ_UNKNOWN,  // Unknown request.
+    MBTK_RIL_ERR_REQ_PARAMETER,  // Request parameter error.
+    MBTK_RIL_ERR_UNSUPPORTED,  // Unsupported operation.
+    MBTK_RIL_ERR_MEMORY,       // Insufficient memory.
+    MBTK_RIL_ERR_IND_FULL,     // Register IND fail(FULL).
+    MBTK_RIL_ERR_IND_UNKNOWN,  // Register IND fail(Unknown IND).
+    MBTK_RIL_ERR_CID,  // CID error.
+    MBTK_RIL_ERR_NET_CONF,
+    MBTK_RIL_ERR_TIMEOUT,  // Timeout.
+    MBTK_RIL_ERR_TIME_FORMAT,  // Time format error.
+    MBTK_RIL_ERR_DATA_CONNECTED,  // Data call is connected.
+    MBTK_RIL_ERR_DATA_DISCONNECTED, // Data call is disconnected.
+
+    MBTK_RIL_ERR_UNKNOWN = 400,  // Unknown error.
+    // CME error start index.
+    MBTK_RIL_ERR_CME = 500,
+    MBTK_RIL_ERR_CME_NON = 1000
+} mbtk_ril_err_enum;
+
+typedef enum {
+    MBTK_IP_TYPE_IP,
+    MBTK_IP_TYPE_IPV6,
+    MBTK_IP_TYPE_IPV4V6,
+    MBTK_IP_TYPE_PPP
+} mbtk_ip_type_enum;
+
+typedef enum {
+    MBTK_TEMP_TYPE_SOC,
+    MBTK_TEMP_TYPE_RF
+} mbtk_temp_type_enum;
+
+typedef enum {
+    MBTK_TIME_TYPE_CELL = 0,  //NITZ
+    MBTK_TIME_TYPE_NTP,
+    MBTK_TIME_TYPE_GNSS,
+    MBTK_TIME_TYPE_USER
+} mbtk_time_type_enum;
+
+typedef enum {
+    MBTK_CLCC = 1,
+    MBTK_CPAS,
+    MBTK_DISCONNECTED,
+} mbtk_call_enum;
+
+
+/*
+0: GSM
+1: GSM Compact
+2: UTRAN
+3: GSM w/EGPRS
+4: UTRAN w/HSDPA
+5: UTRAN w/HSUPA
+6: UTRAN w/HSDPA and HSUPA
+7: E-UTRAN
+8: UTRAN HSPA+
+*/
+typedef enum {
+    MBTK_RADIO_TECH_GSM = 0,
+    MBTK_RADIO_TECH_GSM_COMPACT,
+    MBTK_RADIO_TECH_UTRAN,
+    MBTK_RADIO_TECH_GSM_EGPRS,
+    MBTK_RADIO_TECH_UTRAN_HSDPA,
+    MBTK_RADIO_TECH_UTRAN_HSUPA,
+    MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
+    MBTK_RADIO_TECH_E_UTRAN,      // LTE
+    MBTK_RADIO_TECH_UTRAN_HSPA,   // EC-GSM-IoT
+
+    MBTK_RADIO_TECH_EUTRAN_PLUS,  // NB-IoT(NB-S1 mode)
+    MBTK_RADIO_TECH_EUTRAN_TO_5GCN, // E-UTRAN connected to a 5GCN (NSA)
+    MBTK_RADIO_TECH_NR_TO_5GCN,  // NR connected to a 5GCN (SA)
+    MBTK_RADIO_TECH_NGRAN,       // NG-RAN (NSA+SA)
+    MBTK_RADIO_TECH_EUTRAN_NR_DUAL_LINK, // dual connectivity of E-UTRA with NR and is connected to an EPS core.
+
+    MBTK_RADIO_TECH_UNKNOWN = 0xFF
+} mbtk_radio_technology_enum;
+
+typedef enum {
+    MBTK_RADIO_STATE_UNKNOWN = -1,
+    MBTK_RADIO_STATE_MINI_FUNC = 0,
+    MBTK_RADIO_STATE_FULL_FUNC,
+    MBTK_RADIO_STATE_DIS_RECV_RF = 3,
+    MBTK_RADIO_STATE_DIS_RF,
+    MBTK_RADIO_STATE_DIS_SIM,
+    MBTK_RADIO_STATE_SEC_RX_OFF
+} mbtk_radio_state_enum;
+
+typedef enum {
+    MBTK_SIM_STATE_UNKNOWN = -1,
+    MBTK_SIM_STATE_ABSENT = 0,
+    MBTK_SIM_STATE_NOT_READY,
+    MBTK_SIM_STATE_READY,
+    MBTK_SIM_STATE_SIM_PIN,
+    MBTK_SIM_STATE_SIM_PUK,
+    MBTK_SIM_STATE_PH_SIMLOCK_PIN,
+    MBTK_SIM_STATE_PH_SIMLOCK_PUK,
+    MBTK_SIM_STATE_PH_FSIM_PIN,
+    MBTK_SIM_STATE_PH_FSIM_PUK,
+    MBTK_SIM_STATE_SIM_PIN2,
+    MBTK_SIM_STATE_SIM_PUK2,
+    MBTK_SIM_STATE_PH_NET_PIN,
+    MBTK_SIM_STATE_PH_NET_PUK,
+    MBTK_SIM_STATE_PH_NETSUB_PIN,
+    MBTK_SIM_STATE_PH_NETSUB_PUK,
+    MBTK_SIM_STATE_PH_SP_PIN,
+    MBTK_SIM_STATE_PH_SP_PUK,
+    MBTK_SIM_STATE_PH_CORP_PIN,
+    MBTK_SIM_STATE_PH_CORP_PUK
+} mbtk_sim_state_enum;
+
+
+typedef enum
+{
+    MBTK_NET_TYPE_UNKNOWN,
+    MBTK_NET_TYPE_GSM,
+    MBTK_NET_TYPE_UMTS,
+    MBTK_NET_TYPE_LTE
+} mbtk_net_type_enum;
+
+typedef enum
+{
+    MBTK_DEV_MODEM_MIN_FUN,                                   //Modem 最小功能
+    MBTK_DEV_MODEM_FULL_FUN,                                  //Modem 全功能
+    MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3,           //Modem 禁用射频接收电路
+    MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS,  //Modem禁用射频发射和接收电路
+    MBTK_DEV_MODEM_DISABLE_SIM,                               //Modem 禁用(U)SIM 卡
+    MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE,           //Modem 完全禁用辅助接收
+} MBTK_DEV_MODEM_FUNCTION;
+
+
+typedef enum {
+    MBTK_ECALL_CFG_ITEM_T3 = 0,         // ms
+    MBTK_ECALL_CFG_ITEM_T5,             // ms
+    MBTK_ECALL_CFG_ITEM_T6,             // ms
+    MBTK_ECALL_CFG_ITEM_T7,             // ms
+    MBTK_ECALL_CFG_ITEM_TH,             // ms
+    MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK,     // T9       // 5
+    MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN,     // T2
+    MBTK_ECALL_CFG_ITEM_TIMER_DEREG,    // T10
+    MBTK_ECALL_CFG_ITEM_TIMER_DIAL,     // "dial"
+    MBTK_ECALL_CFG_ITEM_TIMER_REDIAL,   // "redialtmr"
+    MBTK_ECALL_CFG_ITEM_TIMER_SMS,      // "sms"        // 10
+    MBTK_ECALL_CFG_ITEM_REDIALCNT,      // "redialcnt"
+    MBTK_ECALL_CFG_ITEM_SMSPROCESS,     // "smsprocess"
+    MBTK_ECALL_CFG_ITEM_SMSMSDCNT,       // "smsmsdcnt"
+
+    MBTK_ECALL_CFG_ITEM_MAX
+} mbtk_ecall_cfg_item_enum;
+
+#define MBTK_ECALL_CFG_T3   (1 << MBTK_ECALL_CFG_ITEM_T3)       // ms
+#define MBTK_ECALL_CFG_T5   (1 << MBTK_ECALL_CFG_ITEM_T5)       // ms
+#define MBTK_ECALL_CFG_T6   (1 << MBTK_ECALL_CFG_ITEM_T6)       // ms
+#define MBTK_ECALL_CFG_T7   (1 << MBTK_ECALL_CFG_ITEM_T7)       // ms
+#define MBTK_ECALL_CFG_TH   (1 << MBTK_ECALL_CFG_ITEM_TH)       // ms
+#define MBTK_ECALL_CFG_TIMER_CALLBACK   (1 << MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK)   // T9
+#define MBTK_ECALL_CFG_TIMER_CLEARDOWN  (1 << MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN)  // T2
+#define MBTK_ECALL_CFG_TIMER_DEREG  (1 << MBTK_ECALL_CFG_ITEM_TIMER_DEREG)      // T10
+#define MBTK_ECALL_CFG_TIMER_DIAL   (1 << MBTK_ECALL_CFG_ITEM_TIMER_DIAL)     // "dial"
+#define MBTK_ECALL_CFG_TIMER_REDIAL (1 << MBTK_ECALL_CFG_ITEM_TIMER_REDIAL)  // "redialtmr"
+#define MBTK_ECALL_CFG_TIMER_SMS    (1 << MBTK_ECALL_CFG_ITEM_TIMER_SMS)  // "sms"        // 10
+#define MBTK_ECALL_CFG_REDIALCNT    (1 << MBTK_ECALL_CFG_ITEM_REDIALCNT)  // "redialcnt"
+#define MBTK_ECALL_CFG_SMSPROCESS   (1 << MBTK_ECALL_CFG_ITEM_SMSPROCESS)  // "smsprocess"
+#define MBTK_ECALL_CFG_SMSMSDCNT    (1 << MBTK_ECALL_CFG_ITEM_SMSMSDCNT)  // "smsmsdcnt"
+
+
+/*
+    0 : GSM only
+    1 : UMTS only
+    2 : GSM/UMTS(auto)
+    3 : GSM/UMTS(GSM preferred)
+    4 : GSM/UMTS(UMTS preferred)
+    5 : LTE only
+    6 : GSM/LTE(auto)
+    7 : GSM/LTE(GSM preferred)
+    8 : GSM/LTE(LTE preferred)
+    9 : UMTS/LTE(auto)
+    10 : UMTS/LTE(UMTS preferred)
+    11 : UMTS/LTE(LTE preferred)
+    12 : GSM/UMTS/LTE(auto)
+    13 : GSM/UMTS/LTE(GSM preferred)
+    14 : GSM/UMTS/LTE(UMTS preferred)
+    15 : GSM/UMTS/LTE(LTE preferred)
+    16 : 5GS network
+    17 : Dual mode(4G/5G, auto)
+    18 : Dual mode(4G/5G, LTE preferred)
+    19 : Dual mode(4G/5G, 5GS preferred)
+    20 : Triple mode(3G/4G/5G, auto)
+    21 : Triple mode(3G/4G/5G, UMTS preferred)
+    22 : Triple mode(3G/4G/5G, LTE preferred)
+    23 : Triple mode(3G/4G/5G, 5GS preferred)
+    24 : Quadruple mode (2G/3G/4G/5G, auto)
+    25 : Quadruple mode (2G/3G/4G/5G, GSM preferred)
+    26 : Quadruple mode (2G/3G/4G/5G, UMTS preferred)
+    27 : Quadruple mode (2G/3G/4G/5G, LTE preferred)
+    28 : Quadruple mode (2G/3G/4G/5G, 5GS preferred)
+*/
+typedef enum
+{
+    MBTK_NET_PREF_UNUSE = -1,
+    MBTK_NET_PREF_GSM_ONLY = 0,             // 0 : GSM Only
+    MBTK_NET_PREF_UMTS_ONLY,                // 1 : UMTS Only
+    MBTK_NET_PREF_GSM_UMTS_AUTO,
+    MBTK_NET_PREF_GSM_UMTS_GSM_PREF,
+    MBTK_NET_PREF_GSM_UMTS_UMTS_PREF,
+    MBTK_NET_PREF_LTE_ONLY,                 // 5 : LTE Only
+    MBTK_NET_PREF_GSM_LTE_AUTO,
+    MBTK_NET_PREF_GSM_LTE_GSM_PREF,
+    MBTK_NET_PREF_GSM_LTE_LTE_PREF,
+    MBTK_NET_PREF_UMTS_LTE_AUTO,
+    MBTK_NET_PREF_UMTS_LTE_UMTS_PREF,
+    MBTK_NET_PREF_UMTS_LTE_LTE_PREF,
+    MBTK_NET_PREF_GSM_UMTS_LTE_AUTO,
+    MBTK_NET_PREF_GSM_UMTS_LTE_GSM_PREF,
+    MBTK_NET_PREF_GSM_UMTS_LTE_UMTS_PREF,
+    MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF,    // 15
+    MBTK_NET_PREF_NR_ONLY,                  // 16 : NR Only
+    MBTK_NET_PREF_LTE_NR_AUTO,
+    MBTK_NET_PREF_LTE_NR_LTE_PREF,
+    MBTK_NET_PREF_LTE_NR_NR_PREF,
+    MBTK_NET_PREF_UMTS_LTE_NR_AUTO,         // 20
+    MBTK_NET_PREF_UMTS_LTE_NR_UMTS_PREF,
+    MBTK_NET_PREF_UMTS_LTE_NR_LTE_PREF,
+    MBTK_NET_PREF_UMTS_LTE_NR_NR_PREF,
+    MBTK_NET_PREF_GSM_UMTS_LTE_NR_AUTO,
+    MBTK_NET_PREF_GSM_UMTS_LTE_NR_GSM_PREF, // 25
+    MBTK_NET_PREF_GSM_UMTS_LTE_NR_UMTS_PREF,
+    MBTK_NET_PREF_GSM_UMTS_LTE_NR_LTE_PREF,
+    MBTK_NET_PREF_GSM_UMTS_LTE_NR_NR_PREF,
+    // Last item.
+    MBTK_NET_PREF_MAX
+} mbtk_net_pref_enum;
+
+typedef struct
+{
+    /*
+    0: automatic
+    1: manual
+    */
+    uint8 net_sel_mode;
+    /*
+    0: GSM
+    1: GSM Compact
+    2: UTRAN
+    3: GSM w/EGPRS
+    4: UTRAN w/HSDPA
+    5: UTRAN w/HSUPA
+    6: UTRAN w/HSDPA and HSUPA
+    7: E-UTRAN
+    8: UTRAN HSPA+
+    0xFF: Unused
+    */
+    uint8 net_type;
+    //uint8 plmn[10]; // 46000
+    /*
+    0: unknown
+    1: available
+    2: current
+    3: forbidden
+    */
+    uint8 net_state;
+    uint32 plmn;
+} __attribute__((packed)) mbtk_net_info_t;
+
+typedef struct {
+    int num;
+    mbtk_net_info_t net_info[20];
+} mbtk_net_info_array_t;
+
+typedef struct
+{
+    mbtk_net_pref_enum net_pref;     // mbtk_net_pref_enum
+    uint32 gsm_band;    // mbtk_gsm_band_enum
+    uint32 umts_band;   // mbtk_umts_band_enum
+    uint32 tdlte_band;  // mbtk_tdlte_band_enum
+    uint32 fddlte_band; // mbtk_fddlte_band_enum
+    uint32 lte_ext_band; // mbtk_lte_ext_band_enum
+    uint32 nr_3_band;
+    uint32 nr_2_band;
+    uint32 nr_1_band;
+    uint32 nr_0_band;
+} __attribute__((packed)) mbtk_band_info_t;
+
+typedef enum
+{
+    MBTK_CELL_TYPE_GSM = 0,
+    MBTK_CELL_TYPE_UMTS,
+    MBTK_CELL_TYPE_LTE,
+    MBTK_CELL_TYPE_NR
+} mbtk_cell_type_enum;
+
+typedef struct {
+    bool valid;
+    uint32 IPAddr;
+    uint32 PrimaryDNS;
+    uint32 SecondaryDNS;
+    uint32 GateWay;
+    uint32 NetMask;
+} __attribute__((packed)) mbtk_ipv4_info_t;
+
+typedef struct {
+    bool valid;
+    uint32 IPV6Addr[4];
+    uint32 PrimaryDNS[4];
+    uint32 SecondaryDNS[4];
+    uint32 GateWay[4];
+    uint32 NetMask[4];
+} __attribute__((packed)) mbtk_ipv6_info_t;
+
+typedef struct {
+    mbtk_ipv4_info_t ipv4;
+    mbtk_ipv6_info_t ipv6;
+} __attribute__((packed)) mbtk_ip_info_t;
+
+typedef struct
+{
+    mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
+    uint8 rssi; // 0: 113 dBm or less
+                // 1: 111 dBm
+                // 2��30: 109��53 dBm
+                // 31: 51 dBm or greater
+                // 99: not known or not detectable
+    uint8 rxlev;// 0:rssi < -110 dBm
+                // 1: -110 dBm �� rssi < -109 dBm
+                // 2: -109 dBm �� rssi < -108 dBm
+                // ......
+                // 61: -50 dBm �� rssi < -49 dBm
+                // 62: -49 dBm �� rssi < -48 dBm
+                // 63: -48 dBm �� rssi
+                // 99: not known or not detectable
+    uint8 ber;  // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
+                // 99 not known or not detectable
+    uint8 rscp; // 0: rscp < -120 dBm
+                // 1: -120 dBm �� rscp < -119 dBm
+                // 2: -119 dBm �� rscp < -118 dBm
+                // ......
+                // 94: -27 dBm �� rscp < -26 dBm
+                // 95: -26 dBm �� rscp < -25 dBm
+                // 96: - 25 dBm �� rscp
+                // 255: not known or not detectable
+    uint8 ecno; // 0: Ec/Io < -24 dB
+                // 1: -24 dB �� Ec/Io < -23.5 dB
+                // 2: -23.5 dB �� Ec/Io < -23 dB
+                // ......
+                // 47: -1 dB �� Ec/Io < -0.5 dB
+                // 48: -0.5 dB �� Ec/Io < 0 dB
+                // 49: 0 dB �� Ec/Io
+                // 255: not known or not detectable
+    uint8 rsrq; // 0: rsrq < -19.5 dB
+                // 1: -19.5 dB �� rsrq < -19 dB
+                // 2: -19 dB �� rsrq < -18.5 dB
+                // ......
+                // 32: -4 dB �� rsrq < -3.5 dB
+                // 33: -3.5 dB �� rsrq < -3 dB
+                // 34: -3 dB �� rsrq
+                // 255: not known or not detectable
+    uint8 rsrp; // 0: rsrp < -140 dBm
+                // 1: -140 dBm �� rsrp < -139 dBm
+                // 2: -139 dBm �� rsrp < -138 dBm
+                // ......
+                // 95: -46 dBm �� rsrp < -45 dBm
+                // 96: -45 dBm �� rsrp < -44 dBm
+                // 97: -44 dBm �� rsrp
+                // 255: not known or not detectable
+    uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
+                   // 1: -43 dB <= ss_rsrq < -42.5 dB
+                   // 2: -42.5 dB <= ss_rsrq < -42 dB
+                   // ......
+                   // 125: 19 dB <= ss_rsrq < 19.5 dB
+                   // 126: 19.5 dB <= ss_rsrq < 20 dB
+                   // 255: not known or not detectable
+    uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
+                   // 1: -156 dBm <= ss_rsrp < -155 dBm
+                   // 2: -155 dBm <= ss_rsrp < -154 dBm
+                   // ......
+                   // 125: -32 dBm <= ss_rsrp < -31 dBm
+                   // 126: -31 dBm <= ss_rsrp
+                   // 255: not known or not detectable
+    uint8 ss_sinr; // 0: ss_sinr < -23 dB
+                   // 1: -23 dB  ss_sinr < -22.5 dB
+                   // 2: -22.5 dB  ss_sinr < -22 dB
+                   // ......
+                   // 125: 39 dB  ss_sinr < 39.5 dBm
+                   // 126: 39.5 dB  ss_sinr < 40 dB
+                   // 127: 40 dB  ss_sinr
+                   // 255: not known or not detectable
+} __attribute__((packed)) mbtk_signal_info_t;
+
+
+typedef enum {
+    MBTK_DATA_CALL_STOP = 0,    // Stop data call.
+    MBTK_DATA_CALL_START,       // Start data call.
+    MBTK_DATA_CALL_STATE        // Get data call state
+} mbtk_data_call_type_enum;
+
+/*
+0: not registered, MT is not currently searching a new operator to register to
+1: registered, home network
+2: not registered, but MT is currently searching a new operator to register to
+3: registration denied
+4: unknown
+5: registered, roaming
+6: registered, home network, SMS-only (applicable only when AcT is E-UTRAN)
+7: registered, roaming, SMS-only (applicable only when AcT is E-UTRAN)
+8: attached for emergency bearer services only (not applicable)
+9: registered for ��CSFB not preferred��,home network(applicable only when AcT is E-UTRAN)
+10: registered for ��CSFB not preferred��,roaming(applicable only when AcT is E-UTRAN)
+11: only emergency services are available
+*/
+typedef enum
+{
+    MBTK_NET_REG_STATE_NON = 0,
+    MBTK_NET_REG_STATE_HOME,
+    MBTK_NET_REG_STATE_SEARCHING,
+    MBTK_NET_REG_STATE_DENIED,
+    MBTK_NET_REG_STATE_UNKNOWN,
+    MBTK_NET_REG_STATE_ROAMING,
+    MBTK_NET_REG_STATE_SMS_ONLY,
+    MBTK_NET_REG_STATE_ROAMING_SMS,
+    MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
+    MBTK_NET_REG_STATE_CSFB_HOME,
+    MBTK_NET_REG_STATE_CSFB_ROAMING,
+    MBTK_NET_REG_STATE_EMERGENCY_ONLY
+} mbtk_net_reg_state_enum;
+
+typedef struct
+{
+    mbtk_net_reg_state_enum call_state : 8;// mbtk_net_reg_state_enum
+    mbtk_net_reg_state_enum data_state : 8;// mbtk_net_reg_state_enum
+    mbtk_net_reg_state_enum ims_state : 8;// mbtk_net_reg_state_enum
+    mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
+    uint32 lac;
+    uint64 ci;
+} __attribute__((packed)) mbtk_net_reg_info_t;
+
+typedef enum {
+	MBTK_APN_AUTH_PROTO_DEFAULT = 0,
+	MBTK_APN_AUTH_PROTO_NONE,
+	MBTK_APN_AUTH_PROTO_PAP,
+	MBTK_APN_AUTH_PROTO_CHAP,
+#if 0
+	MBTK_APN_AUTH_PROTO_PAP_CHAP,
+    //NOT SUPPORT
+#endif
+} mbtk_apn_auth_type_enum;
+
+typedef struct {
+    mbtk_ril_cid_enum cid : 8; // 1 - 7
+    mbtk_ip_type_enum ip_type : 8; // mbtk_ip_type_enum
+    mbtk_apn_auth_type_enum auth : 8;
+    uint8 auto_save;
+    uint8 auto_boot_call;
+    uint8 redial_enable;    // Support redialing or not.
+    uint8 def_route;
+    uint8 as_dns;
+    uint8 apn[APN_NAME_STR_MAX];
+    uint8 user[APN_STR_MAX];
+    uint8 pass[APN_STR_MAX];
+    uint8 type[APN_NAME_STR_MAX];
+} mbtk_apn_info_t;
+
+#if 0
+typedef struct {
+    mbtk_ril_cid_enum cid : 8; // 1 - 7
+    mbtk_ip_type_enum ip_type : 8; // mbtk_ip_type_enum
+    mbtk_apn_auth_type_enum auth : 8;
+    uint8 auto_save;
+    uint8 auto_boot_call;
+    uint8 apn[APN_STR_MAX];
+} mbtk_apn_get_info_t;
+#endif
+
+typedef struct {
+    mbtk_ril_cid_enum cid_for_def_route;
+    mbtk_ril_cid_enum cid_for_def_dns;
+
+    int num;
+    mbtk_apn_info_t apns[MBTK_APN_CID_MAX];
+} mbtk_apn_info_array_t;
+
+typedef enum {
+    MBTK_SIM = 0,
+    MBTK_USIM = 1,
+    MBTK_TEST_SIM = 2,
+    MBTK_TEST_USIM = 3,
+    MBTK_UNKNOWN = 4,
+} mbtk_sim_card_type_enum;
+
+typedef struct
+{
+    uint8 p1_retry;
+    uint8 p2_retry;
+    uint8 puk1_retry;
+    uint8 puk2_retry;
+} mbtk_pin_puk_last_times_t;
+
+typedef enum {
+    MBTK_SIM_LOCK_TYPE_DISABLE = 0,     // Disable sim lock: [PIN]
+    MBTK_SIM_LOCK_TYPE_ENABLE,      // Enable sim lock: [PIN]
+    // MBTK_SIM_LOCK_TYPE_QUERY,       // Query sim lock state.
+    MBTK_SIM_LOCK_TYPE_CHANGE = 3,      // Change pin : [old PIN][new PIN]
+    MBTK_SIM_LOCK_TYPE_VERIFY_PIN,  // Verify pin : [PIN]
+    MBTK_SIM_LOCK_TYPE_VERIFY_PUK   // Verify puk : [PUK][new PIN]
+} mbtk_sim_lock_type_enum;
+
+typedef struct {
+    mbtk_sim_lock_type_enum type : 8;
+    uint8 pin1[RIL_PIN_STR_MAX];
+    uint8 pin2[RIL_PIN_STR_MAX];
+    uint8 puk[RIL_PIN_STR_MAX];
+} mbtk_sim_lock_info_t;
+
+typedef struct
+{
+    uint8 format;
+    char name[16];
+}MBTK_SIM_PLMN_INFO_C;  //string type
+
+typedef struct
+{
+    uint8 count;
+    MBTK_SIM_PLMN_INFO_C plmn[24];
+} mbtk_plmn_info;
+
+typedef struct
+{
+    // NR server cell:
+    // NR cell:
+    // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
+    // LTE cell: phyCellId,euArfcn,rsrp,rsrq
+    // WCDMA server cell: lac, ci, arfcn
+    // WCDMA cell: lac, ci, arfcn
+    // GSM server cell: lac, ci, arfcn, bsic
+    // GSM cell:
+    mbtk_cell_type_enum type:8;
+    uint32 value1;
+    uint32 value2;
+    uint32 value3;
+    uint32 value4;
+    uint32 value5;
+    uint32 value6;
+    uint32 value7;
+    uint32 value8;
+    uint32 value9;
+    uint32 value10;
+    uint32 value11;
+    uint32 value12;
+    uint32 value13;
+    uint32 value14;
+    uint32 value15;
+    uint64 value64_1;
+    uint64 value64_2;
+    uint64 value64_3;
+    uint64 value64_4;
+    uint64 value64_5;
+} __attribute__((packed)) mbtk_cell_info_t;
+
+typedef struct {
+    mbtk_cell_type_enum type;
+    int num;
+    mbtk_cell_info_t cell[CELL_NUM_MAX];
+} mbtk_cell_info_array_t;
+
+typedef enum {
+    MBTK_DATA_CALL_ITEM_STATE_DISABLE = 0,
+    MBTK_DATA_CALL_ITEM_STATE_ENABLE,
+    MBTK_DATA_CALL_ITEM_STATE_NON
+} mbtk_data_call_item_state_enum;
+
+typedef struct {
+    mbtk_data_call_type_enum type : 8;
+    mbtk_ril_cid_enum cid : 8;  // 1 - 7
+
+    mbtk_data_call_item_state_enum auto_boot_call : 8;       // Will reset proc if necessary.
+
+    mbtk_data_call_item_state_enum def_route : 8;            // Will reset proc if necessary.
+
+    mbtk_data_call_item_state_enum as_dns : 8;               // Will reset proc if necessary.
+
+    uint16 retry_interval[RIL_DATA_CALL_RETRY_MAX];      // second
+    uint16 timeout;             // second
+} mbtk_data_call_info_t;
+
+typedef struct
+{
+    uint8 call_wait;
+    uint8 dir1;
+    uint8 dir;
+    uint8 state;
+    uint8 mode;
+    uint8 mpty;
+    char phone_number[100];
+    uint8 type;
+    uint8 pas;
+    uint8 disconnected_id;
+    uint8 end_reason[128];
+} __attribute__((packed)) mbtk_call_info_t;
+
+typedef struct
+{
+    char character;
+    uint32 duration;
+} __attribute__((packed)) mbtk_call_dtmf_info_t;
+
+typedef struct
+{
+    bool running;
+
+    mbtk_cell_info_array_t cell_list;
+} mbtk_cell_pack_info_t;
+
+typedef struct
+{
+    uint16 cid;
+    uint16 action;
+    uint16 reason;
+    uint16 auto_change;
+
+    uint16 ip_info_valid;
+    mbtk_ip_info_t ip_info;
+} mbtk_ril_pdp_state_info_t;
+
+typedef enum {
+    MBTK_NET_REG_TYPE_CALL,             // +CREG
+    MBTK_NET_REG_TYPE_DATA_GSM_WCDMA,   // +CGREG
+    MBTK_NET_REG_TYPE_DATA_LTE,         // +CEREG
+    MBTK_NET_REG_TYPE_DATA_NR,          // +C5GREG
+    MBTK_NET_REG_TYPE_IMS
+} mbtk_net_reg_type_enum;
+
+typedef enum {
+    MBTK_RIL_SER_STATE_READY,
+    MBTK_RIL_SER_STATE_EXIT         // ril server has exit,should reset ril API.
+} mbtk_ril_ser_state_enum;
+
+typedef struct
+{
+    mbtk_net_reg_type_enum type : 8;
+    mbtk_radio_technology_enum tech : 8;
+    mbtk_net_reg_state_enum reg_state : 8;
+    uint64 tac;
+    uint64 ci;
+} mbtk_ril_net_reg_state_info_t;
+
+typedef struct
+{
+    mbtk_sim_card_type_enum sim_type : 8;
+    mbtk_sim_state_enum sim_state : 8;
+} mbtk_ril_sim_state_info_t;
+
+typedef struct
+{
+    mbtk_radio_state_enum radio_state : 8;
+} mbtk_ril_radio_state_info_t;
+
+typedef struct
+{
+    mbtk_signal_info_t signal_state;
+} mbtk_ril_signal_state_info_t;
+
+typedef struct
+{
+    uint8 urc_id;
+    uint8 urc_data[5];
+} mbtk_ril_ecall_state_info_t;
+
+typedef struct
+{
+    uint16 pdu_len;
+    uint8 pdu[1024];
+} mbtk_ril_sms_state_info_t;
+
+typedef enum
+{
+    MBTK_RIL_CALL_DIR_MO = 0,
+    MBTK_RIL_CALL_DIR_MT
+} mbtk_ril_call_dir_enum;
+
+typedef enum
+{
+    MBTK_RIL_CALL_STATE_ACTIVE = 0,
+    MBTK_RIL_CALL_STATE_HELD,
+    MBTK_RIL_CALL_STATE_DIALING,
+    MBTK_RIL_CALL_STATE_ALERTING,
+    MBTK_RIL_CALL_STATE_INCOMING,
+    MBTK_RIL_CALL_STATE_WAITING,
+    MBTK_RIL_CALL_STATE_OFFERING,
+    MBTK_RIL_CALL_STATE_DISCONNECT
+} mbtk_ril_call_state_enum;
+
+typedef enum
+{
+    MBTK_RIL_CALL_NUM_TYPE_129 = 129,
+    MBTK_RIL_CALL_NUM_TYPE_145 = 145
+} mbtk_ril_call_num_type_enum;
+
+typedef enum {
+    MBTK_ECALL_URC_ID_ALACK = 0,    // AL-ACK signal received (refer to : urc_data)
+    MBTK_ECALL_URC_ID_SYNC_LOST,    // eIM lost synchronization with PSAP
+                                    // (A resynch occurs after the synchronization is lost.)
+    MBTK_ECALL_URC_ID_NACK,         // NACK signal received
+    MBTK_ECALL_URC_ID_RESERVED_3,
+    MBTK_ECALL_URC_ID_RESERVED_4,
+    MBTK_ECALL_URC_ID_RESERVED_5,   // 5
+    MBTK_ECALL_URC_ID_3GPP_FATAL,   // eIM is terminated: fatal error (3GPP Abort function)
+    MBTK_ECALL_URC_ID_CALL_DROP,    // eIM is terminated: call drop
+    MBTK_ECALL_URC_ID_GENERIC,      // Generic error
+    MBTK_ECALL_URC_ID_MSD_REQ,      // PSAP request MSD (Only for PULL modem)
+    MBTK_ECALL_URC_ID_MSD_SEND_START,   // 10 : eIM starts sending MSD
+    MBTK_ECALL_URC_ID_INITIATION,   // The eIM starts sending the Initiation signal (Only for PUSH modem).
+                                    // It also indicates that the call setup is completed.
+    MBTK_ECALL_URC_ID_SEND_MSD,     // PUSH: SEND_MSD -> MSD_SEND_START
+                                    // PULL: SEND_MSD -> MSD_REQ -> MSD_SEND_START
+    MBTK_ECALL_URC_ID_SEND_MSD_FULL,// SEND MSD signal received too often, PSAP sync failure assumed
+    MBTK_ECALL_URC_ID_SYNCED_PSAP,  // IVS eIM is synced with PSAP
+    MBTK_ECALL_URC_ID_SYNCED_PSAP_EIM,  // 15: IVS eIM is synced with PSAP eIM
+    MBTK_ECALL_URC_ID_LLACK,        // Link layer ACK received
+    MBTK_ECALL_URC_ID_HLACK,        //  Higher Layer ACK received (similar to AL-ACK (#0) but without data)
+    MBTK_ECALL_URC_ID_EIM_RESET,    // The eIM transmitter idles after a full reset. The eIM transmitter is reset after sync loss
+                                    // (for example, because of the end of PSAP transmission).
+    MBTK_ECALL_URC_ID_EIM_IDLES,    // The eIM transmitter idles after the transmission of the Initiation signal (push mode)
+    MBTK_ECALL_URC_ID_MSD_UPDATE,   // 20 : MSD update request is received.
+    MBTK_ECALL_URC_ID_MSD_UPDATE_DONE, // MSD update is done.
+    MBTK_ECALL_URC_ID_MSD_UPDATE_ERR, // MSD update request cannot be processed.
+    MBTK_ECALL_URC_ID_T3_EXPIRED,   // T3 expired
+    MBTK_ECALL_URC_ID_T5_EXPIRED,   // T5 expired
+    MBTK_ECALL_URC_ID_T6_EXPIRED,   // 25 : T6 expired
+    MBTK_ECALL_URC_ID_T7_EXPIRED,   // T7 expired
+    MBTK_ECALL_URC_ID_TH_EXPIRED,   // TH expired
+    MBTK_ECALL_URC_ID_RESERVED_28,
+    MBTK_ECALL_URC_ID_RESERVED_29,
+    MBTK_ECALL_URC_ID_RESERVED_30,  // 30
+    MBTK_ECALL_URC_ID_IVS_EVENT_TIMEOUT,
+    MBTK_ECALL_URC_ID_PSAP_REQ,     // Only for ERA
+    MBTK_ECALL_URC_ID_MSD_SEND_FAIL_FOR_NG  // NG-eCall fail to transfer MSD
+} mbtk_ecall_urc_id_enum;
+
+
+typedef struct{
+    uint8         state; // 0 : Disable;  1 : Enable
+    uint32        oosPhase[3];   //单位为秒
+} mbtk_ril_oos_info_t;
+
+typedef struct
+{
+    uint8 call_id;
+    mbtk_ril_call_dir_enum dir : 8;
+    mbtk_ril_call_state_enum state : 8;
+    mbtk_ril_call_num_type_enum num_type : 8;
+
+    uint8 call_number[100];
+} mbtk_ril_call_state_info_t;
+
+typedef enum {
+    MBTK_ECALL_MSD_VERSION_2 = 2,
+    MBTK_ECALL_MSD_VERSION_3 = 3
+} mbtk_ecall_msd_version_enum;
+
+typedef enum {
+    MBTK_ECALL_MSD_VEHICLE_TYPE_M1 = 1,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_M2,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_M3,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_N1,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_N2,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_N3,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_L1E,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_L2E,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_L3E,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_L4E,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_L5E,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_L6E,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_L7E,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_O,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_R,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_S,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_T,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_G,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_SA,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_SB,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_SC,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_SD,
+    MBTK_ECALL_MSD_VEHICLE_TYPE_OTHER
+} mbtk_ecall_msd_vehicle_type_enum;
+
+
+typedef enum {
+    MBTK_ECALL_MSD_ITEM_VERSION = 0,
+    MBTK_ECALL_MSD_ITEM_MSG_ID,
+    MBTK_ECALL_MSD_ITEM_CONTROLTYPE,
+    MBTK_ECALL_MSD_ITEM_VIN,
+    MBTK_ECALL_MSD_ITEM_STORAGETYPE,
+    MBTK_ECALL_MSD_ITEM_TIMESTAMP,
+    MBTK_ECALL_MSD_ITEM_LOCATION,
+    MBTK_ECALL_MSD_ITEM_DIRECTION,
+    MBTK_ECALL_MSD_ITEM_LOCATIONN1,
+    MBTK_ECALL_MSD_ITEM_LOCATIONN2,
+    MBTK_ECALL_MSD_ITEM_NUMBEROFOCCUPANTS,
+    MBTK_ECALL_MSD_ITEM_ADDITIONALDATA,
+    MBTK_ECALL_MSD_ITEM_ALL_IN_ONE,
+    MBTK_ECALL_MSD_ITEM_ASI,
+    MBTK_ECALL_MSD_ITEM_VEHICLE_DIAGNOSTIC,
+    MBTK_ECALL_MSD_ITEM_CRASH_INFO,
+    MBTK_ECALL_MSD_ITEM_GNSS_TYPE
+} mbtk_ecall_msd_item_enum;
+
+typedef struct
+{
+    mbtk_ecall_msd_item_enum item_type;
+
+    uint8 data[64];
+} mbtk_ecall_msd_cfg_info_t;
+
+typedef struct
+{
+    uint8 msd[MBTK_ECALL_MSD_LEN_MAX];
+} mbtk_ecall_msd_info_t;
+
+typedef enum {
+    MBTK_ECALL_ONLY_TYPE_DISABLE = 0,
+    MBTK_ECALL_ONLY_TYPE_ENABLE_ECALL,
+    MBTK_ECALL_ONLY_TYPE_ENABLE_NG_ECALL,
+    MBTK_ECALL_ONLY_TYPE_ENABLE_ALL,
+    MBTK_ECALL_ONLY_TYPE_CONF_NUM,
+    MBTK_ECALL_ONLY_TYPE_NORMAL
+} mbtk_ecall_only_type_enum;
+
+typedef enum {
+    MBTK_ECALL_SIM_TYPE_NO_SUPPORT = 0,
+    MBTK_ECALL_SIM_TYPE_SUPPORT_ECALL,
+    MBTK_ECALL_SIM_TYPE_SUPPORT_ECALL_ONLY
+} mbtk_ecall_sim_type_enum;
+
+typedef struct {
+    mbtk_ecall_only_type_enum active : 8;
+    mbtk_ecall_sim_type_enum sim_type : 8;     // Only for GET.
+    uint8 test_num[RIL_MAX_NUMBER_LEN];
+    uint8 reconfig_num[RIL_MAX_NUMBER_LEN];
+} mbtk_ecall_only_info_t;
+
+typedef enum {
+    MBTK_ECALL_DIAL_TYPE_TEST = 0,
+    MBTK_ECALL_DIAL_TYPE_RECONFIG,
+    MBTK_ECALL_DIAL_TYPE_MANUALLY,
+    MBTK_ECALL_DIAL_TYPE_AUTO,
+    MBTK_ECALL_DIAL_TYPE_NOT_ACTIVATED,
+    MBTK_ECALL_DIAL_TYPE_RELEASE
+} mbtk_ecall_dial_type_enum;
+
+typedef enum {
+    MBTK_ECALL_MODE_TYPE_EU = 0,
+    MBTK_ECALL_MODE_TYPE_ERA
+} mbtk_ecall_mode_type_enum;
+
+typedef enum {
+    MBTK_VOICE_END_REASON_UNKNOWN = 0,
+    MBTK_VOICE_END_REASON_UNASSIGNED_NUMBER,
+    MBTK_VOICE_END_REASON_NO_ROUTE_DES = 3,
+    MBTK_VOICE_END_REASON_CHANNEL_UNACCEPTABLE = 6,
+    MBTK_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING = 8,
+    MBTK_VOICE_END_REASON_NORMAL_CALL_CLEARING = 16,
+    MBTK_VOICE_END_REASON_USER_BUSY,
+    MBTK_VOICE_END_REASON_NO_USER_RESPONDING,
+    MBTK_VOICE_END_REASON_USER_ALERTING_NO_ANSWER,
+    MBTK_VOICE_END_REASON_CALL_REJECTED = 21,
+    MBTK_VOICE_END_REASON_NUMBER_CHANGED,
+    MBTK_VOICE_END_REASON_PREEMPTION = 25,
+    MBTK_VOICE_END_REASON_NON_SELECTED_USER_CLEARING,
+    MBTK_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER,
+    MBTK_VOICE_END_REASON_INVALID_NUMBER_FORMAT,
+    MBTK_VOICE_END_REASON_FACILITY_REJECTED,
+    MBTK_VOICE_END_REASON_STATUS_ENQUIRY,
+    MBTK_VOICE_END_REASON_NORMAL_UNSPECIFIED,
+    MBTK_VOICE_END_REASON_NO_CIRCUIT_AVAILABLE = 34,
+    MBTK_VOICE_END_REASON_NETWORK_OUT_OF_ORDER = 38,
+    MBTK_VOICE_END_REASON_TEMPORARY_FAILURE =41,
+    MBTK_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION,
+    MBTK_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED,
+    MBTK_VOICE_END_REASON_REQUESTED_CIRCUIT_UNAVAILABLE,
+    MBTK_VOICE_END_REASON_RESOURCE_UNAVAILABLE = 47,
+    MBTK_VOICE_END_REASON_QOS_UNAVAILABLE = 49,
+    MBTK_VOICE_END_REASON_REQUESTED_FACILITY_NOT_SUBSCRIBED,
+    MBTK_VOICE_END_REASON_INCOMING_CALLS_BARRED_WITHIN_CUG = 55,
+    MBTK_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AUTHORIZED = 57,
+    MBTK_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AVAILABLE,
+    MBTK_VOICE_END_REASON_SERVICE_NOT_AVAILABLE = 63,
+    MBTK_VOICE_END_REASON_BEARER_SERVICE_NOT_IMPLEMENTED = 65,
+    MBTK_VOICE_END_REASON_ACM_MAX_REACHED = 68,
+    MBTK_VOICE_END_REASON_FACILITY_NOT_IMPLEMENTED,
+    MBTK_VOICE_END_REASON_ONLY_RDI_BEARER_CAPABILITY_AVAILABLE,
+    MBTK_VOICE_END_REASON_SERVICE_NOT_IMPLEMENTED = 79,
+    MBTK_VOICE_END_REASON_INVALID_TRANSACTION_ID = 81,
+    MBTK_VOICE_END_REASON_USER_NOT_MEMBER_OF_CUG = 87,
+    MBTK_VOICE_END_REASON_INCOMPATIBLE_DESTINATION = 88,
+    MBTK_VOICE_END_REASON_INVALID_TRANSIT_NETWORK_SELECTION = 91,
+    MBTK_VOICE_END_REASON_INCORRECT_MESSAGE = 95,
+    MBTK_VOICE_END_REASON_INVALID_MANDATORY_INFORMATION,
+    MBTK_VOICE_END_REASON_MESSAGE_TYPE_NON_EXISTENT,
+    MBTK_VOICE_END_REASON_MESSAGE_TYPE_WRONG_STATE,
+    MBTK_VOICE_END_REASON_INFORMATION_ELEMENT_NOT_EXISTENT,
+    MBTK_VOICE_END_REASON_CONDITIONAL_IE_ERROR,
+    MBTK_VOICE_END_REASON_MESSAGE_WRONG_STATE,
+    MBTK_VOICE_END_REASON_RECOVERY_AFTER_TIMER_EXPIRY,
+    MBTK_VOICE_END_REASON_PROTOCOL_ERROR_UNSPECIFIED = 111,
+    MBTK_VOICE_END_REASON_INERWORKING_UNSPECIFIED = 127,
+    MBTK_VOICE_END_REASON_CALL_BARRING = 224,
+    MBTK_VOICE_END_REASON_FDN_BLOCKED = 241,
+    MBTK_VOICE_END_REASON_END
+} mbtk_voice_end_reason_enum;
+
+
+typedef struct {
+    uint32 type;            // mbtk_ecall_cfg_item_enum
+
+#if 0
+    uint32 timer_t3;    // ms
+    uint32 timer_t5;    // ms
+    uint32 timer_t6;    // ms
+    uint32 timer_t7;    // ms
+    uint32 timer_th;    // ms
+
+    uint32 timer_callback; // s (T9)
+    uint32 timer_cleardown; // s (T2)
+    uint32 timer_dereg;     // s (T10)
+    uint32 timer_dial;  // s
+    uint32 timer_redialtmr; // s
+    uint32 timer_sms;   // s
+
+    uint32 redialcnt;
+    uint32 smsprocess;
+    uint32 smsmsdcnt;
+#else
+    uint8 data_valid[MBTK_ECALL_CFG_ITEM_MAX];
+    uint32 data[MBTK_ECALL_CFG_ITEM_MAX];
+#endif
+} mbtk_ecall_cfg_info_t;
+
+typedef enum {
+    MBTK_ECALL_GAIN_MODE_TX = 0,
+    MBTK_ECALL_GAIN_MODE_RX,
+    MBTK_ECALL_GAIN_MODE_SIDETONE
+} mbtk_ecall_gain_mode_enum;
+
+typedef struct {
+    mbtk_ecall_gain_mode_enum mode;
+
+    int8 gain;
+} mbtk_ecall_gain_info_t;
+
+////////////////////////////////////////////////////
+
+char* apn2str(mbtk_ip_type_enum type);
+
+int ipv6_2_str(const void *ipv6, void *ipv6_str);
+
+mbtk_ril_handle* mbtk_ril_open(ATPortType_enum port);
+
+mbtk_ril_err_enum mbtk_ril_close(ATPortType_enum port);
+
+/*
+* Get platform version.
+*/
+mbtk_ril_err_enum mbtk_version_get(mbtk_ril_handle* handle, void *version);
+
+/*
+* Get platform model.
+*/
+mbtk_ril_err_enum mbtk_model_get(mbtk_ril_handle* handle, void *model);
+
+/*
+* Get platform IMEI.
+*/
+mbtk_ril_err_enum mbtk_imei_get(mbtk_ril_handle* handle, void *imei);
+
+/*
+* Get platform SN.
+*/
+mbtk_ril_err_enum mbtk_sn_get(mbtk_ril_handle* handle, void *sn);
+
+/*
+* Get platform MEID.
+*/
+mbtk_ril_err_enum mbtk_meid_get(mbtk_ril_handle* handle, void *meid);
+
+/*
+* Return VoLTE state.
+*/
+mbtk_ril_err_enum mbtk_volte_state_get(mbtk_ril_handle* handle, int *volte_state);
+
+/*
+* Set VoLTE state.
+*
+* volte_state:
+* 0 : Close VoLTE.
+* 1 : Open VoLTE.
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_volte_state_set(mbtk_ril_handle* handle, int volte_state);
+
+/*
+* Return radio state.
+*/
+mbtk_ril_err_enum mbtk_radio_state_get(mbtk_ril_handle* handle, mbtk_radio_state_enum *radio_state);
+
+/*
+* Set radio state.
+*
+* Refor to : mbtk_radio_state_enum
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_radio_state_set(mbtk_ril_handle* handle, mbtk_radio_state_enum radio_state, bool reset_modem);
+
+/*
+* Get system temperature.
+*
+* type[IN]:
+*   0: Soc temperature.
+*   1: RF temperature.
+* temp[OUT]:
+*   temperature in celsius.
+*/
+mbtk_ril_err_enum mbtk_temp_get(mbtk_ril_handle* handle, mbtk_temp_type_enum type, int* temp);
+
+/*
+* Get time type.
+* "23/05/24,06:09:32+32" -> "23/05/24 06:09:32 +32 00"
+*/
+mbtk_ril_err_enum mbtk_cell_time_get(mbtk_ril_handle* handle, char* time_str);
+
+/*
+* Get platform IMSI.
+*/
+mbtk_ril_err_enum mbtk_imsi_get(mbtk_ril_handle* handle, void *imsi);
+
+/*
+* Get platform ICCID.
+*/
+mbtk_ril_err_enum mbtk_iccid_get(mbtk_ril_handle* handle, void *iccid);
+
+/*
+* Get current phone number.
+*/
+mbtk_ril_err_enum mbtk_phone_number_get(mbtk_ril_handle* handle, void *phone_number);
+
+/*
+* Get platform ICCID.
+*/
+mbtk_ril_err_enum mbtk_sim_lock_get(mbtk_ril_handle* handle, int *lock_state);
+
+/*
+* Get platform ICCID.
+*/
+mbtk_ril_err_enum mbtk_sim_lock_set(mbtk_ril_handle* handle, mbtk_sim_lock_info_t *lock_info);
+
+/*
+* Get platform ICCID.
+*/
+mbtk_ril_err_enum mbtk_sim_lock_retry_times_get(mbtk_ril_handle* handle, mbtk_pin_puk_last_times_t *retry_times);
+
+/*
+* Get available network.
+*/
+mbtk_ril_err_enum mbtk_available_net_get(mbtk_ril_handle* handle, mbtk_net_info_array_t *net_array);
+
+/*
+* Set network select mode. (+COPS=...)
+*/
+mbtk_ril_err_enum mbtk_net_sel_mode_set(mbtk_ril_handle* handle, const mbtk_net_info_t *net);
+
+/*
+* Get network select mode. (+COPS?)
+*/
+mbtk_ril_err_enum mbtk_net_sel_mode_get(mbtk_ril_handle* handle, mbtk_net_info_t *net);
+
+/*
+* Get platform support bands.
+*/
+mbtk_ril_err_enum mbtk_support_band_get(mbtk_ril_handle* handle, mbtk_band_info_t *band);
+
+/*
+* Get platform current bands.
+*/
+mbtk_ril_err_enum mbtk_current_band_get(mbtk_ril_handle* handle, mbtk_band_info_t *band);
+
+/*
+* Set platform current bands.
+*/
+mbtk_ril_err_enum mbtk_current_band_set(mbtk_ril_handle* handle, const mbtk_band_info_t *band);
+
+/*
+* Get current cell infomation.
+*/
+mbtk_ril_err_enum mbtk_cell_get(mbtk_ril_handle* handle, mbtk_cell_info_array_t *cell_list);
+
+/*
+* Set cell info.
+*
+* at*CELL=<mode>,<act>,< band>,<freq>,<cellId>
+* at*cell=2,3,,40936,429   //
+* at*cell=0  //
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_cell_set(mbtk_ril_handle* handle, char *info, char *response);
+
+/*
+* oos get.
+*/
+mbtk_ril_err_enum mbtk_oos_get(mbtk_ril_handle* handle, mbtk_ril_oos_info_t *oos_info);
+
+/*
+* oos set .
+*/
+mbtk_ril_err_enum mbtk_oos_set(mbtk_ril_handle* handle, const mbtk_ril_oos_info_t *oos_info);
+
+/*
+* Set wakeup state.
+*
+* wakeup_state:(0~31)
+* 0 : means resume all
+* 1~31 means suspend
+* Control the active reporting of some platform modems to reduce wakeup
+*/
+mbtk_ril_err_enum mbtk_wakeup_state_set(mbtk_ril_handle* handle, int wakeup_state);
+
+/*
+* Get current APN informations.
+*/
+mbtk_ril_err_enum mbtk_apn_get(mbtk_ril_handle* handle, mbtk_apn_info_array_t *apns);
+
+/*
+* Set current APN informations.
+*/
+mbtk_ril_err_enum mbtk_apn_set(mbtk_ril_handle* handle, mbtk_apn_info_t *apn);
+
+/*
+* Start data call.
+*/
+mbtk_ril_err_enum mbtk_data_call_start(mbtk_ril_handle* handle, mbtk_ril_cid_enum cid, mbtk_data_call_item_state_enum auto_boot_call,
+            mbtk_data_call_item_state_enum def_route, mbtk_data_call_item_state_enum as_dns, int *retry_interval, int retry_interval_num,
+            int timeout, mbtk_ip_info_t *rsp_info);
+
+/*
+* Stop data call.
+*/
+mbtk_ril_err_enum mbtk_data_call_stop(mbtk_ril_handle* handle, mbtk_ril_cid_enum cid, int timeout);
+
+/*
+* Get data call state.
+*/
+mbtk_ril_err_enum mbtk_data_call_state_get(mbtk_ril_handle* handle, mbtk_ril_cid_enum cid, mbtk_ip_info_t *ip);
+
+/*
+* Get current network signal.
+*/
+mbtk_ril_err_enum mbtk_net_signal_get(mbtk_ril_handle* handle, mbtk_signal_info_t *signal);
+
+/*
+* Get current network register information.
+*/
+mbtk_ril_err_enum mbtk_net_reg_get(mbtk_ril_handle* handle, mbtk_net_reg_info_t *reg);
+
+
+/*
+* Return sms cmgf.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgf_get(mbtk_ril_handle* handle, int *volte_state);
+
+/*
+* Set sms cmgf.
+*
+* volte_state:
+* 0 : PDU mode.
+* 1 :  text mode.
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgf_set(mbtk_ril_handle* handle, int mode);
+
+/*
+* Set sms cmgs.
+*
+if PDU mode (+CMGF=0):
++CMGS=<length><CR>
+PDU is given<ctrl-Z/ESC>
+
+if text mode (+CMGF=1):
++CMGS=<da>[,<toda>]<CR>
+text is entered<ctrl-Z/ESC>
+
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgs_set(mbtk_ril_handle* handle, char * cmgs, char *resp);
+
+/*
+* Set sms cmgw.
+*
+if text mode (+CMGF=1):
++CMGW=<oa/da>[,<tooa/toda>[,<stat>]]
+<CR>
+text is entered<ctrl-Z/ESC>
+if PDU mode (+CMGF=0):
++CMGW=<length>[,<stat>]<CR>PDU is
+given<ctrl-Z/ESC>
+
+*/
+mbtk_ril_err_enum mbtk_sms_cmgw_set(mbtk_ril_handle* handle, char * cmgw, char *resp);
+
+/*
+* Set sms cmgd.
+*
+* +CMGD=<index>[,<delflag>]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgd_set(mbtk_ril_handle* handle, char * cmdg);
+
+/*
+* Get sms cmgd.
+*
+* +CMGD: (XXX,XXX)(0-4)
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgd_get(mbtk_ril_handle* handle, char * cmdg);
+
+/*
+* Set sms cmgl.
+*
+* AT+CMGL[=<stat>]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgl_set(mbtk_ril_handle* handle, char * cmgl, char *resp);
+
+/*
+* Return sms csca.
+*/
+mbtk_ril_err_enum mbtk_sms_csca_get(mbtk_ril_handle* handle, char *buf);
+
+/*
+* Set sms csca.
+*
+* AT+CSCA=<number> [,<type>]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_csca_set(mbtk_ril_handle* handle, char * csca);
+
+/*
+* Set sms csmp.
+*
+* AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_csmp_set(mbtk_ril_handle* handle, char * csmp);
+
+/*
+* Set sms cscb.
+*
+* AT+CSCB=<[<mode>[,<mids>[,<dcss>]]]>
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cscb_set(mbtk_ril_handle* handle, char * cscb);
+
+/*
+* Set sms cnmi.
+*
+at+cnmi=1,2
+
+OK
+if sending fails:
++CMS ERROR: <err>
+*/
+mbtk_ril_err_enum mbtk_sms_cnmi_set(mbtk_ril_handle* handle);
+
+/*
+* Set sms cmss.
+*
++CMSS=<index>[,<da>[,<toda>]]
+
+if sending successful:
++CMSS: <mr>
+OK
+if sending fails:
++CMS ERROR: <err>
+*/
+mbtk_ril_err_enum mbtk_sms_cmss_set(mbtk_ril_handle* handle, char * cmss, char *resp);
+
+/*
+* Return sms cmgf.
+*/
+mbtk_ril_err_enum mbtk_sms_cpms_get(mbtk_ril_handle* handle, char * mem);
+
+/*
+* Set sms cpms.
+*
+* AT+CPMS=<mem1>[,<mem2>[,<mem3>]]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cpms_set(mbtk_ril_handle* handle, char * mem, char* response);
+
+/*
+* Set sms cm.
+*
+* +CMGR=<index>
+
+if PDU mode (+CMGF=0) ��command successful:
++CMGR: <stat>,[<alpha>],<length><CR><LF><pdu>
+OK
+if text mode (+CMGF=1), command successful and SMS-DELIVER:
++CMGR:<stat>,<oa>,[<alpha>],<scts>[,<tooa>,<fo>,<pid>,<dcs
+>, <sca>,<tosca>,<length>]<CR><LF><data>
+OK
+if text mode (+CMGF=1), command successful and SMS-SUBMIT:
++CMGR:
+<stat>,<da>,[<alpha>][,<toda>,<fo>,<pid>,<dcs>,[<vp>],
+<sca>,<tosca>,<length>]<CR><LF><data>
+OK
+otherwise:
++CMS ERROR: <err>
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgr_set(mbtk_ril_handle* handle, int index, char *resp);
+
+/*
+* Get sim state.
+*/
+mbtk_ril_err_enum mbtk_sim_state_get(mbtk_ril_handle* handle, mbtk_sim_state_enum *sim_state);
+
+/*
+* Get sim card type.
+*/
+mbtk_ril_err_enum mbtk_sim_type_get(mbtk_ril_handle* handle, mbtk_sim_card_type_enum *sim_card_type);
+
+/*
+* Get plmn list
+*/
+mbtk_ril_err_enum mbtk_plmn_list_get(mbtk_ril_handle* handle, mbtk_plmn_info *plmn_list);
+
+/*
+* call_start
+*
+*/
+mbtk_ril_err_enum mbtk_call_start(mbtk_ril_handle* handle, char* phone_number);
+
+/*
+* Answer the phone call.
+*
+*/
+mbtk_ril_err_enum mbtk_call_answer(mbtk_ril_handle* handle);
+
+/*
+* Hang up all call.
+*
+*/
+mbtk_ril_err_enum mbtk_call_hang(mbtk_ril_handle* handle);
+
+/*
+* Hang up a call.
+*
+*/
+mbtk_ril_err_enum mbtk_a_call_hang(mbtk_ril_handle* handle, int phone_id);
+
+/*
+* Hang up waiting or background call.
+*
+*/
+mbtk_ril_err_enum mbtk_waiting_or_background_call_hang(mbtk_ril_handle* handle);
+
+/*
+* Hang up foreground resume background call.
+*
+*/
+mbtk_ril_err_enum mbtk_foreground_resume_background_call_hang(mbtk_ril_handle* handle);
+
+/*
+* Get current call phone number.
+*/
+mbtk_ril_err_enum mbtk_call_reg_get(mbtk_ril_handle* handle, mbtk_call_info_t *reg);
+
+/*
+* Return mute state.
+*/
+mbtk_ril_err_enum mbtk_mute_state_get(mbtk_ril_handle* handle, int *mute_state);
+
+/*
+* Set mute state.
+*
+* mute_state:
+* 0 : of mute.
+* 1 : on mute.
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_mute_state_set(mbtk_ril_handle* handle, int mute_state);
+
+/*
+* Set DTMF character.
+*
+*/
+mbtk_ril_err_enum mbtk_dtmf_send(mbtk_ril_handle* handle, mbtk_call_dtmf_info_t *dtmf_character);
+
+mbtk_ril_err_enum mbtk_centric_set(mbtk_ril_handle* handle, int centric);
+
+mbtk_ril_err_enum mbtk_centric_get(mbtk_ril_handle* handle, int *centric);
+
+
+
+/*
+* Set msd item.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_msd_item_set(mbtk_ril_handle* handle, const mbtk_ecall_msd_cfg_info_t *msd_cfg);
+
+/*
+* Generate msd after msd item set.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_msd_gen(mbtk_ril_handle* handle);
+
+/*
+* Set ecall msd.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_msd_set(mbtk_ril_handle* handle, const void* msd);
+
+/*
+* Get ecall msd.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_msd_get(mbtk_ril_handle* handle, void* msd);
+
+
+/*
+* Set ecall msd item.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_push(mbtk_ril_handle* handle);
+
+/*
+* Set ecall only configs.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_only_set(mbtk_ril_handle* handle, const mbtk_ecall_only_info_t* info);
+
+/*
+* Get ecall only configs.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_only_get(mbtk_ril_handle* handle, mbtk_ecall_only_info_t* info);
+
+/*
+* Set ecall network reg.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_reg_set(mbtk_ril_handle* handle, int reg);
+
+/*
+* Start ecall dial start.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_dial_start(mbtk_ril_handle* handle, mbtk_ecall_dial_type_enum type);
+
+/*
+* Get ecall dial state.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_dial_state_get(mbtk_ril_handle* handle, mbtk_ecall_dial_type_enum* type);
+
+/*
+* Set ecall mode.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_mode_set(mbtk_ril_handle* handle, mbtk_ecall_mode_type_enum mode);
+
+/*
+* Get ecall mode.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_mode_get(mbtk_ril_handle* handle, mbtk_ecall_mode_type_enum *mode);
+
+/*
+* Set ecall configs.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_cfg_set(mbtk_ril_handle* handle, const mbtk_ecall_cfg_info_t *cfg);
+
+/*
+* Get ecall configs.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_cfg_get(mbtk_ril_handle* handle, mbtk_ecall_cfg_info_t* cfg);
+
+/*
+* Set ecall sms number.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_sms_number_set(mbtk_ril_handle* handle, const void *number);
+
+/*
+* Get ecall sms number.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_sms_number_get(mbtk_ril_handle* handle, void *number);
+
+/*
+* Set ecall mute speaker.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_mute_spk_set(mbtk_ril_handle* handle, int mute);
+
+/*
+* Set ecall dsp gain.
+*
+*/
+mbtk_ril_err_enum mbtk_ecall_dsp_gain_set(mbtk_ril_handle* handle, const mbtk_ecall_gain_info_t *gain_info);
+
+/*
+* Set ril server ready callback function.
+*/
+mbtk_ril_err_enum mbtk_ril_ser_state_change_cb_reg(mbtk_ril_callback_func cb);
+
+/*
+* Set net reg state change callback function.
+*/
+mbtk_ril_err_enum mbtk_net_reg_state_change_cb_reg(mbtk_ril_callback_func cb);
+
+/*
+* Set call state change callback function.
+*/
+mbtk_ril_err_enum mbtk_call_state_change_cb_reg(mbtk_ril_callback_func cb);
+
+/*
+* Set sms state change callback function.
+*/
+mbtk_ril_err_enum mbtk_sms_state_change_cb_reg(mbtk_ril_callback_func cb);
+
+/*
+* Set radio state change callback function.
+*/
+mbtk_ril_err_enum mbtk_radio_state_change_cb_reg(mbtk_ril_callback_func cb);
+
+/*
+* Set sim state change callback function.
+*/
+mbtk_ril_err_enum mbtk_sim_state_change_cb_reg(mbtk_ril_callback_func cb);
+
+/*
+* Set pdp state change callback function.
+*/
+mbtk_ril_err_enum mbtk_pdp_state_change_cb_reg(mbtk_ril_callback_func cb);
+
+/*
+* Set signal state change callback function.
+*/
+mbtk_ril_err_enum mbtk_signal_state_change_cb_reg(mbtk_ril_callback_func cb);
+
+/*
+* Set ecall state change callback function.
+*/
+mbtk_ril_err_enum mbtk_ecall_state_change_cb_reg(mbtk_ril_callback_func cb);
+
+/*
+* get md version 
+*/
+int mbtk_get_modem_version(mbtk_ril_handle* handle, void *modem_version);
+
+
+#endif /* _MBTK_INFO_API_2_H */
+
diff --git a/mbtk/include/mbtk/mbtk_rtp.h b/mbtk/include/mbtk/mbtk_rtp.h
new file mode 100755
index 0000000..8786c36
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_rtp.h
@@ -0,0 +1,31 @@
+/*
+* mbtk_rtp.h
+*
+* MBTK RTP API header.
+*
+* Author : lb
+* Date   : 2024/12/2 19:51:25
+*/
+#ifndef _MBTK_RTP_H
+#define _MBTK_RTP_H
+#include "mbtk_type.h"
+
+int mbtk_rtp_init();
+
+int mbtk_rtp_deinit();
+
+int mbtk_rtp_enable(bool enable);
+
+int mbtk_rtp_volume_set(int volume);
+
+int mbtk_rtp_remote_ip_set(const char *ipv4);
+
+int mbtk_rtp_server_port_set(int port);
+
+int mbtk_rtp_client_port_set(int port);
+
+int mbtk_rtp_sample_rate_set(int sample_rate);
+
+int mbtk_rtp_channel_set(int channel);
+
+#endif /* _MBTK_RTP_H */
diff --git a/mbtk/include/mbtk/mbtk_sleep.h b/mbtk/include/mbtk/mbtk_sleep.h
new file mode 100755
index 0000000..c91d92f
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_sleep.h
@@ -0,0 +1,82 @@
+/*************************************************************
+Description:
+    MBTK sleep head file.
+Author:
+    XiaoRui
+Date:
+    2024/10/24 20:08:03
+*************************************************************/
+#ifndef _MBTK_SLEEP_H
+#define _MBTK_SLEEP_H
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <sys/un.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <string.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <stddef.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <sys/epoll.h>
+#include <linux/input.h>
+
+#include "mbtk_type.h"
+
+/*************************************************************
+    Constants and Macros
+*************************************************************/
+typedef void (*mbtk_sleep_callback_func)(const void* data, int data_len);
+
+#define LOCK_MAX_SIZE       129
+#define EPOLL_SIZE_HINT     128
+
+/*
+This module is system sleep, the system cannot sleep when the lock exists
+To verify whether it is in sleep state, it is necessary to test the power consumption
+Power management principle, as long as a wakelock lock exists, the system will not enter the Suspend state
+So the name can be arbitrarily chosen to indicate that such a lock is needed so that the system does not sleep
+*/
+#define MTBK_POWERIND           "/system/etc/powerind"      //1806
+
+
+/*************************************************************
+    Definitions:enum,struct,union,class
+*************************************************************/
+typedef struct
+{
+    int fd;
+    char name[64];
+} mbtk_lock_name_s;
+
+
+
+/*************************************************************
+    Extern variables
+*************************************************************/
+
+
+/*************************************************************
+    Public Function Declaration
+*************************************************************/
+int mbtk_powerrind_get();
+int mbtk_autosuspend_enable(char enable);
+int mbtk_wakelock_create(const char* name , size_t len);
+int mbtk_wakelock_lock(int fd);
+int mbtk_wakelock_unlock(int fd);
+int mbtk_wakelock_destroy(int fd);
+int mbtk_suspend_timer_set(int time, mbtk_sleep_callback_func cb);
+int mbtk_suspend_timer_cancel(void);
+
+#endif /* _MBTK_SLEEP_H */
diff --git a/mbtk/include/mbtk/mbtk_sock.h b/mbtk/include/mbtk/mbtk_sock.h
new file mode 100755
index 0000000..5179336
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_sock.h
@@ -0,0 +1,101 @@
+
+/*
+*
+*
+* Author : lb
+* Date   : 2022/3/5 15:33:37
+*
+*/
+#ifndef _MBTK_SOCK_H
+#define _MBTK_SOCK_H
+#include <stdbool.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <netinet/in.h>
+
+#include "mbtk_type.h"
+#include "mbtk_sock2.h"
+
+
+#define MBTK_BUFF_SIZE 2048
+
+typedef struct
+{
+    union
+    {
+        struct sockaddr_in6 dst_sock_addr6;
+        struct sockaddr_in serverSockAddr;
+    }addr;
+    uint16 ip_version;
+    uint16 addr_len;
+} mbtk_ipv4v6_addr;
+
+typedef enum
+{
+    MBTK_ADDR_IPV4,
+    MBTK_ADDR_IPV6,
+    MBTK_ADDR_IPV4V6
+} mbtk_addr_family_e;
+
+typedef enum
+{
+    MBTK_SOCK_TCP_COM = 0,
+    MBTK_SOCK_UDP_COM
+} mbtk_sock_type_e;
+
+
+typedef struct
+{
+    int16 net_id;
+#ifdef MBTK_PLATFORM_QCOMM
+    sint15 app6_id;
+    sint15 task_handle;
+    uint32 ip_filter;
+    //ds_policy_info_type policy_info;    // No use
+#endif
+    bool keep_alive;
+    uint32 recv_buff_size;
+} mbtk_net_info_s;
+
+typedef struct
+{
+    int fd;
+    char host[50];
+    int port;
+    bool is_ssl;
+    bool use_cert;
+    mbtk_sock_type_e sock_type;
+    mbtk_addr_family_e addr_family;
+    mbtk_buffer_t read_buff;
+
+    mbtk_ipv4v6_addr addr;
+    uint16 temp;    // Must add (addr.addr_len should be uint32)
+} mbtk_sock_info_s;
+
+int sock_net_open(mbtk_net_info_s *net_info, mbtk_addr_family_e addr_family);
+
+int sock_open(mbtk_net_info_s *net_info, mbtk_sock_info_s *sock_info, uint32 timeout, int *err);
+
+int sock_addr_set(mbtk_net_info_s *net_info,mbtk_sock_info_s *sock_info,void *host, uint32 port);
+
+int sock_bind(int sockfd, bool is_ipv6, uint16 port);
+
+int sock_read(mbtk_net_info_s *net_info, mbtk_sock_info_s *sock_info, void *buffer, uint32 buf_len, uint32 timeout, int *err);
+
+int sock_read_async(mbtk_net_info_s *net_info, mbtk_sock_info_s *sock_info, void *buffer, uint32 buf_len, uint32 timeout, int *err);
+
+int sock_readline(mbtk_net_info_s *net_info, mbtk_sock_info_s *sock_info, void *buffer, uint32 buf_len, uint32 timeout, int *err);
+
+int sock_write(mbtk_net_info_s *net_info, mbtk_sock_info_s *sock_info, const void *buffer, uint32 buf_len, uint32 timeout, int *err);
+
+int sock_recv(mbtk_net_info_s *net_info, mbtk_sock_info_s *sock_info, void *buffer, uint32 buf_len, uint32 timeout);
+
+int sock_sendto(mbtk_net_info_s *net_info, mbtk_sock_info_s *sock_info, const void *buffer, uint32 buf_len, uint32 timeout);
+
+int sock_close(mbtk_net_info_s *net_info, mbtk_sock_info_s *sock_info, uint32 timeout, int *err);
+
+int sock_net_close(mbtk_net_info_s *net_info, uint32 timeout, int *err);
+
+#endif /* _MBTK_SOCK_H */
diff --git a/mbtk/include/mbtk/mbtk_sock2.h b/mbtk/include/mbtk/mbtk_sock2.h
new file mode 100755
index 0000000..c56a2c0
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_sock2.h
@@ -0,0 +1,195 @@
+/*************************************************************
+Description:
+    mbtk_sock.h
+    Used to define mobiletek sockets interfaces
+Author:
+    YangDagang
+Date:
+    2019-1-30
+*************************************************************/
+#ifndef __MBTK_SOCK2_H__
+#define __MBTK_SOCK2_H__
+
+#include "mbtk_type.h"
+#include "mbtk_net_control.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MBTK_SOCK_EVENT_READ 0x01
+
+/*************************************************************
+    Constants and Macros
+*************************************************************/
+typedef int mbtk_sock_handle;
+typedef int mbtk_sock_session;
+
+/*************************************************************
+    Definitions:enum,struct,union
+*************************************************************/
+typedef enum
+{
+    /*common error code (-99 ~ 0)*/
+    MBTK_SOCK_SUCCESS = 0,
+    MBTK_SOCK_ERROR = -1,
+    MBTK_SOCK_EMEMORY = -2,
+    MBTK_SOCK_EARG = -3, /* Invalid buffer or argument */
+    MBTK_SOCK_EDNS = -4, /* DNS error */
+    MBTK_SOCK_ETIMEOUT = -5, /* Timeout */
+    /*socket error code */
+    MBTK_SOCK_EEOF = 0, /* end of file */
+    MBTK_SOCK_EBADF = 100, /* Invalid socket descriptor */
+    MBTK_SOCK_EFAULT= 101,   /* Invalid buffer or argument */
+    MBTK_SOCK_EWOULDBLOCK = 102, /* Operation would block */
+    MBTK_SOCK_EAFNOSUPPORT = 103, /* Address family not supported */
+    MBTK_SOCK_EPROTOTYPE = 104, /* Wrong protocol for socket type */
+    MBTK_SOCK_ESOCKNOSUPPORT = 105, /* Socket parameter not supported */
+    MBTK_SOCK_EPROTONOSUPPORT = 106, /* Socket parameter not supported */
+    MBTK_SOCK_EMFILE = 107, /* No more sockets available for opening */
+    MBTK_SOCK_EOPNOTSUPP = 108, /* Operation not supported */
+    MBTK_SOCK_ETIMEDOUT = 116, /* Connection attempt timed out */
+    MBTK_SOCK_ECONNRESET = 117, /* Connection reset */
+    MBTK_SOCK_ECONNABORTED = 118, /* Connection aborted */
+    MBTK_SOCK_EPIPE = 119,   /* Broken pipe */
+    MBTK_SOCK_ENETDOWN = 120, /* Network subsystem unavailable */
+    MBTK_SOCK_ENETNONET = 202, /* network subsystem unavailable */
+    /*unkonw error code (-1000 ~ ...)*/
+    MBTK_SOCK_EUNKONW = -1000     /*unkonw error*/
+}mbtk_sock_errno;
+
+typedef enum
+{
+    MBTK_SOCK_TCP = 0,
+    MBTK_SOCK_UDP
+} mbtk_sock_type;
+
+typedef enum
+{
+    MBTK_NET_LINUX = 0, // Default for Linux socket.
+    MBTK_NET_QUAL,      // Qcomm modem socket.
+    MBTK_NET_MAX
+} mbtk_net_type;
+
+typedef struct {
+    int state;
+    const char* addr;
+    const char* if_name;
+} mbtk_net_cb_info_s;
+
+typedef struct {
+    mbtk_sock_session sock_fd;
+    int event;
+    mbtk_sock_type sock_type;
+} mbtk_sock_cb_info_s;
+
+typedef void (*mbtk_net_cb_func)(mbtk_sock_handle handle, mbtk_net_cb_info_s *net_info);
+typedef void (*mbtk_sock_cb_func)(mbtk_sock_handle handle, mbtk_sock_cb_info_s *sock_info);
+
+//Used to provide external and to transmit information
+typedef struct
+{
+    mbtk_sock_type type; // socket type:TCP or UDP
+    bool is_support_ssl; //is suppoert ssl
+    bool ingnore_cert; //is ingnore certificate
+    char address[256]; //server address
+    int port; //server port
+    char local_address[256]; //Local address
+    int local_port; // Local port
+    int ftp_ssl_support;
+} mbtk_sock_info;
+
+typedef struct
+{
+    char if_name[100];
+    mbtk_net_type net_type;
+    mbtk_net_cb_func net_cb;
+    mbtk_sock_cb_func sock_cb;
+} mbtk_init_info;
+
+#ifdef MBTK_POLARSSL_SUPPORT
+#define DFL_SERVER_NAME         "asr"
+#define DFL_SERVER_ADDR         NULL
+#define DFL_SERVER_PORT         4433
+#define DFL_REQUEST_PAGE        "/"
+#define DFL_REQUEST_SIZE        -1
+#define DFL_DEBUG_LEVEL         0
+#define DFL_NBIO                0
+#define DFL_CA_FILE             "/ca.crt"
+#define DFL_CA_PATH             "/ca.crt"
+#define DFL_CRT_FILE            "/client.crt"
+#define DFL_KEY_FILE            "/client.key"
+#define DFL_PSK                 ""
+#define DFL_PSK_IDENTITY        "Client_identity"
+#define DFL_FORCE_CIPHER        0
+#define DFL_RENEGOTIATION       SSL_RENEGOTIATION_DISABLED
+#define DFL_ALLOW_LEGACY        SSL_LEGACY_NO_RENEGOTIATION
+#define DFL_RENEGOTIATE         0
+#define DFL_EXCHANGES           1
+#define DFL_MIN_VERSION         SSL_MINOR_VERSION_3
+#define DFL_MAX_VERSION         SSL_MINOR_VERSION_3
+#define DFL_AUTH_MODE           SSL_VERIFY_REQUIRED
+#define DFL_MFL_CODE            SSL_MAX_FRAG_LEN_NONE
+#define DFL_TRUNC_HMAC          0
+#define DFL_RECONNECT           0
+#define DFL_RECO_DELAY          0
+#define DFL_TICKETS             SSL_SESSION_TICKETS_ENABLED
+#define DFL_ALPN_STRING         NULL
+#endif
+
+/*************************************************************
+    Variables:local,extern
+*************************************************************/
+
+/*************************************************************
+    Local Function Declaration
+*************************************************************/
+
+/*************************************************************
+    Extern Function Declaration
+*************************************************************/
+extern mbtk_sock_handle mbtk_sock_init(mbtk_init_info *info);
+extern mbtk_sock_session mbtk_sock_open(mbtk_sock_handle handle,mbtk_sock_info *info,
+                unsigned int timeout,
+                int *mbtk_errno);
+extern int mbtk_sock_write(mbtk_sock_handle handle,mbtk_sock_session session,
+                const void *buffer,
+                unsigned int buf_len,
+                unsigned int timeout,
+                int *mbtk_errno);
+extern int mbtk_sock_read(mbtk_sock_handle handle,mbtk_sock_session session,
+            void *buffer,
+            unsigned int buf_len,
+            unsigned int timeout,
+            int *mbtk_errno);
+extern int mbtk_sock_read_async(mbtk_sock_handle handle,mbtk_sock_session session,
+            void *buffer,
+            unsigned int buf_len);
+extern int mbtk_sock_read_sync(mbtk_sock_handle handle,mbtk_sock_session session,
+            void *buffer,
+            unsigned int buf_len);
+extern int mbtk_sock_close(mbtk_sock_handle handle,mbtk_sock_session session,
+            unsigned int timeout,
+            int *mbtk_errno);
+extern int mbtk_sock_deinit(mbtk_sock_handle handle);
+
+extern int mbtk_ssl_init_func(mbtk_sock_handle handle ,bool ingnore_cert,mbtk_sock_session fd);
+extern int mbtk_ssl_close_func(mbtk_sock_handle handle ,bool ingnore_cert,mbtk_sock_session fd);
+extern int mbtk_sock_readline(mbtk_sock_handle handle,mbtk_sock_session session,
+            void *buffer,
+            unsigned int buf_len,
+            unsigned int timeout,
+            int *mbtk_errno,
+            int *read_line_count,
+            char *buf_ptr);
+/*
+* Get TCP RECV buffer data length.
+*/
+int mbtk_sock_tcp_recv_len_get(mbtk_sock_handle handle,mbtk_sock_session session);
+
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif /* __MBTK_SOCK2_H__ */
diff --git a/mbtk/include/mbtk/mbtk_str.h b/mbtk/include/mbtk/mbtk_str.h
new file mode 100755
index 0000000..c74127d
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_str.h
@@ -0,0 +1,125 @@
+#ifndef MBTK_STR_INCLUDE
+#define MBTK_STR_INCLUDE
+
+#include "mbtk_type.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+* Converts all of the characters in this String to lower.
+*
+* Parameters:
+*   src - The string should be converted.
+*   dest  - The lowercase string.
+*   len - The length of result string.Must be "strlen(src) + 1"
+* Returns:
+*   The string, converted to lowercase,or NULL for fail.
+*/
+void*
+str_tolower
+(
+    const void *src,
+    void *dest,
+    size_t len
+);
+
+/*
+* Converts all of the characters in this String to upper case.
+*
+* Parameters:
+*   src - The string should be converted.
+*   dest  - The uppercase string.
+*   len - The length of result string.Must be "strlen(str_ptr) + 1"
+* Returns:
+*   The string, converted to uppercase.or NULL for fail.
+*/
+void*
+str_toupper
+(
+    const void *src,
+    void *dest,
+    size_t len
+);
+
+/*
+* Remove the head and tail spaces.
+*/
+void*
+str_trim
+(
+    const void* str,
+    void *result,
+    size_t len
+);
+
+/*
+* Returns true if and only if this string contains the specified sequence of char values.
+*
+* Parameters:
+*   str   -   The substring to search from.
+*   sub_str - The substring to search for.
+* Returns:
+*   True if str contains sub_str, false otherwise.
+*/
+bool
+str_contains
+(
+    const void* str,
+    const void* sub_str
+);
+
+/*
+* Returns the index within this string of the first occurrence of the specified substring.
+* If no such substring, then -1 is returned.
+*
+* Parameters:
+*   str   -   The substring to search from.
+*   sub_str - The substring to search for.
+* Returns:
+*   The index of the first occurrence of the specified substring,
+*   or -1 if there is no such occurrence.
+*/
+ssize_t
+str_indexof
+(
+    const void* str,
+    const void* sub_str
+);
+
+/*
+* Returns a new string that is a substring of this string. The substring begins
+* at the specified beginIndex and extends to the character at index endIndex - 1.
+* Thus the length of the substring is endIndex-beginIndex.
+*
+* Examples:
+*   "hamburger".substring(4, 8) returns "urge"
+*   "smiles".substring(1, 5) returns "mile"
+*
+* Parameters:
+*   begin_index     The beginning index, inclusive.
+*   end_index       The ending index, exclusive.
+* Returns:
+*   The specified substring or NULL.
+*/
+void*
+str_substring
+(
+    const void* str,
+    size_t begin_index,
+    size_t end_index,
+    void *sub_str,
+    size_t len
+);
+
+bool str_startwith(const char* str, const void* prefix);
+
+void* strstr_hex(char *haystack,int haystack_len,
+                    const char *needle,int needle_len);
+
+bool str_empty(const void *str);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+#endif /* MBTK_STR_INCLUDE */
diff --git a/mbtk/include/mbtk/mbtk_task.h b/mbtk/include/mbtk/mbtk_task.h
new file mode 100755
index 0000000..d0a0604
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_task.h
@@ -0,0 +1,79 @@
+/*************************************************************
+Description:
+    mbtk_task.h
+    Used to define mobiletek standard task or thread interfaces
+Author:
+    YangDagang
+Date:
+    2019-7-13
+*************************************************************/
+#ifndef __MBTK_TASK_H__
+#define __MBTK_TASK_H__
+
+#include "mbtk_queue.h"
+#include <pthread.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*************************************************************
+    Constants and Macros
+*************************************************************/
+typedef void* (*mbtk_task_cb_handle)(void *payload);
+typedef void (*mbtk_uart_printf_cb)(char* data,int data_len);
+
+
+/*************************************************************
+    Definitions:enum,struct,union
+*************************************************************/
+typedef struct
+{
+    unsigned int sig;
+    void* payload;
+} mbtk_signal_info;
+
+typedef struct
+{
+    void* task_id;
+    mbtk_task_cb_handle thread_run;
+    void* args;
+} mbtk_task_info;
+
+typedef struct
+{
+    mbtk_uart_printf_cb urc_prt;
+    mbtk_uart_printf_cb data_prt;
+} mbtk_reg_callback;
+
+typedef struct {
+    pthread_t thread_id;
+    pthread_cond_t cond;
+    mbtk_mutex mutex;
+    mbtk_queue_node_t queue;
+} mbtk_task_queue_info;
+
+
+/*************************************************************
+    Variables:local,extern
+*************************************************************/
+
+/*************************************************************
+    Local Function Declaration
+*************************************************************/
+
+/*************************************************************
+    Extern Function Declaration
+*************************************************************/
+extern int mbtk_task_start(mbtk_task_info *task);
+extern int mbtk_task_queue_start(void *param,mbtk_task_cb_handle cb);
+extern void mbtk_task_queue_stop(void *param);
+extern int mbtk_signal_send(void *param,mbtk_signal_info* info);
+extern mbtk_signal_info *mbtk_signal_get(void *param);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif /* __MBTK_TASK_H__ */
+
diff --git a/mbtk/include/mbtk/mbtk_tcpip.h b/mbtk/include/mbtk/mbtk_tcpip.h
new file mode 100755
index 0000000..0a28c40
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_tcpip.h
@@ -0,0 +1,99 @@
+/*
+    TCP/IP AT header.
+*/
+/******************************************************************************
+
+                          EDIT HISTORY FOR FILE
+
+  WHEN        WHO       WHAT,WHERE,WHY
+--------    --------    -------------------------------------------------------
+2023/9/24      lb    Initial version
+
+******************************************************************************/
+#ifndef _MBTK_TCPIP_H
+#define _MBTK_TCPIP_H
+#include "mbtk_type.h"
+#include "mbtk_sock2.h"
+
+#define MBTK_TCPIP_LINK_MAX 4
+
+typedef enum {
+    MBTK_TCPIP_ERR_SUCCESS,
+    MBTK_TCPIP_ERR_NET_UNAVAILABLE,     /* Network unavailable. */
+    MBTK_TCPIP_ERR_NET_HANDLE,     /* Network handle error. */
+    MBTK_TCPIP_ERR_ARG,     /* Parameter error. */
+    MBTK_TCPIP_ERR_LINK_UNAVAILABLE,     /* Link unavailable. */
+    MBTK_TCPIP_ERR_LINK_NOT_CONNECT,     /* Link not connect. */
+
+
+
+
+    MBTK_TCPIP_ERR_UNKNOWN
+} mbtk_tcpip_err_enum;
+
+typedef enum {
+    MBTK_TCPIP_TYPE_CLIENT,
+    MBTK_TCPIP_TYPE_SERVER
+} mbtk_tcpip_type_enum;
+
+typedef void (*mbtk_tcpip_net_callback_func)(int state, const char* addr);
+typedef void (*mbtk_tcpip_sock_callback_func)(int link_id, int state);
+typedef void (*mbtk_tcpip_read_callback_func)(int link_id, const char* data, int data_len);
+
+typedef struct {
+    int link_id;
+    char ser_addr[256];
+    int ser_port;
+    mbtk_sock_type prot_type; // TCP/UDP
+    mbtk_tcpip_type_enum tcpip_type; // Only support client.
+    int local_port;
+    bool ack_support;
+    bool ssl_support;
+    bool ignore_cert;
+    uint32 heartbeat_time;
+    uint32 delay_time;
+
+    mbtk_tcpip_read_callback_func read_cb;
+} mbtk_tcpip_info_t;
+
+typedef struct {
+    int link_id;
+    int sock_fd;
+    int state;
+    int recv_data_len;
+} mbtk_tcpip_tcp_state_info_s;
+
+mbtk_tcpip_err_enum mbtk_tcpip_net_open(mbtk_tcpip_net_callback_func net_cb, mbtk_tcpip_sock_callback_func sock_cb);
+mbtk_tcpip_err_enum mbtk_tcpip_net_close();
+mbtk_tcpip_err_enum mbtk_tcpip_sock_open(const mbtk_tcpip_info_t *tcpip_info);
+mbtk_tcpip_err_enum mbtk_tcpip_sock_close(int link_id);
+
+int mbtk_tcpip_send(int link_id, const char* data, int data_len, const char* ser_addr, int ser_port);
+int mbtk_tcpip_read(int link_id, char* buff, int buff_size);
+
+/*
+* Get the data traffic of the specified link. Return -1 if fail.
+*/
+int mbtk_tcpip_data_traffic_get(int link_id);
+
+/*
+* Reset the data traffic of the specified link.
+*/
+mbtk_tcpip_err_enum mbtk_tcpip_data_traffic_reset(int link_id);
+
+/*
+* Return 0 if disconnected, 1 for connected, other for fail.
+*/
+int mbtk_tcpip_link_state_get(int link_id);
+
+/*
+* Get TCP state informations.
+*/
+int mbtk_tcpip_info_get(int link_id, mbtk_tcpip_tcp_state_info_s *state_info);
+
+/*
+* Set socket auto read callback function,NULL for close auto read.
+*/
+void mbtk_tcpip_set_read_cb(int link_id, mbtk_tcpip_read_callback_func read_cb);
+
+#endif /* _MBTK_TCPIP_H */
diff --git a/mbtk/include/mbtk/mbtk_type.h b/mbtk/include/mbtk/mbtk_type.h
new file mode 100755
index 0000000..c7fc885
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_type.h
@@ -0,0 +1,123 @@
+#ifndef MBTK_TYPE_INCLUDE
+#define MBTK_TYPE_INCLUDE
+#include <stdio.h>
+#include <stdbool.h>
+#include <sys/types.h>
+
+#ifndef MBTK_PLATFORM_LINUX
+#define MBTK_PLATFORM_LINUX
+#endif
+
+#ifndef MBTK_PLATFORM_QCOMM
+//#define MBTK_PLATFORM_QCOMM
+#endif
+
+#define MBTK_SUCCESS 0
+#define MBTK_FAILE (-1)
+
+#ifndef UNUSED
+#define UNUSED(param) ((void) param)
+#endif
+
+#ifndef UNUSEDPARAM
+#define UNUSEDPARAM(param) ((void) param)
+#endif
+
+#ifndef TRUE
+#define TRUE   1   /* Boolean true value. */
+#endif
+
+#ifndef true
+#define true   1   /* Boolean true value. */
+#endif
+
+#ifndef FALSE
+#define FALSE  0   /* Boolean false value. */
+#endif
+
+#ifndef false
+#define false  0   /* Boolean false value. */
+#endif
+
+
+#ifndef NULL
+#define NULL  0
+#endif
+
+
+#ifndef null
+#define null  0
+#endif
+
+/**
+ * Compiler-digit : 16
+ * char : 1     (%c)
+ * char* : 2
+ * short int : 2
+ * int : 2      (%d)
+ * unsigned int : 2  (%u)
+ * float : 4    (%f)
+ * double : 8   (%f)
+ * long : 4
+ * unsigned long : 4
+ * long long : 8
+ * unsigned long long : 8
+ *
+ *
+ * Compiler-digit : 32
+ * char : 1
+ * char* : 4
+ * short int : 2
+ * int : 4
+ * unsigned int : 4
+ * float : 4
+ * double : 8
+ * long : 4
+ * unsigned long : 4
+ * long long : 8
+ * unsigned long long : 8
+ *
+ *
+ * Compiler-digit : 64
+ * char : 1
+ * char* : 8
+ * short int : 2
+ * int : 4
+ * unsigned int : 4
+ * float : 4
+ * double : 8
+ * long : 8
+ * unsigned long : 8
+ * long long : 8
+ * unsigned long long : 8
+ */
+typedef unsigned char boolean; /* Boolean value type. */
+// typedef unsigned char bool; /* Boolean value type. */
+typedef unsigned long long uint64; /* Unsigned 64 bit value */
+typedef unsigned long long uint64_t; /* Unsigned 64 bit value */
+typedef unsigned int uint32; /* Unsigned 32 bit value */
+typedef unsigned int uint32_t; /* Unsigned 32 bit value */
+typedef unsigned short uint16; /* Unsigned 16 bit value */
+typedef unsigned short uint16_t;
+typedef unsigned char uint8; /* Unsigned 8  bit value */
+typedef unsigned char uint8_t;
+typedef signed long long int64; /* Signed 64 bit value */
+typedef signed long long sint64; /* Signed 64 bit value */
+typedef signed int int32; /* Signed 32 bit value */
+typedef signed int sint32; /* Signed 32 bit value */
+typedef signed short int16; /* Signed 16 bit value */
+typedef signed short sint16; /* Signed 16 bit value */
+typedef signed char int8; /* Signed 8  bit value */
+typedef signed char sint8; /* Signed 8  bit value */
+typedef unsigned char byte; /* byte type */
+
+
+typedef struct
+{
+    char *buffer;
+    int size;
+    int size_max;
+} mbtk_buffer_t;
+
+
+#endif /* MBTK_TYPE_INCLUDE */
diff --git a/mbtk/include/mbtk/mbtk_utf.h b/mbtk/include/mbtk/mbtk_utf.h
new file mode 100755
index 0000000..6a16ced
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_utf.h
@@ -0,0 +1,85 @@
+//

+// Created by hitmoon on 15-12-17.

+//

+

+#ifndef SMS_UTF_H

+#define SMS_UTF_H

+

+#include <stddef.h>

+#include <sys/types.h>

+

+typedef unsigned int UTF32;

+/* at least 32 bits */

+typedef unsigned short UTF16;

+/* at least 16 bits */

+typedef unsigned char UTF8;

+/* typically 8 bits */

+typedef unsigned char Boolean; /* 0 or 1 */

+

+/* Some fundamental constants */

+#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD

+#define UNI_MAX_BMP (UTF32)0x0000FFFF

+#define UNI_MAX_UTF16 (UTF32)0x0010FFFF

+#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF

+#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF

+

+typedef enum {

+    conversionOK, /* conversion successful */

+            sourceExhausted, /* partial character in source, but hit end */

+            targetExhausted, /* insuff. room in target for conversion */

+            sourceIllegal        /* source sequence is illegal/malformed */

+} ConversionResult;

+

+typedef enum {

+    strictConversion = 0,

+    lenientConversion

+} ConversionFlags;

+

+/* This is for C++ and does no harm in C */

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+ConversionResult ConvertUTF8toUTF16(

+        const UTF8 **sourceStart, const UTF8 *sourceEnd,

+        UTF16 **targetStart, UTF16 *targetEnd, ConversionFlags flags);

+

+ConversionResult ConvertUTF16toUTF8(

+        const UTF16 **sourceStart, const UTF16 *sourceEnd,

+        UTF8 **targetStart, UTF8 *targetEnd, ConversionFlags flags);

+

+ConversionResult ConvertUTF8toUTF32(

+        const UTF8 **sourceStart, const UTF8 *sourceEnd,

+        UTF32 **targetStart, UTF32 *targetEnd, ConversionFlags flags);

+

+ConversionResult ConvertUTF32toUTF8(

+        const UTF32 **sourceStart, const UTF32 *sourceEnd,

+        UTF8 **targetStart, UTF8 *targetEnd, ConversionFlags flags);

+

+ConversionResult ConvertUTF16toUTF32(

+        const UTF16 **sourceStart, const UTF16 *sourceEnd,

+        UTF32 **targetStart, UTF32 *targetEnd, ConversionFlags flags);

+

+ConversionResult ConvertUTF32toUTF16(

+        const UTF32 **sourceStart, const UTF32 *sourceEnd,

+        UTF16 **targetStart, UTF16 *targetEnd, ConversionFlags flags);

+

+Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);

+

+#ifdef __cplusplus

+}

+#endif

+

+// 获得下一个char的起始地址

+u_int32_t next_char(unsigned char **string);

+

+const unsigned char *utf32toutf8(wchar_t *source, unsigned char *target, size_t size,  int *len);

+

+unsigned char *utf16toutf8(unsigned short *source, unsigned char *target, size_t size,  int *len);

+unsigned short *utf8toutf16(unsigned char *source, unsigned short *target, size_t size,  int *len);

+

+int utf8len(unsigned char *string);

+int is_acsii(unsigned char *string);

+size_t utf8_get_size(unsigned char *source, size_t num);

+

+#endif //SMS_UTF_H

diff --git a/mbtk/include/mbtk/mbtk_utils.h b/mbtk/include/mbtk/mbtk_utils.h
new file mode 100755
index 0000000..8f9c780
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_utils.h
@@ -0,0 +1,111 @@
+/*************************************************************
+Description:
+    MBTK utils head file.
+Author:
+    LiuBin
+Date:
+    2019/7/24 20:08:03
+*************************************************************/
+#ifndef _MBTK_UTILS_H
+#define _MBTK_UTILS_H
+#include "mbtk_type.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*************************************************************
+    Constants and Macros
+*************************************************************/
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+#endif
+#define MBTK_CMDLINE_LEN  1024
+
+
+/*************************************************************
+    Definitions:enum,struct,union,class
+*************************************************************/
+typedef void (*mbtk_timer_alrm_func)(int signo);
+typedef void (*mbtk_cmd_cb_func)(char *buf,int buf_size);
+
+
+/*************************************************************
+    Extern variables
+*************************************************************/
+typedef enum {
+    MBTK_BYTEORDER_BIG,     // Gig Endian
+    MBTK_BYTEORDER_LITTLE,  // Little Endian
+    MBTK_BYTEORDER_UNKNOWN
+} mbtk_byteorder_enum;
+
+/*************************************************************
+    Public Function Declaration
+*************************************************************/
+bool mbtk_cmd_line
+(
+    const char *cmd,
+    char *buf,
+    int buf_size
+);
+
+bool mbtk_cmd_line_ex
+(
+    const char *cmd,
+    mbtk_cmd_cb_func cb
+);
+
+int mbtk_send_at(const void *at_req,void* at_rsp,int rsp_size,int timeout);
+
+/*
+* Set timer as microseconds.
+*/
+int mbtk_timer_set(mbtk_timer_alrm_func func,uint32 timeout_ms);
+
+/**
+* Clear current timer.
+*/
+int mbtk_timer_clear();
+
+int mbtk_get_kernel_cmdline(char *buf, int len);
+
+/** returns 1 if line starts with prefix, 0 if it does not */
+int strStartsWith(const char *line, const char *prefix);
+
+char* mbtk_time_text_get(char *buff, size_t buff_size);
+
+mbtk_byteorder_enum mbtk_byteorder_get();
+
+uint16 byte_2_uint16(const void *buff, bool big_endian);
+
+int uint16_2_byte(uint16 a, void *buff, bool big_endian);
+
+uint32 byte_2_uint32(const void *buff, bool big_endian);
+
+int uint32_2_byte(uint32 a, void *buff, bool big_endian);
+
+uint64 byte_2_uint64(const void *buff, bool big_endian);
+
+int uint64_2_byte(uint64 a, void *buff, bool big_endian);
+
+void* memdup(const void* data, int data_len);
+
+int app_already_running(const char *pid_file);
+
+void mbtk_system(const void* cmd);
+
+void mbtk_write(int fd,const void *buf, size_t len);
+
+void mbtk_read(int fd,void *buf, size_t len);
+
+void mbtk_close(int fd);
+
+int mbtk_band_2_list(uint32 band, int index, int band_list[]);
+
+uint32 mbtk_list_2_band(int band_list[]);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif /* _MBTK_UTILS_H */
diff --git a/mbtk/include/mbtk/mbtk_version.h b/mbtk/include/mbtk/mbtk_version.h
new file mode 100755
index 0000000..d6720d3
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_version.h
@@ -0,0 +1,31 @@
+/*
+* mbtk_version.h
+*
+* mbtk_source compilation informations.
+*
+* Author : lb
+* Date   : 2024/6/7 16:51:20
+*/
+#ifndef __MBTK_VERSION_H
+#define __MBTK_VERSION_H
+#include "mbtk_type.h"
+
+typedef enum {
+    MBTK_BUILD_DEF_AF_SUPPORT = 0,
+    MBTK_BUILD_DEF_YX_SUPPORT,
+    MBTK_BUILD_DEF_SG_SUPPORT,
+    MBTK_BUILD_DEF_MBTK_ALL_CID_SUPPORT,
+    MBTK_BUILD_DEF_MBTK_GNSS_MODE,
+    MBTK_BUILD_DEF_MBTK_DUMP_SUPPORT,
+
+    MBTK_BUILD_DEF_NUM
+} mbtk_build_define_enum;
+
+typedef struct {
+    char name[64];
+    char value[64];
+} mbtk_build_def_info_t;
+
+void mbtk_build_def_get(char *buff, int buff_len);
+
+#endif /* __MBTK_VERSION_H */
diff --git a/mbtk/include/mbtk/mbtk_wifi_ap.h b/mbtk/include/mbtk/mbtk_wifi_ap.h
new file mode 100755
index 0000000..3c5b53c
--- /dev/null
+++ b/mbtk/include/mbtk/mbtk_wifi_ap.h
@@ -0,0 +1,63 @@
+#include <stdio.h>

+#include <unistd.h>

+#include <string.h>

+

+

+#define SETTING_FILE			"/etc/wifi/hostapd.conf"	

+#define SETTING_LINE_MAX		64				

+#define SETTING_LINE_MAX_LEN		512				

+#define SETTING_KEY_MAX_LEN		64				

+#define SETTING_VALUE_MAX_LEN		190 

+#define SETTING_SPLIT_CHAR		'='	

+#define ACL_DENY_FILE "/etc/wifi/hostapd.deny"

+#define ACL_ACCEPT_FILE "/etc/wifi/hostapd.accept"

+#define DHCP_PATH "/tmp/dhcp.leases"

+#define DEF_INTERFACE "wlan0"

+

+

+

+

+typedef struct {

+unsigned long long rx_packets; 

+unsigned long long rx_bytes; 

+unsigned long long rx_errors; 

+unsigned long long rx_dropped; 

+unsigned long long tx_packets; 

+unsigned long long tx_bytes; 

+unsigned long long tx_errors; 

+unsigned long long tx_dropped; 

+} mbtk_wifi_pkt_stats_t;

+

+typedef struct

+{

+char addr[16];

+char macaddr[18]; 

+char name[20]; 

+char ifname[18]; 

+int uptime; 

+} mbtk_lanhost_t;

+

+

+typedef struct

+{

+ int array_len; 

+ mbtk_lanhost_t array[32]; 

+} mbtk_lanhost_ts;

+

+

+

+

+int mbtk_wifi_get_setting(const char *path, const char *key, char *value, int value_max_len);

+int mbtk_wifi_set_setting(const char *path, const char *key, const char *value);

+int mbtk_wifi_ap_start(void);

+int mbtk_wifi_ap_stop(void);

+int mbtk_wifi_set_file(const char *path, const char *value);

+int mbtk_wifi_get_file(const char *path, char *value, int value_max_len);

+int mbtk_wifi_get_pkt(mbtk_wifi_pkt_stats_t* pkt_stat);

+int mbtk_wifi_get_dhcp(mbtk_lanhost_ts* lanhost_arr);

+int mbkt_wifi_get_uptime(mbtk_lanhost_ts* lanhost_arr);

+

+

+

+

+

diff --git a/mbtk/include/mbtk/ringbuffer.h b/mbtk/include/mbtk/ringbuffer.h
new file mode 100755
index 0000000..dfe8b4c
--- /dev/null
+++ b/mbtk/include/mbtk/ringbuffer.h
@@ -0,0 +1,138 @@
+#include <inttypes.h>
+#include <stddef.h>
+#include <assert.h>
+/**
+ * @file
+ * Prototypes and structures for the ring buffer module.
+ */
+
+#ifndef RINGBUFFER_H
+#define RINGBUFFER_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define RING_BUFFER_ASSERT(x) assert(x)
+
+/**
+ * Checks if the buffer_size is a power of two.
+ * Due to the design only <tt> RING_BUFFER_SIZE-1 </tt> items
+ * can be contained in the buffer.
+ * buffer_size must be a power of two.
+*/
+#define RING_BUFFER_IS_POWER_OF_TWO(buffer_size) ((buffer_size & (buffer_size - 1)) == 0)
+
+/**
+ * The type which is used to hold the size
+ * and the indicies of the buffer.
+ */
+typedef size_t ring_buffer_size_t;
+
+/**
+ * Used as a modulo operator
+ * as <tt> a % b = (a & (b − 1)) </tt>
+ * where \c a is a positive index in the buffer and
+ * \c b is the (power of two) size of the buffer.
+ */
+#define RING_BUFFER_MASK(rb) (rb->buffer_mask)
+
+/**
+ * Simplifies the use of <tt>struct ring_buffer_t</tt>.
+ */
+typedef struct ring_buffer_t ring_buffer_t;
+
+/**
+ * Structure which holds a ring buffer.
+ * The buffer contains a buffer array
+ * as well as metadata for the ring buffer.
+ */
+struct ring_buffer_t {
+  /** Buffer memory. */
+  char *buffer;
+  /** Buffer mask. */
+  ring_buffer_size_t buffer_mask;
+  /** Index of tail. */
+  ring_buffer_size_t tail_index;
+  /** Index of head. */
+  ring_buffer_size_t head_index;
+};
+
+/**
+ * Initializes the ring buffer pointed to by <em>buffer</em>.
+ * This function can also be used to empty/reset the buffer.
+ * @param buffer The ring buffer to initialize.
+ * @param buf The buffer allocated for the ringbuffer.
+ * @param buf_size The size of the allocated ringbuffer.
+ */
+void ring_buffer_init(ring_buffer_t *buffer, char *buf, size_t buf_size);
+
+/**
+ * Adds a byte to a ring buffer.
+ * @param buffer The buffer in which the data should be placed.
+ * @param data The byte to place.
+ */
+void ring_buffer_queue(ring_buffer_t *buffer, char data);
+
+/**
+ * Adds an array of bytes to a ring buffer.
+ * @param buffer The buffer in which the data should be placed.
+ * @param data A pointer to the array of bytes to place in the queue.
+ * @param size The size of the array.
+ */
+void ring_buffer_queue_arr(ring_buffer_t *buffer, const char *data, ring_buffer_size_t size);
+
+/**
+ * Returns the oldest byte in a ring buffer.
+ * @param buffer The buffer from which the data should be returned.
+ * @param data A pointer to the location at which the data should be placed.
+ * @return 1 if data was returned; 0 otherwise.
+ */
+uint8_t ring_buffer_dequeue(ring_buffer_t *buffer, char *data);
+
+/**
+ * Returns the <em>len</em> oldest bytes in a ring buffer.
+ * @param buffer The buffer from which the data should be returned.
+ * @param data A pointer to the array at which the data should be placed.
+ * @param len The maximum number of bytes to return.
+ * @return The number of bytes returned.
+ */
+ring_buffer_size_t ring_buffer_dequeue_arr(ring_buffer_t *buffer, char *data, ring_buffer_size_t len);
+/**
+ * Peeks a ring buffer, i.e. returns an element without removing it.
+ * @param buffer The buffer from which the data should be returned.
+ * @param data A pointer to the location at which the data should be placed.
+ * @param index The index to peek.
+ * @return 1 if data was returned; 0 otherwise.
+ */
+uint8_t ring_buffer_peek(ring_buffer_t *buffer, char *data, ring_buffer_size_t index);
+
+
+/**
+ * Returns whether a ring buffer is empty.
+ * @param buffer The buffer for which it should be returned whether it is empty.
+ * @return 1 if empty; 0 otherwise.
+ */
+uint8_t ring_buffer_is_empty(ring_buffer_t *buffer);
+/**
+ * Returns whether a ring buffer is full.
+ * @param buffer The buffer for which it should be returned whether it is full.
+ * @return 1 if full; 0 otherwise.
+ */
+uint8_t ring_buffer_is_full(ring_buffer_t *buffer);
+
+/**
+ * Returns the number of items in a ring buffer.
+ * @param buffer The buffer for which the number of items should be returned.
+ * @return The number of items in the ring buffer.
+ */
+ring_buffer_size_t ring_buffer_num_items(ring_buffer_t *buffer);
+
+void ring_buffer_clean(ring_buffer_t *buffer);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RINGBUFFER_H */
diff --git a/mbtk/include/mbtk/sta_cli.h b/mbtk/include/mbtk/sta_cli.h
new file mode 100755
index 0000000..f63c407
--- /dev/null
+++ b/mbtk/include/mbtk/sta_cli.h
@@ -0,0 +1,42 @@
+#ifndef STA_CLI_INCLUDE

+#define STA_CLI_INCLUDE

+#include <stdio.h>

+#include <stdbool.h>

+

+typedef enum

+{

+    CMD_ID_NON = 0,

+    CMD_ID_SCAN,

+    CMD_ID_SCAN_RESULTS,

+    CMD_ID_STATUS,

+    CMD_ID_MIB,

+    CMD_ID_RECONFIGURE,

+    CMD_ID_DISCONNECT,

+    CMD_ID_RECONNECT,

+    CMD_ID_SAVE_CONFIG,

+    CMD_ID_GET_NETWORK,

+    CMD_ID_SET_NETWORK,

+    CMD_ID_REMOVE_NETWORK,

+    CMD_ID_ADD_NETWORK,

+    CMD_ID_DISABLE_NETWORK,

+    CMD_ID_ENABLE_NETWORK,

+    CMD_ID_SELECT_NETWORK,

+    CMD_ID_LIST_NETWORKS,

+    CMD_ID_REASSOCIATE,

+    CMD_ID_REATTACH

+}sta_cli_cmd_id_enum;

+

+bool sta_cli_cmd_parse

+(

+    const char *cmd,

+    char *reply,

+    size_t reply_len

+);

+

+int sta_cli_ssid_get(char *ssid);

+int sta_cli_psk_get(char *psk);

+int sta_cli_ssid_set(char *ssid);

+int sta_cli_psk_set(char *psk);

+

+

+#endif /* STA_CLI_INCLUDE */
\ No newline at end of file
diff --git a/mbtk/include/mbtk/sta_ctrl.h b/mbtk/include/mbtk/sta_ctrl.h
new file mode 100755
index 0000000..ae25c99
--- /dev/null
+++ b/mbtk/include/mbtk/sta_ctrl.h
@@ -0,0 +1,43 @@
+#ifndef STA_CTRL_INCLUDE

+#define STA_CTRL_INCLUDE

+

+#include "mbtk_type.h"

+

+#define STA_BUF_SIZE 2048

+

+typedef enum{

+    STA_ERR_SUCCESS,

+    STA_ERR_DRIVER,

+    STA_ERR_TIMEOUT,

+    STA_ERR_UNKNOWN

+} sta_err_enum;

+

+typedef void (*sta_ctrl_msg_cb)(char*);

+

+sta_err_enum

+sta_ctrl_cmd_process

+(

+    const char *cmd,

+    char *cmd_rsp,

+    size_t rsp_len

+);

+

+sta_err_enum

+sta_ctrl_driver_init(bool open);

+

+sta_err_enum

+sta_ctrl_wpa_init

+(

+    const char *conf_file,

+    const char *interface,

+    sta_ctrl_msg_cb cb

+);

+

+sta_err_enum

+sta_ctrl_wpa_deinit

+(

+    void

+);

+

+#endif /* STA_CTRL_INCLUDE */

+

diff --git a/mbtk/include/mbtk/wpa_ctrl.h b/mbtk/include/mbtk/wpa_ctrl.h
new file mode 100755
index 0000000..ee6f6de
--- /dev/null
+++ b/mbtk/include/mbtk/wpa_ctrl.h
@@ -0,0 +1,415 @@
+/*

+ * wpa_supplicant/hostapd control interface library

+ * Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi>

+ *

+ * This software may be distributed under the terms of the BSD license.

+ * See README for more details.

+ */

+

+#ifndef WPA_CTRL_H

+#define WPA_CTRL_H

+

+#ifdef  __cplusplus

+extern "C" {

+#endif

+

+/* wpa_supplicant control interface - fixed message prefixes */

+

+/** Interactive request for identity/password/pin */

+#define WPA_CTRL_REQ "CTRL-REQ-"

+

+/** Response to identity/password/pin request */

+#define WPA_CTRL_RSP "CTRL-RSP-"

+

+/* Event messages with fixed prefix */

+/** Authentication completed successfully and data connection enabled */

+#define WPA_EVENT_CONNECTED "CTRL-EVENT-CONNECTED "

+/** Disconnected, data connection is not available */

+#define WPA_EVENT_DISCONNECTED "CTRL-EVENT-DISCONNECTED "

+/** Association rejected during connection attempt */

+#define WPA_EVENT_ASSOC_REJECT "CTRL-EVENT-ASSOC-REJECT "

+/** wpa_supplicant is exiting */

+#define WPA_EVENT_TERMINATING "CTRL-EVENT-TERMINATING "

+/** Password change was completed successfully */

+#define WPA_EVENT_PASSWORD_CHANGED "CTRL-EVENT-PASSWORD-CHANGED "

+/** EAP-Request/Notification received */

+#define WPA_EVENT_EAP_NOTIFICATION "CTRL-EVENT-EAP-NOTIFICATION "

+/** EAP authentication started (EAP-Request/Identity received) */

+#define WPA_EVENT_EAP_STARTED "CTRL-EVENT-EAP-STARTED "

+/** EAP method proposed by the server */

+#define WPA_EVENT_EAP_PROPOSED_METHOD "CTRL-EVENT-EAP-PROPOSED-METHOD "

+/** EAP method selected */

+#define WPA_EVENT_EAP_METHOD "CTRL-EVENT-EAP-METHOD "

+/** EAP peer certificate from TLS */

+#define WPA_EVENT_EAP_PEER_CERT "CTRL-EVENT-EAP-PEER-CERT "

+/** EAP TLS certificate chain validation error */

+#define WPA_EVENT_EAP_TLS_CERT_ERROR "CTRL-EVENT-EAP-TLS-CERT-ERROR "

+/** EAP status */

+#define WPA_EVENT_EAP_STATUS "CTRL-EVENT-EAP-STATUS "

+/** EAP authentication completed successfully */

+#define WPA_EVENT_EAP_SUCCESS "CTRL-EVENT-EAP-SUCCESS "

+/** EAP authentication failed (EAP-Failure received) */

+#define WPA_EVENT_EAP_FAILURE "CTRL-EVENT-EAP-FAILURE "

+/** Network block temporarily disabled (e.g., due to authentication failure) */

+#define WPA_EVENT_TEMP_DISABLED "CTRL-EVENT-SSID-TEMP-DISABLED "

+/** Temporarily disabled network block re-enabled */

+#define WPA_EVENT_REENABLED "CTRL-EVENT-SSID-REENABLED "

+/** New scan started */

+#define WPA_EVENT_SCAN_STARTED "CTRL-EVENT-SCAN-STARTED "

+/** New scan results available */

+#define WPA_EVENT_SCAN_RESULTS "CTRL-EVENT-SCAN-RESULTS "

+/** Scan command failed */

+#define WPA_EVENT_SCAN_FAILED "CTRL-EVENT-SCAN-FAILED "

+/** wpa_supplicant state change */

+#define WPA_EVENT_STATE_CHANGE "CTRL-EVENT-STATE-CHANGE "

+/** A new BSS entry was added (followed by BSS entry id and BSSID) */

+#define WPA_EVENT_BSS_ADDED "CTRL-EVENT-BSS-ADDED "

+/** A BSS entry was removed (followed by BSS entry id and BSSID) */

+#define WPA_EVENT_BSS_REMOVED "CTRL-EVENT-BSS-REMOVED "

+/** Change in the signal level was reported by the driver */

+#define WPA_EVENT_SIGNAL_CHANGE "CTRL-EVENT-SIGNAL-CHANGE "

+/** Regulatory domain channel */

+#define WPA_EVENT_REGDOM_CHANGE "CTRL-EVENT-REGDOM-CHANGE "

+

+/** RSN IBSS 4-way handshakes completed with specified peer */

+#define IBSS_RSN_COMPLETED "IBSS-RSN-COMPLETED "

+

+/** Notification of frequency conflict due to a concurrent operation.

+ *

+ * The indicated network is disabled and needs to be re-enabled before it can

+ * be used again.

+ */

+#define WPA_EVENT_FREQ_CONFLICT "CTRL-EVENT-FREQ-CONFLICT "

+/** Frequency ranges that the driver recommends to avoid */

+#define WPA_EVENT_AVOID_FREQ "CTRL-EVENT-AVOID-FREQ "

+/** WPS overlap detected in PBC mode */

+#define WPS_EVENT_OVERLAP "WPS-OVERLAP-DETECTED "

+/** Available WPS AP with active PBC found in scan results */

+#define WPS_EVENT_AP_AVAILABLE_PBC "WPS-AP-AVAILABLE-PBC "

+/** Available WPS AP with our address as authorized in scan results */

+#define WPS_EVENT_AP_AVAILABLE_AUTH "WPS-AP-AVAILABLE-AUTH "

+/** Available WPS AP with recently selected PIN registrar found in scan results

+ */

+#define WPS_EVENT_AP_AVAILABLE_PIN "WPS-AP-AVAILABLE-PIN "

+/** Available WPS AP found in scan results */

+#define WPS_EVENT_AP_AVAILABLE "WPS-AP-AVAILABLE "

+/** A new credential received */

+#define WPS_EVENT_CRED_RECEIVED "WPS-CRED-RECEIVED "

+/** M2D received */

+#define WPS_EVENT_M2D "WPS-M2D "

+/** WPS registration failed after M2/M2D */

+#define WPS_EVENT_FAIL "WPS-FAIL "

+/** WPS registration completed successfully */

+#define WPS_EVENT_SUCCESS "WPS-SUCCESS "

+/** WPS enrollment attempt timed out and was terminated */

+#define WPS_EVENT_TIMEOUT "WPS-TIMEOUT "

+/* PBC mode was activated */

+#define WPS_EVENT_ACTIVE "WPS-PBC-ACTIVE "

+/* PBC mode was disabled */

+#define WPS_EVENT_DISABLE "WPS-PBC-DISABLE "

+

+#define WPS_EVENT_ENROLLEE_SEEN "WPS-ENROLLEE-SEEN "

+

+#define WPS_EVENT_OPEN_NETWORK "WPS-OPEN-NETWORK "

+

+/* WPS ER events */

+#define WPS_EVENT_ER_AP_ADD "WPS-ER-AP-ADD "

+#define WPS_EVENT_ER_AP_REMOVE "WPS-ER-AP-REMOVE "

+#define WPS_EVENT_ER_ENROLLEE_ADD "WPS-ER-ENROLLEE-ADD "

+#define WPS_EVENT_ER_ENROLLEE_REMOVE "WPS-ER-ENROLLEE-REMOVE "

+#define WPS_EVENT_ER_AP_SETTINGS "WPS-ER-AP-SETTINGS "

+#define WPS_EVENT_ER_SET_SEL_REG "WPS-ER-AP-SET-SEL-REG "

+

+/** P2P device found */

+#define P2P_EVENT_DEVICE_FOUND "P2P-DEVICE-FOUND "

+

+/** P2P device lost */

+#define P2P_EVENT_DEVICE_LOST "P2P-DEVICE-LOST "

+

+/** A P2P device requested GO negotiation, but we were not ready to start the

+ * negotiation */

+#define P2P_EVENT_GO_NEG_REQUEST "P2P-GO-NEG-REQUEST "

+#define P2P_EVENT_GO_NEG_SUCCESS "P2P-GO-NEG-SUCCESS "

+#define P2P_EVENT_GO_NEG_FAILURE "P2P-GO-NEG-FAILURE "

+#define P2P_EVENT_GROUP_FORMATION_SUCCESS "P2P-GROUP-FORMATION-SUCCESS "

+#define P2P_EVENT_GROUP_FORMATION_FAILURE "P2P-GROUP-FORMATION-FAILURE "

+#define P2P_EVENT_GROUP_STARTED "P2P-GROUP-STARTED "

+#define P2P_EVENT_GROUP_REMOVED "P2P-GROUP-REMOVED "

+#define P2P_EVENT_CROSS_CONNECT_ENABLE "P2P-CROSS-CONNECT-ENABLE "

+#define P2P_EVENT_CROSS_CONNECT_DISABLE "P2P-CROSS-CONNECT-DISABLE "

+/* parameters: <peer address> <PIN> */

+#define P2P_EVENT_PROV_DISC_SHOW_PIN "P2P-PROV-DISC-SHOW-PIN "

+/* parameters: <peer address> */

+#define P2P_EVENT_PROV_DISC_ENTER_PIN "P2P-PROV-DISC-ENTER-PIN "

+/* parameters: <peer address> */

+#define P2P_EVENT_PROV_DISC_PBC_REQ "P2P-PROV-DISC-PBC-REQ "

+/* parameters: <peer address> */

+#define P2P_EVENT_PROV_DISC_PBC_RESP "P2P-PROV-DISC-PBC-RESP "

+/* parameters: <peer address> <status> */

+#define P2P_EVENT_PROV_DISC_FAILURE "P2P-PROV-DISC-FAILURE"

+/* parameters: <freq> <src addr> <dialog token> <update indicator> <TLVs> */

+#define P2P_EVENT_SERV_DISC_REQ "P2P-SERV-DISC-REQ "

+/* parameters: <src addr> <update indicator> <TLVs> */

+#define P2P_EVENT_SERV_DISC_RESP "P2P-SERV-DISC-RESP "

+#define P2P_EVENT_INVITATION_RECEIVED "P2P-INVITATION-RECEIVED "

+#define P2P_EVENT_INVITATION_RESULT "P2P-INVITATION-RESULT "

+#define P2P_EVENT_FIND_STOPPED "P2P-FIND-STOPPED "

+#define P2P_EVENT_PERSISTENT_PSK_FAIL "P2P-PERSISTENT-PSK-FAIL id="

+#define P2P_EVENT_PRESENCE_RESPONSE "P2P-PRESENCE-RESPONSE "

+#define P2P_EVENT_NFC_BOTH_GO "P2P-NFC-BOTH-GO "

+#define P2P_EVENT_NFC_PEER_CLIENT "P2P-NFC-PEER-CLIENT "

+#define P2P_EVENT_NFC_WHILE_CLIENT "P2P-NFC-WHILE-CLIENT "

+

+/* parameters: <PMF enabled> <timeout in ms> <Session Information URL> */

+#define ESS_DISASSOC_IMMINENT "ESS-DISASSOC-IMMINENT "

+#define P2P_EVENT_REMOVE_AND_REFORM_GROUP "P2P-REMOVE-AND-REFORM-GROUP "

+

+#define INTERWORKING_AP "INTERWORKING-AP "

+#define INTERWORKING_BLACKLISTED "INTERWORKING-BLACKLISTED "

+#define INTERWORKING_NO_MATCH "INTERWORKING-NO-MATCH "

+#define INTERWORKING_ALREADY_CONNECTED "INTERWORKING-ALREADY-CONNECTED "

+#define INTERWORKING_SELECTED "INTERWORKING-SELECTED "

+

+/* Credential block added; parameters: <id> */

+#define CRED_ADDED "CRED-ADDED "

+/* Credential block modified; parameters: <id> <field> */

+#define CRED_MODIFIED "CRED-MODIFIED "

+/* Credential block removed; parameters: <id> */

+#define CRED_REMOVED "CRED-REMOVED "

+

+#define GAS_RESPONSE_INFO "GAS-RESPONSE-INFO "

+/* parameters: <addr> <dialog_token> <freq> */

+#define GAS_QUERY_START "GAS-QUERY-START "

+/* parameters: <addr> <dialog_token> <freq> <status_code> <result> */

+#define GAS_QUERY_DONE "GAS-QUERY-DONE "

+

+#define HS20_SUBSCRIPTION_REMEDIATION "HS20-SUBSCRIPTION-REMEDIATION "

+#define HS20_DEAUTH_IMMINENT_NOTICE "HS20-DEAUTH-IMMINENT-NOTICE "

+

+#define EXT_RADIO_WORK_START "EXT-RADIO-WORK-START "

+#define EXT_RADIO_WORK_TIMEOUT "EXT-RADIO-WORK-TIMEOUT "

+

+/* hostapd control interface - fixed message prefixes */

+#define WPS_EVENT_PIN_NEEDED "WPS-PIN-NEEDED "

+#define WPS_EVENT_NEW_AP_SETTINGS "WPS-NEW-AP-SETTINGS "

+#define WPS_EVENT_REG_SUCCESS "WPS-REG-SUCCESS "

+#define WPS_EVENT_AP_SETUP_LOCKED "WPS-AP-SETUP-LOCKED "

+#define WPS_EVENT_AP_SETUP_UNLOCKED "WPS-AP-SETUP-UNLOCKED "

+#define WPS_EVENT_AP_PIN_ENABLED "WPS-AP-PIN-ENABLED "

+#define WPS_EVENT_AP_PIN_DISABLED "WPS-AP-PIN-DISABLED "

+#define AP_STA_CONNECTED "AP-STA-CONNECTED "

+#define AP_STA_DISCONNECTED "AP-STA-DISCONNECTED "

+

+#define AP_REJECTED_MAX_STA "AP-REJECTED-MAX-STA "

+#define AP_REJECTED_BLOCKED_STA "AP-REJECTED-BLOCKED-STA "

+

+#define AP_EVENT_ENABLED "AP-ENABLED "

+#define AP_EVENT_DISABLED "AP-DISABLED "

+

+#define ACS_EVENT_STARTED "ACS-STARTED "

+#define ACS_EVENT_COMPLETED "ACS-COMPLETED "

+#define ACS_EVENT_FAILED "ACS-FAILED "

+

+#define DFS_EVENT_RADAR_DETECTED "DFS-RADAR-DETECTED "

+#define DFS_EVENT_NEW_CHANNEL "DFS-NEW-CHANNEL "

+#define DFS_EVENT_CAC_START "DFS-CAC-START "

+#define DFS_EVENT_CAC_COMPLETED "DFS-CAC-COMPLETED "

+#define DFS_EVENT_NOP_FINISHED "DFS-NOP-FINISHED "

+

+#define AP_CSA_FINISHED "AP-CSA-FINISHED "

+

+/* BSS command information masks */

+

+#define WPA_BSS_MASK_ALL		0xFFFDFFFF

+#define WPA_BSS_MASK_ID			BIT(0)

+#define WPA_BSS_MASK_BSSID		BIT(1)

+#define WPA_BSS_MASK_FREQ		BIT(2)

+#define WPA_BSS_MASK_BEACON_INT		BIT(3)

+#define WPA_BSS_MASK_CAPABILITIES	BIT(4)

+#define WPA_BSS_MASK_QUAL		BIT(5)

+#define WPA_BSS_MASK_NOISE		BIT(6)

+#define WPA_BSS_MASK_LEVEL		BIT(7)

+#define WPA_BSS_MASK_TSF		BIT(8)

+#define WPA_BSS_MASK_AGE		BIT(9)

+#define WPA_BSS_MASK_IE			BIT(10)

+#define WPA_BSS_MASK_FLAGS		BIT(11)

+#define WPA_BSS_MASK_SSID		BIT(12)

+#define WPA_BSS_MASK_WPS_SCAN		BIT(13)

+#define WPA_BSS_MASK_P2P_SCAN		BIT(14)

+#define WPA_BSS_MASK_INTERNETW		BIT(15)

+#define WPA_BSS_MASK_WIFI_DISPLAY	BIT(16)

+#define WPA_BSS_MASK_DELIM		BIT(17)

+#define WPA_BSS_MASK_FST		BIT(21)

+

+

+/* VENDOR_ELEM_* frame id values */

+enum wpa_vendor_elem_frame {

+	VENDOR_ELEM_PROBE_REQ_P2P = 0,

+	VENDOR_ELEM_PROBE_RESP_P2P = 1,

+	VENDOR_ELEM_PROBE_RESP_P2P_GO = 2,

+	VENDOR_ELEM_BEACON_P2P_GO = 3,

+	VENDOR_ELEM_P2P_PD_REQ = 4,

+	VENDOR_ELEM_P2P_PD_RESP = 5,

+	VENDOR_ELEM_P2P_GO_NEG_REQ = 6,

+	VENDOR_ELEM_P2P_GO_NEG_RESP = 7,

+	VENDOR_ELEM_P2P_GO_NEG_CONF = 8,

+	VENDOR_ELEM_P2P_INV_REQ = 9,

+	VENDOR_ELEM_P2P_INV_RESP = 10,

+	VENDOR_ELEM_P2P_ASSOC_REQ = 11,

+	VENDOR_ELEM_P2P_ASSOC_RESP = 12,

+	NUM_VENDOR_ELEM_FRAMES

+};

+

+

+/* wpa_supplicant/hostapd control interface access */

+

+/**

+ * wpa_ctrl_open - Open a control interface to wpa_supplicant/hostapd

+ * @ctrl_path: Path for UNIX domain sockets; ignored if UDP sockets are used.

+ * Returns: Pointer to abstract control interface data or %NULL on failure

+ *

+ * This function is used to open a control interface to wpa_supplicant/hostapd.

+ * ctrl_path is usually /var/run/wpa_supplicant or /var/run/hostapd. This path

+ * is configured in wpa_supplicant/hostapd and other programs using the control

+ * interface need to use matching path configuration.

+ */

+struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);

+

+

+/**

+ * wpa_ctrl_close - Close a control interface to wpa_supplicant/hostapd

+ * @ctrl: Control interface data from wpa_ctrl_open()

+ *

+ * This function is used to close a control interface.

+ */

+void wpa_ctrl_close(struct wpa_ctrl *ctrl);

+

+

+/**

+ * wpa_ctrl_request - Send a command to wpa_supplicant/hostapd

+ * @ctrl: Control interface data from wpa_ctrl_open()

+ * @cmd: Command; usually, ASCII text, e.g., "PING"

+ * @cmd_len: Length of the cmd in bytes

+ * @reply: Buffer for the response

+ * @reply_len: Reply buffer length

+ * @msg_cb: Callback function for unsolicited messages or %NULL if not used

+ * Returns: 0 on success, -1 on error (send or receive failed), -2 on timeout

+ *

+ * This function is used to send commands to wpa_supplicant/hostapd. Received

+ * response will be written to reply and reply_len is set to the actual length

+ * of the reply. This function will block for up to two seconds while waiting

+ * for the reply. If unsolicited messages are received, the blocking time may

+ * be longer.

+ *

+ * msg_cb can be used to register a callback function that will be called for

+ * unsolicited messages received while waiting for the command response. These

+ * messages may be received if wpa_ctrl_request() is called at the same time as

+ * wpa_supplicant/hostapd is sending such a message. This can happen only if

+ * the program has used wpa_ctrl_attach() to register itself as a monitor for

+ * event messages. Alternatively to msg_cb, programs can register two control

+ * interface connections and use one of them for commands and the other one for

+ * receiving event messages, in other words, call wpa_ctrl_attach() only for

+ * the control interface connection that will be used for event messages.

+ */

+int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,

+		     char *reply, size_t *reply_len,

+		     void (*msg_cb)(char *msg, size_t len));

+

+

+/**

+ * wpa_ctrl_attach - Register as an event monitor for the control interface

+ * @ctrl: Control interface data from wpa_ctrl_open()

+ * Returns: 0 on success, -1 on failure, -2 on timeout

+ *

+ * This function registers the control interface connection as a monitor for

+ * wpa_supplicant/hostapd events. After a success wpa_ctrl_attach() call, the

+ * control interface connection starts receiving event messages that can be

+ * read with wpa_ctrl_recv().

+ */

+int wpa_ctrl_attach(struct wpa_ctrl *ctrl);

+

+

+/**

+ * wpa_ctrl_detach - Unregister event monitor from the control interface

+ * @ctrl: Control interface data from wpa_ctrl_open()

+ * Returns: 0 on success, -1 on failure, -2 on timeout

+ *

+ * This function unregisters the control interface connection as a monitor for

+ * wpa_supplicant/hostapd events, i.e., cancels the registration done with

+ * wpa_ctrl_attach().

+ */

+int wpa_ctrl_detach(struct wpa_ctrl *ctrl);

+

+

+/**

+ * wpa_ctrl_recv - Receive a pending control interface message

+ * @ctrl: Control interface data from wpa_ctrl_open()

+ * @reply: Buffer for the message data

+ * @reply_len: Length of the reply buffer

+ * Returns: 0 on success, -1 on failure

+ *

+ * This function will receive a pending control interface message. The received

+ * response will be written to reply and reply_len is set to the actual length

+ * of the reply.

+

+ * wpa_ctrl_recv() is only used for event messages, i.e., wpa_ctrl_attach()

+ * must have been used to register the control interface as an event monitor.

+ */

+int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);

+

+

+/**

+ * wpa_ctrl_pending - Check whether there are pending event messages

+ * @ctrl: Control interface data from wpa_ctrl_open()

+ * Returns: 1 if there are pending messages, 0 if no, or -1 on error

+ *

+ * This function will check whether there are any pending control interface

+ * message available to be received with wpa_ctrl_recv(). wpa_ctrl_pending() is

+ * only used for event messages, i.e., wpa_ctrl_attach() must have been used to

+ * register the control interface as an event monitor.

+ */

+int wpa_ctrl_pending(struct wpa_ctrl *ctrl);

+

+

+/**

+ * wpa_ctrl_get_fd - Get file descriptor used by the control interface

+ * @ctrl: Control interface data from wpa_ctrl_open()

+ * Returns: File descriptor used for the connection

+ *

+ * This function can be used to get the file descriptor that is used for the

+ * control interface connection. The returned value can be used, e.g., with

+ * select() while waiting for multiple events.

+ *

+ * The returned file descriptor must not be used directly for sending or

+ * receiving packets; instead, the library functions wpa_ctrl_request() and

+ * wpa_ctrl_recv() must be used for this.

+ */

+int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl);

+

+char * wpa_ctrl_get_remote_ifname(struct wpa_ctrl *ctrl);

+

+#ifdef ANDROID

+/**

+ * wpa_ctrl_cleanup() - Delete any local UNIX domain socket files that

+ * may be left over from clients that were previously connected to

+ * wpa_supplicant. This keeps these files from being orphaned in the

+ * event of crashes that prevented them from being removed as part

+ * of the normal orderly shutdown.

+ */

+void wpa_ctrl_cleanup(void);

+#endif /* ANDROID */

+

+#ifdef CONFIG_CTRL_IFACE_UDP

+/* Port range for multiple wpa_supplicant instances and multiple VIFs */

+#define WPA_CTRL_IFACE_PORT 9877

+#define WPA_CTRL_IFACE_PORT_LIMIT 50 /* decremented from start */

+#define WPA_GLOBAL_CTRL_IFACE_PORT 9878

+#define WPA_GLOBAL_CTRL_IFACE_PORT_LIMIT 20 /* incremented from start */

+#endif /* CONFIG_CTRL_IFACE_UDP */

+

+

+#ifdef  __cplusplus

+}

+#endif

+

+#endif /* WPA_CTRL_H */

diff --git a/mbtk/include/mbtk_device_info.h b/mbtk/include/mbtk_device_info.h
new file mode 100755
index 0000000..f03303a
--- /dev/null
+++ b/mbtk/include/mbtk_device_info.h
@@ -0,0 +1,17 @@
+/*
+* MBTK Device Information Define Header.
+*
+* Author : lb
+* Date   : 2021/11/5 17:40:29
+*
+*/
+#ifndef MBTK_DEVICES_INFO_H
+#define MBTK_DEVICES_INFO_H
+
+#define MBTK_DEVICES_MANUFACTURER "LYNQ"
+
+#define MBTK_DEVICES_MODEL "LYNQ_T108"
+
+#define MBTK_DEVICES_REVISION "T108v05.04b01_V2.00"
+
+#endif /* MBTK_DEVICES_INFO_H */
diff --git a/mbtk/include/mqtt/MQTTClient.h b/mbtk/include/mqtt/MQTTClient.h
new file mode 100755
index 0000000..890a11b
--- /dev/null
+++ b/mbtk/include/mqtt/MQTTClient.h
@@ -0,0 +1,100 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Allan Stockdill-Mander/Ian Craggs - initial API and implementation and/or initial documentation

+ *******************************************************************************/

+

+#ifndef __MQTT_CLIENT_C_

+#define __MQTT_CLIENT_C_

+

+#include "MQTTPacket.h"

+#include "stdio.h"

+#include "MQTTLinux.h" 

+

+#define MAX_PACKET_ID 65535

+#define MAX_MESSAGE_HANDLERS 5

+#define MAX_FAIL_ALLOWED  2

+

+enum QoS { QOS0, QOS1, QOS2 };

+

+// all failure return codes must be negative

+enum returnCode {DISCONNECTED = -3,  BUFFER_OVERFLOW = -2, FAILURE = -1, SUCCESS = 0 };

+

+void NewTimer(Timer*);

+

+typedef struct MQTTMessage MQTTMessage;

+

+typedef struct MessageData MessageData;

+

+struct MQTTMessage

+{

+    enum QoS qos;

+    char retained;

+    char dup;

+    unsigned short id;

+    void *payload;

+    size_t payloadlen;

+};

+

+struct MessageData

+{

+    MQTTMessage* message;

+    MQTTString* topicName;

+};

+

+typedef struct {

+    char clientId[255];

+    char deviceToken[255];

+} regnwl_info_t;

+

+typedef void (*messageHandler)(MessageData*);

+

+typedef struct Client Client;

+

+int MQTTConnect (Client*, MQTTPacket_connectData*);

+int MQTTPublish (Client*, const char*, MQTTMessage*);

+int MQTTSubscribe (Client*, const char*, enum QoS, messageHandler);

+int MQTTUnsubscribe (Client*, const char*);

+int MQTTDisconnect (Client*,Network*);

+int MQTTYield (Client*, int);

+

+void setDefaultMessageHandler(Client*, messageHandler);

+

+void MQTTClient(Client*, Network*, unsigned int, unsigned char*, size_t, unsigned char*, size_t);

+

+struct Client {

+    unsigned int next_packetid;

+    unsigned int command_timeout_ms;

+    size_t buf_size, readbuf_size;

+    unsigned char *buf;  

+    unsigned char *readbuf; 

+    unsigned int keepAliveInterval;

+    char ping_outstanding;

+    int fail_count;

+    int isconnected;

+

+    struct MessageHandlers

+    {

+        const char* topicFilter;

+        void (*fp) (MessageData*);

+    } messageHandlers[MAX_MESSAGE_HANDLERS];      // Message handlers are indexed by subscription topic

+    

+    void (*defaultMessageHandler) (MessageData*);

+    

+    Network* ipstack;

+    Timer ping_timer;

+};

+

+#define DefaultClient {0, 0, 0, 0, NULL, NULL, 0, 0, 0}

+

+#endif

diff --git a/mbtk/include/mqtt/MQTTConnect.h b/mbtk/include/mqtt/MQTTConnect.h
new file mode 100755
index 0000000..d77f18c
--- /dev/null
+++ b/mbtk/include/mqtt/MQTTConnect.h
@@ -0,0 +1,136 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Ian Craggs - initial API and implementation and/or initial documentation

+ *    Xiang Rong - 442039 Add makefile to Embedded C client

+ *******************************************************************************/

+

+#ifndef MQTTCONNECT_H_

+#define MQTTCONNECT_H_

+

+#if !defined(DLLImport)

+  #define DLLImport 

+#endif

+#if !defined(DLLExport)

+  #define DLLExport

+#endif

+

+

+typedef union

+{

+	unsigned char all;	/**< all connect flags */

+#if defined(REVERSED)

+	struct

+	{

+		unsigned int username : 1;			/**< 3.1 user name */

+		unsigned int password : 1; 			/**< 3.1 password */

+		unsigned int willRetain : 1;		/**< will retain setting */

+		unsigned int willQoS : 2;				/**< will QoS value */

+		unsigned int will : 1;			    /**< will flag */

+		unsigned int cleansession : 1;	  /**< clean session flag */

+		unsigned int : 1;	  	          /**< unused */

+	} bits;

+#else

+	struct

+	{

+		unsigned int : 1;	     					/**< unused */

+		unsigned int cleansession : 1;	  /**< cleansession flag */

+		unsigned int will : 1;			    /**< will flag */

+		unsigned int willQoS : 2;				/**< will QoS value */

+		unsigned int willRetain : 1;		/**< will retain setting */

+		unsigned int password : 1; 			/**< 3.1 password */

+		unsigned int username : 1;			/**< 3.1 user name */

+	} bits;

+#endif

+} MQTTConnectFlags;	/**< connect flags byte */

+

+

+

+/**

+ * Defines the MQTT "Last Will and Testament" (LWT) settings for

+ * the connect packet.

+ */

+typedef struct

+{

+	/** The eyecatcher for this structure.  must be MQTW. */

+	char struct_id[4];

+	/** The version number of this structure.  Must be 0 */

+	int struct_version;

+	/** The LWT topic to which the LWT message will be published. */

+	MQTTString topicName;

+	/** The LWT payload. */

+	MQTTString message;

+	/**

+      * The retained flag for the LWT message (see MQTTAsync_message.retained).

+      */

+	unsigned char retained;

+	/**

+      * The quality of service setting for the LWT message (see

+      * MQTTAsync_message.qos and @ref qos).

+      */

+	char qos;

+} MQTTPacket_willOptions;

+

+

+#define MQTTPacket_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 0, {NULL, {0, NULL}}, {NULL, {0, NULL}}, 0, 0 }

+

+

+typedef struct

+{

+	/** The eyecatcher for this structure.  must be MQTC. */

+	char struct_id[4];

+	/** The version number of this structure.  Must be 0 */

+	int struct_version;

+	/** Version of MQTT to be used.  3 = 3.1 4 = 3.1.1

+	  */

+	unsigned char MQTTVersion;

+	MQTTString clientID;

+	unsigned short keepAliveInterval;

+	unsigned char cleansession;

+	unsigned char willFlag;

+	MQTTPacket_willOptions will;

+	MQTTString username;

+	MQTTString password;

+} MQTTPacket_connectData;

+

+typedef union

+{

+	unsigned char all;	/**< all connack flags */

+#if defined(REVERSED)

+	struct

+	{

+		unsigned int sessionpresent : 1;    /**< session present flag */

+		unsigned int : 7;	  	          /**< unused */

+	} bits;

+#else

+	struct

+	{

+		unsigned int : 7;	     			/**< unused */

+		unsigned int sessionpresent : 1;    /**< session present flag */

+	} bits;

+#endif

+} MQTTConnackFlags;	/**< connack flags byte */

+

+#define MQTTPacket_connectData_initializer { {'M', 'Q', 'T', 'C'}, 0, 4, {NULL, {0, NULL}}, 60, 1, 0, \

+		MQTTPacket_willOptions_initializer, {NULL, {0, NULL}}, {NULL, {0, NULL}} }

+

+DLLExport int MQTTSerialize_connect(unsigned char* buf, int buflen, MQTTPacket_connectData* options);

+DLLExport int MQTTDeserialize_connect(MQTTPacket_connectData* data, unsigned char* buf, int len);

+

+DLLExport int MQTTSerialize_connack(unsigned char* buf, int buflen, unsigned char connack_rc, unsigned char sessionPresent);

+DLLExport int MQTTDeserialize_connack(unsigned char* sessionPresent, unsigned char* connack_rc, unsigned char* buf, int buflen);

+

+DLLExport int MQTTSerialize_disconnect(unsigned char* buf, int buflen);

+DLLExport int MQTTSerialize_pingreq(unsigned char* buf, int buflen);

+

+#endif /* MQTTCONNECT_H_ */

diff --git a/mbtk/include/mqtt/MQTTFormat.h b/mbtk/include/mqtt/MQTTFormat.h
new file mode 100755
index 0000000..f7bd0d1
--- /dev/null
+++ b/mbtk/include/mqtt/MQTTFormat.h
@@ -0,0 +1,37 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Ian Craggs - initial API and implementation and/or initial documentation

+ *******************************************************************************/

+

+#if !defined(MQTTFORMAT_H)

+#define MQTTFORMAT_H

+

+#include "StackTrace.h"

+#include "MQTTPacket.h"

+

+const char* MQTTPacket_getName(unsigned short packetid);

+int MQTTStringFormat_connect(char* strbuf, int strbuflen, MQTTPacket_connectData* data);

+int MQTTStringFormat_connack(char* strbuf, int strbuflen, unsigned char connack_rc, unsigned char sessionPresent);

+int MQTTStringFormat_publish(char* strbuf, int strbuflen, unsigned char dup, int qos, unsigned char retained,

+		unsigned short packetid, MQTTString topicName, unsigned char* payload, int payloadlen);

+int MQTTStringFormat_ack(char* strbuf, int strbuflen, unsigned char packettype, unsigned char dup, unsigned short packetid);

+int MQTTStringFormat_subscribe(char* strbuf, int strbuflen, unsigned char dup, unsigned short packetid, int count,

+		MQTTString topicFilters[], int requestedQoSs[]);

+int MQTTStringFormat_suback(char* strbuf, int strbuflen, unsigned short packetid, int count, int* grantedQoSs);

+int MQTTStringFormat_unsubscribe(char* strbuf, int strbuflen, unsigned char dup, unsigned short packetid,

+		int count, MQTTString topicFilters[]);

+char* MQTTFormat_toClientString(char* strbuf, int strbuflen, unsigned char* buf, int buflen);

+char* MQTTFormat_toServerString(char* strbuf, int strbuflen, unsigned char* buf, int buflen);

+

+#endif

diff --git a/mbtk/include/mqtt/MQTTLinux.h b/mbtk/include/mqtt/MQTTLinux.h
new file mode 100755
index 0000000..6ca888a
--- /dev/null
+++ b/mbtk/include/mqtt/MQTTLinux.h
@@ -0,0 +1,74 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation

+ *******************************************************************************/

+

+#ifndef __MQTT_LINUX_

+#define __MQTT_LINUX_

+

+#include <sys/types.h>

+#include <sys/socket.h>

+#include <sys/param.h>

+#include <sys/time.h>

+#include <sys/select.h>

+#include <netinet/in.h>

+#include <netinet/tcp.h>

+#include <arpa/inet.h>

+#include <netdb.h>

+#include <stdio.h>

+#include <unistd.h>

+#include <errno.h>

+#include <fcntl.h>

+#include <stdbool.h>

+#include <stdlib.h>

+#include <string.h>

+#include <signal.h>

+

+// #include <openssl/ssl.h>

+// #include <openssl/err.h>

+//#include "DC_iot_port.h"

+

+typedef struct Timer Timer;

+

+struct Timer {

+	struct timeval end_time;

+};

+

+typedef struct Network Network;

+struct Network

+{

+	int my_socket;

+    bool is_support_ssl;

+    bool ingnore_cert;

+    int handle;

+	int (*mqttread) (Network*, unsigned char*, int, int);

+	int (*mqttwrite) (Network*, unsigned char*, int, int);

+	void (*disconnect) (Network*);

+};

+

+char expired(Timer*);

+void countdown_ms(Timer*, unsigned int);

+void countdown(Timer*, unsigned int);

+int left_ms(Timer*);

+

+void InitTimer(Timer*);

+

+int linux_read(Network*, unsigned char*, int, int);

+int linux_write(Network*, unsigned char*, int, int);

+void linux_disconnect(Network*);

+void NewNetwork(Network*);

+

+int ConnectNetwork(Network*, char*, int, bool ,bool );

+

+#endif
\ No newline at end of file
diff --git a/mbtk/include/mqtt/MQTTPacket.h b/mbtk/include/mqtt/MQTTPacket.h
new file mode 100755
index 0000000..f417929
--- /dev/null
+++ b/mbtk/include/mqtt/MQTTPacket.h
@@ -0,0 +1,133 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Ian Craggs - initial API and implementation and/or initial documentation

+ *    Xiang Rong - 442039 Add makefile to Embedded C client

+ *******************************************************************************/

+

+#ifndef MQTTPACKET_H_

+#define MQTTPACKET_H_

+

+#if defined(__cplusplus) /* If this is a C++ compiler, use C linkage */

+extern "C" {

+#endif

+

+#if defined(WIN32_DLL) || defined(WIN64_DLL)

+  #define DLLImport __declspec(dllimport)

+  #define DLLExport __declspec(dllexport)

+#elif defined(LINUX_SO)

+  #define DLLImport extern

+  #define DLLExport  __attribute__ ((visibility ("default")))

+#else

+  #define DLLImport

+  #define DLLExport  

+#endif

+

+enum errors

+{

+	MQTTPACKET_BUFFER_TOO_SHORT = -2,

+	MQTTPACKET_READ_ERROR = -1,

+	MQTTPACKET_READ_COMPLETE

+};

+

+enum msgTypes

+{

+	CONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL,

+	PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK,

+	PINGREQ, PINGRESP, DISCONNECT

+};

+

+/**

+ * Bitfields for the MQTT header byte.

+ */

+typedef union

+{

+	unsigned char byte;	                /**< the whole byte */

+#if defined(REVERSED)

+	struct

+	{

+		unsigned int type : 4;			/**< message type nibble */

+		unsigned int dup : 1;				/**< DUP flag bit */

+		unsigned int qos : 2;				/**< QoS value, 0, 1 or 2 */

+		unsigned int retain : 1;		/**< retained flag bit */

+	} bits;

+#else

+	struct

+	{

+		unsigned int retain : 1;		/**< retained flag bit */

+		unsigned int qos : 2;				/**< QoS value, 0, 1 or 2 */

+		unsigned int dup : 1;				/**< DUP flag bit */

+		unsigned int type : 4;			/**< message type nibble */

+	} bits;

+#endif

+} MQTTHeader;

+

+typedef struct

+{

+	int len;

+	char* data;

+} MQTTLenString;

+

+typedef struct

+{

+	char* cstring;

+	MQTTLenString lenstring;

+} MQTTString;

+

+#define MQTTString_initializer {NULL, {0, NULL}}

+

+int MQTTstrlen(MQTTString mqttstring);

+

+#include "MQTTConnect.h"

+#include "MQTTPublish.h"

+#include "MQTTSubscribe.h"

+#include "MQTTUnsubscribe.h"

+#include "MQTTFormat.h"

+

+int MQTTSerialize_ack(unsigned char* buf, int buflen, unsigned char type, unsigned char dup, unsigned short packetid);

+int MQTTDeserialize_ack(unsigned char* packettype, unsigned char* dup, unsigned short* packetid, unsigned char* buf, int buflen);

+

+int MQTTPacket_len(int rem_len);

+int MQTTPacket_equals(MQTTString* a, char* b);

+

+int MQTTPacket_encode(unsigned char* buf, int length);

+int MQTTPacket_decode(int (*getcharfn)(unsigned char*, int), int* value);

+int MQTTPacket_decodeBuf(unsigned char* buf, int* value);

+

+int readInt(unsigned char** pptr);

+char readChar(unsigned char** pptr);

+void writeChar(unsigned char** pptr, char c);

+void writeInt(unsigned char** pptr, int anInt);

+int readMQTTLenString(MQTTString* mqttstring, unsigned char** pptr, unsigned char* enddata);

+void writeCString(unsigned char** pptr, const char* string);

+void writeMQTTString(unsigned char** pptr, MQTTString mqttstring);

+

+DLLExport int MQTTPacket_read(unsigned char* buf, int buflen, int (*getfn)(unsigned char*, int));

+

+typedef struct {

+	int (*getfn)(void *, unsigned char*, int); /* must return -1 for error, 0 for call again, or the number of bytes read */

+	void *sck;	/* pointer to whatever the system may use to identify the transport */

+	int multiplier;

+	int rem_len;

+	int len;

+	char state;

+}MQTTTransport;

+

+int MQTTPacket_readnb(unsigned char* buf, int buflen, MQTTTransport *trp);

+

+#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */

+}

+#endif

+

+

+#endif /* MQTTPACKET_H_ */

diff --git a/mbtk/include/mqtt/MQTTPublish.h b/mbtk/include/mqtt/MQTTPublish.h
new file mode 100755
index 0000000..d62dddb
--- /dev/null
+++ b/mbtk/include/mqtt/MQTTPublish.h
@@ -0,0 +1,38 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Ian Craggs - initial API and implementation and/or initial documentation

+ *    Xiang Rong - 442039 Add makefile to Embedded C client

+ *******************************************************************************/

+

+#ifndef MQTTPUBLISH_H_

+#define MQTTPUBLISH_H_

+

+#if !defined(DLLImport)

+  #define DLLImport 

+#endif

+#if !defined(DLLExport)

+  #define DLLExport

+#endif

+

+DLLExport int MQTTSerialize_publish(unsigned char* buf, int buflen, unsigned char dup, int qos, unsigned char retained, unsigned short packetid,

+		MQTTString topicName, unsigned char* payload, int payloadlen);

+

+DLLExport int MQTTDeserialize_publish(unsigned char* dup, int* qos, unsigned char* retained, unsigned short* packetid, MQTTString* topicName,

+		unsigned char** payload, int* payloadlen, unsigned char* buf, int len);

+

+DLLExport int MQTTSerialize_puback(unsigned char* buf, int buflen, unsigned short packetid);

+DLLExport int MQTTSerialize_pubrel(unsigned char* buf, int buflen, unsigned char dup, unsigned short packetid);

+DLLExport int MQTTSerialize_pubcomp(unsigned char* buf, int buflen, unsigned short packetid);

+

+#endif /* MQTTPUBLISH_H_ */

diff --git a/mbtk/include/mqtt/MQTTSubscribe.h b/mbtk/include/mqtt/MQTTSubscribe.h
new file mode 100755
index 0000000..383ca0d
--- /dev/null
+++ b/mbtk/include/mqtt/MQTTSubscribe.h
@@ -0,0 +1,39 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Ian Craggs - initial API and implementation and/or initial documentation

+ *    Xiang Rong - 442039 Add makefile to Embedded C client

+ *******************************************************************************/

+

+#ifndef MQTTSUBSCRIBE_H_

+#define MQTTSUBSCRIBE_H_

+

+#if !defined(DLLImport)

+  #define DLLImport 

+#endif

+#if !defined(DLLExport)

+  #define DLLExport

+#endif

+

+DLLExport int MQTTSerialize_subscribe(unsigned char* buf, int buflen, unsigned char dup, unsigned short packetid,

+		int count, MQTTString topicFilters[], int requestedQoSs[]);

+

+DLLExport int MQTTDeserialize_subscribe(unsigned char* dup, unsigned short* packetid,

+		int maxcount, int* count, MQTTString topicFilters[], int requestedQoSs[], unsigned char* buf, int len);

+

+DLLExport int MQTTSerialize_suback(unsigned char* buf, int buflen, unsigned short packetid, int count, int* grantedQoSs);

+

+DLLExport int MQTTDeserialize_suback(unsigned short* packetid, int maxcount, int* count, int grantedQoSs[], unsigned char* buf, int len);

+

+

+#endif /* MQTTSUBSCRIBE_H_ */

diff --git a/mbtk/include/mqtt/MQTTUnsubscribe.h b/mbtk/include/mqtt/MQTTUnsubscribe.h
new file mode 100755
index 0000000..1644ae5
--- /dev/null
+++ b/mbtk/include/mqtt/MQTTUnsubscribe.h
@@ -0,0 +1,38 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Ian Craggs - initial API and implementation and/or initial documentation

+ *    Xiang Rong - 442039 Add makefile to Embedded C client

+ *******************************************************************************/

+

+#ifndef MQTTUNSUBSCRIBE_H_

+#define MQTTUNSUBSCRIBE_H_

+

+#if !defined(DLLImport)

+  #define DLLImport 

+#endif

+#if !defined(DLLExport)

+  #define DLLExport

+#endif

+

+DLLExport int MQTTSerialize_unsubscribe(unsigned char* buf, int buflen, unsigned char dup, unsigned short packetid,

+		int count, MQTTString topicFilters[]);

+

+DLLExport int MQTTDeserialize_unsubscribe(unsigned char* dup, unsigned short* packetid, int max_count, int* count, MQTTString topicFilters[],

+		unsigned char* buf, int len);

+

+DLLExport int MQTTSerialize_unsuback(unsigned char* buf, int buflen, unsigned short packetid);

+

+DLLExport int MQTTDeserialize_unsuback(unsigned short* packetid, unsigned char* buf, int len);

+

+#endif /* MQTTUNSUBSCRIBE_H_ */

diff --git a/mbtk/include/mqtt/StackTrace.h b/mbtk/include/mqtt/StackTrace.h
new file mode 100755
index 0000000..c65a2ef
--- /dev/null
+++ b/mbtk/include/mqtt/StackTrace.h
@@ -0,0 +1,78 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Ian Craggs - initial API and implementation and/or initial documentation

+ *    Ian Craggs - fix for bug #434081

+ *******************************************************************************/

+

+#ifndef STACKTRACE_H_

+#define STACKTRACE_H_

+

+#include <stdio.h>

+#define NOSTACKTRACE 1

+

+#if defined(NOSTACKTRACE)

+#define FUNC_ENTRY

+#define FUNC_ENTRY_NOLOG

+#define FUNC_ENTRY_MED

+#define FUNC_ENTRY_MAX

+#define FUNC_EXIT

+#define FUNC_EXIT_NOLOG

+#define FUNC_EXIT_MED

+#define FUNC_EXIT_MAX

+#define FUNC_EXIT_RC(x)

+#define FUNC_EXIT_MED_RC(x)

+#define FUNC_EXIT_MAX_RC(x)

+

+#else

+

+#if defined(WIN32)

+#define inline __inline

+#define FUNC_ENTRY StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MINIMUM)

+#define FUNC_ENTRY_NOLOG StackTrace_entry(__FUNCTION__, __LINE__, -1)

+#define FUNC_ENTRY_MED StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MEDIUM)

+#define FUNC_ENTRY_MAX StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MAXIMUM)

+#define FUNC_EXIT StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MINIMUM)

+#define FUNC_EXIT_NOLOG StackTrace_exit(__FUNCTION__, __LINE__, -1)

+#define FUNC_EXIT_MED StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MEDIUM)

+#define FUNC_EXIT_MAX StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MAXIMUM)

+#define FUNC_EXIT_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MINIMUM)

+#define FUNC_EXIT_MED_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MEDIUM)

+#define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MAXIMUM)

+#else

+#define FUNC_ENTRY StackTrace_entry(__func__, __LINE__, TRACE_MINIMUM)

+#define FUNC_ENTRY_NOLOG StackTrace_entry(__func__, __LINE__, -1)

+#define FUNC_ENTRY_MED StackTrace_entry(__func__, __LINE__, TRACE_MEDIUM)

+#define FUNC_ENTRY_MAX StackTrace_entry(__func__, __LINE__, TRACE_MAXIMUM)

+#define FUNC_EXIT StackTrace_exit(__func__, __LINE__, NULL, TRACE_MINIMUM)

+#define FUNC_EXIT_NOLOG StackTrace_exit(__func__, __LINE__, NULL, -1)

+#define FUNC_EXIT_MED StackTrace_exit(__func__, __LINE__, NULL, TRACE_MEDIUM)

+#define FUNC_EXIT_MAX StackTrace_exit(__func__, __LINE__, NULL, TRACE_MAXIMUM)

+#define FUNC_EXIT_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MINIMUM)

+#define FUNC_EXIT_MED_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MEDIUM)

+#define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MAXIMUM)

+

+void StackTrace_entry(const char* name, int line, int trace);

+void StackTrace_exit(const char* name, int line, void* return_value, int trace);

+

+void StackTrace_printStack(FILE* dest);

+char* StackTrace_get(unsigned long);

+

+#endif

+

+#endif

+

+

+

+

+#endif /* STACKTRACE_H_ */

diff --git a/mbtk/include/ql_v2/fota_info.h b/mbtk/include/ql_v2/fota_info.h
new file mode 100755
index 0000000..59cd6ac
--- /dev/null
+++ b/mbtk/include/ql_v2/fota_info.h
@@ -0,0 +1,26 @@
+#ifndef FOTA_INFO_H_
+#define FOTA_INFO_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef enum
+{
+    SUCCEED = 0,
+    UPDATE,
+    BACKUP,
+    FAILED,
+    WRITEDONE,
+    NEEDSYNC,
+    CANCEL,
+    UNKNOWN_STATUS
+} fota_state_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //FOTA_INFO_H_
diff --git a/mbtk/include/ql_v2/ql_absys_api.h b/mbtk/include/ql_v2/ql_absys_api.h
new file mode 100755
index 0000000..6896f38
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_absys_api.h
@@ -0,0 +1,149 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_absys.h
+  @brief
+       This file declare absys interface
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  2021.12.20   jessie.lei     Created .
+-------------------------------------------------------------------------------------------------*/
+
+
+#ifndef QL_ABSYS_H_
+#define QL_ABSYS_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <errno.h>
+#include "fota_info.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PARTITION_NAME_SIZE 16
+
+
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * System ID: The dual system platforms have 2 systems: A and B.
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef enum absystem
+{
+    SYSTEM_A = 0,
+    SYSTEM_B = 1
+} absystem_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * system status
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct
+{
+    fota_state_t ota_state;        ///< the device ota upgrade status
+    bool is_damaged;               ///< whether the device have damaged partition
+    uint8_t damaged_partname[PARTITION_NAME_SIZE];  ///< which partition damaged, and tiggered the device A/B system switch
+} sysstatus_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * @brief
+ * 		get current system status, fota status & A/B partition status.
+ * @Parameter
+        [OUT] sys_state, store the status to this struct for the caller could read current system status.
+ * @return
+ *      - On success               0
+ *      - On failure              -1
+ */
+//--------------------------------------------------------------------------------------------------
+int ql_absys_getstatus(sysstatus_t *sys_state);
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * @brief
+ * 		get current active system is A or B.
+ * @Parameter
+        [InOut] cur_system, store the current active system info to this enmu.
+ * @return
+ *      - On success               0, success to get current active system
+ *      - On failure              -1, failed to get current active system
+ */
+//--------------------------------------------------------------------------------------------------
+int ql_absys_get_cur_active_part(absystem_t *cur_system);
+
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * @brief
+ *      Set flags in fota state file, need the caller do reboot system action atfer this api return 0, then A/B system will be switch atfer reboot.
+ *      If fota state is SUCCEED or NEEDSYNC (A/B system is sync), it is okay to switch A/B system, API will be return 0.
+ *      If fota state is WRITEDONE (A/B system is not sync), it is okay to switch A/B system and will be set fota state to NEEDSYNC, API will be return 0.
+ *      If fota state is UPDATE or BACKUP (A/B system is not sync), indicate the inactive partition is being updated and can not switch A/B, API will be return -2
+ *      If fota state is FAILED (A/B system is not sync), indicate the inactive partition was damaged and can not switch A/B, API will be return -3
+ * @Parameter
+ *     No parameter
+ * @return
+ *      - On success   0  indicate the switch flag was set succeed
+ *      - On failure   -1 get or set fota state and absys info failed;
+ *                     -2 indicate the inactive partition was damaged by ota upgrade, could not switch;
+ *                     -3 indicate the inactive partition is being upgraded or backup is in progress.
+ */
+//--------------------------------------------------------------------------------------------------
+int ql_absys_switch(void);
+
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * @brief
+ * 		Program a synchronization active slot partition data to non-active partition
+ * @Parameter
+ *      No parameter
+ * @return
+ *      - On success             0
+ *      - On failure            -1
+ */
+//--------------------------------------------------------------------------------------------------
+int ql_absys_sync(void);
+
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * @brief
+ * 		Program a synchronization active slot partition data to non-inactive partition
+ * @Parameter
+ *  [IN] cpu_loading_level       0   ql_otad cpuloading 98%
+ *                               1   ql_otad cpuloading 55%
+ *                               2   ql_otad cpuloading 38%
+ *                               3   ql_otad cpuloading 30%
+ *                               4   ql_otad cpuloading 25%
+ *                               5   ql_otad cpuloading 20%
+ * @return
+ *      - On success             0
+ *      - On failure            -1
+ */
+//--------------------------------------------------------------------------------------------------
+int ql_absys_sync_control(int cpu_loading_level);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //QL_ABSYS_H_
diff --git a/mbtk/include/ql_v2/ql_adc.h b/mbtk/include/ql_v2/ql_adc.h
new file mode 100755
index 0000000..36136d0
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_adc.h
@@ -0,0 +1,70 @@
+/**  
+  @file
+  ql_adc.h
+
+  @brief
+  This file provides the definitions for adc, and declares the 
+  API functions.
+
+*/
+/*============================================================================
+  Copyright (c) 2017 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+ =============================================================================*/
+/*===========================================================================
+
+                        EDIT HISTORY FOR MODULE
+
+This section contains comments describing changes made to the module.
+Notice that changes are listed in reverse chronological order.
+
+
+WHEN        WHO            WHAT, WHERE, WHY
+----------  ------------   ----------------------------------------------------
+10/12/2021  larry          Code  normalization
+=============================================================================*/
+
+#ifndef _QL_ADC_H_
+#define _QL_ADC_H_
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+      ADC channel  enum
+*/
+typedef enum  ADC_CHANNEL_ENUM{
+    QADC_NONE = 0,			/** Invalid  channel*/
+    ADC0 = 1,				/** ADC0 channel  */
+    ADC1 = 2,				/** ADC1 channel  */
+    ADC2 = 3,				/** ADC2 channel  */
+    QADC_END				/** Invalid  channel*/
+}ADC_CHANNEL_E;
+
+/*========================================================================
+  FUNCTION:  ql_adc_show
+=========================================================================*/
+/** @brief 
+    This function retrieves the ADC voltage value with the specified 
+    ADC channel.
+    Support input vol value:
+    ADC0 : 0V-VBAT_BB
+    ADC1 : 0V-VBAT_BB
+
+    @param[in] qadc, adc channel definitions, one value of ADC_CHANNEL_E.
+
+    @return
+    adc value(mv) on success
+    on failure, the return value is -1;
+*/
+/*=======================================================================*/
+int ql_adc_show(ADC_CHANNEL_E qadc);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/mbtk/include/ql_v2/ql_asn1Msd.h b/mbtk/include/ql_v2/ql_asn1Msd.h
new file mode 100755
index 0000000..a59372f
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_asn1Msd.h
@@ -0,0 +1,416 @@
+/** @file asn1Msd.h
+ *
+ * This file contains the declarations of the ASN1 MSD builder.
+ *
+ * Copyright (C) Sierra Wireless Inc.
+ */
+/*================================================================
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+  =================================================================*/
+/*=================================================================
+
+  EDIT HISTORY FOR MODULE
+
+  This section contains comments describing changes made to the module.
+  Notice that changes are listed in reverse chronological order.
+
+  WHEN             WHO         WHAT, WHERE, WHY
+  ------------     -------     ---------------------------------------
+  04/12/2018       laurence    Init.
+  =================================================================*/
+
+#ifndef _ASN1_MSD_INCLUDE_GUARD_
+#define _ASN1_MSD_INCLUDE_GUARD_
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+
+#ifndef NULL
+#define NULL     0
+#endif
+
+//--------------------------------------------------------------------------------------------------
+// Defines
+//--------------------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Position N-1 and N-2 are delta positions.
+ * Limits as defined in FprEN 15722:2014
+ * These are the max and min values for the msd_VehicleLocationDelta_t members
+ */
+//--------------------------------------------------------------------------------------------------
+#define ASN1_LATITUDE_DELTA_MAX  511
+#define ASN1_LATITUDE_DELTA_MIN  -512
+#define ASN1_LONGITUDE_DELTA_MAX  511
+#define ASN1_LONGITUDE_DELTA_MIN  -512
+#define ASN1_ECALL_MSD_VERSION_1 1
+#define ASN1_ECALL_MSD_VERSION_2 2
+#define ASN1_ECALL_MSD_VERSION_3 3
+
+
+#define QL_ECALL_MAX_VIN 20
+
+//--------------------------------------------------------------------------------------------------
+// Symbols and enums.
+//--------------------------------------------------------------------------------------------------
+typedef enum
+{
+    QL_ERR_MSD_NONE                 = 0,
+    QL_ERR_MSD_SUCCESS              = QL_ERR_MSD_NONE,
+    QL_ERR_MSD_GENERIC              = -(QL_ERR_MSD_NONE+1),     /**<  MSD Generic ERROR. */
+    QL_ERR_MSD_BADPARM              = -(QL_ERR_MSD_NONE+2),     /**<  MSD Bad parameter ERROR. */
+    QL_ERR_MSD_VERSION              = -(QL_ERR_MSD_NONE+3),     /**<  MSD VERSION ERROR. */
+    QL_ERR_MSD_ISOWMI               = -(QL_ERR_MSD_NONE+2),     /**<  MSD wmi ERROR. */
+    QL_ERR_MSD_ISOVDS               = -(QL_ERR_MSD_NONE+4),     /**<  MSD vds ERROR. */
+    QL_ERR_MSD_ISOVIS_MODELYEAR     = -(QL_ERR_MSD_NONE+5),     /**<  MSD model year ERROR. */
+    QL_ERR_MSD_ISOVIS_SEQPLAN       = -(QL_ERR_MSD_NONE+6),     /**<  MSD seplan ERROR. */
+    QL_ERR_MSD_LATITUDE             = -(QL_ERR_MSD_NONE+7),     /**<  MSD latitude ERROR. */
+    QL_ERR_MSD_LONGITUDE            = -(QL_ERR_MSD_NONE+8),     /**<  MSD longitude ERROR. */
+    QL_ERR_MSD_VEH_DIRECTION        = -(QL_ERR_MSD_NONE+9),     /**<  MSD vehDirection ERROR. */
+    QL_ERR_MSD_VEH_LAT_LOCATION1    = -(QL_ERR_MSD_NONE+10),    /**<  MSD recentVehLocationN1 latitude ERROR. */
+    QL_ERR_MSD_VEH_LON_LOCATION1    = -(QL_ERR_MSD_NONE+11),    /**<  MSD recentVehLocationN1 longitude ERROR. */
+    QL_ERR_MSD_VEH_LAT_LOCATION2    = -(QL_ERR_MSD_NONE+12),    /**<  MSD recentVehLocationN2 latitude ERROR. */
+    QL_ERR_MSD_VEH_LON_LOCATION2    = -(QL_ERR_MSD_NONE+13),    /**<  MSD recentVehLocationN2 longitude ERROR. */
+    QL_ERR_MSD_VEH_IDENTIFI_NUMBER  = -(QL_ERR_MSD_NONE+14),    /**<  MSD vehIdentification Number ERROR. */
+    QL_ERR_MSD_OPTINAL_DATA_GLONASS = -(QL_ERR_MSD_NONE+15),    /**<  MSD Optional Data For Era Glonass  ERROR. */
+} QL_ERR_MSD_RESULT_E;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Enumeration used to specify the type of vehicle.
+ */
+//--------------------------------------------------------------------------------------------------
+typedef enum
+{
+    MSD_VEHICLE_PASSENGER_M1=1,  ///< Passenger vehicle (Class M1)
+    MSD_VEHICLE_BUS_M2,          ///< Buses and coaches (Class M2)
+    MSD_VEHICLE_BUS_M3,          ///< Buses and coaches (Class M3)
+    MSD_VEHICLE_COMMERCIAL_N1,   ///< Light commercial vehicles (Class N1)
+    MSD_VEHICLE_HEAVY_N2,        ///< Heavy duty vehicles (Class N2)
+    MSD_VEHICLE_HEAVY_N3,        ///< Heavy duty vehicles (Class N3)
+    MSD_VEHICLE_MOTORCYCLE_L1E,  ///< Motorcycles (Class L1e)
+    MSD_VEHICLE_MOTORCYCLE_L2E,  ///< Motorcycles (Class L2e)
+    MSD_VEHICLE_MOTORCYCLE_L3E,  ///< Motorcycles (Class L3e)
+    MSD_VEHICLE_MOTORCYCLE_L4E,  ///< Motorcycles (Class L4e)
+    MSD_VEHICLE_MOTORCYCLE_L5E,  ///< Motorcycles (Class L5e)
+    MSD_VEHICLE_MOTORCYCLE_L6E,  ///< Motorcycles (Class L6e)
+    MSD_VEHICLE_MOTORCYCLE_L7E,  ///< Motorcycles (Class L7e)
+} MSD_VEHICLE_TYPE_E;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Enumeration used to specify the propulsion type.
+ */
+//--------------------------------------------------------------------------------------------------
+typedef enum
+{
+    ECALL_MSD_PROPULSION_TYPE_GASOLINE=0x1,
+    ECALL_MSD_PROPULSION_TYPE_DIESEL=0x2,
+    ECALL_MSD_PROPULSION_TYPE_NATURALGAS=0x4,
+    ECALL_MSD_PROPULSION_TYPE_PROPANE=0x8,
+    ECALL_MSD_PROPULSION_TYPE_ELECTRIC=0x10,
+    ECALL_MSD_PROPULSION_TYPE_HYDROGEN=0x20,
+    ECALL_MSD_PROPULSION_TYPE_OTHER=0x40,
+} ECALL_MSD_PROPULSION_TYPE_E;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Enumeration used to specify the type of coordinate system.
+ */
+//--------------------------------------------------------------------------------------------------
+typedef enum
+{
+    MSD_COORDINATE_SYSTEM_TYPE_ABSENT,   ///< Coordinate system type is absent
+    MSD_COORDINATE_SYSTEM_TYPE_WGS84,    ///< Coordinate system type WGS-84
+    MSD_COORDINATE_SYSTEM_TYPE_PZ90      ///< Coordinate system type PZ-90
+} ECALL_MSD_COORINATE_SYSTEM_TYPE_E;
+
+typedef enum
+{
+    ECALL_SYSTEM_STD_PAN_EUROPEAN,      //< PAN-European system.
+    ECALL_SYSTEM_STD_ERA_GLONASS        //< ERA-GLONASS system.
+} ECALL_SYSTEM_STD_E;
+//--------------------------------------------------------------------------------------------------
+// Data structures.
+//--------------------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure describing the VIN (Vehicle Identification Number).
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct{
+   char    isowmi[4];
+   char    isovds[7];
+   char    isovisModelyear[2];
+   char    isovisSeqPlant[8];
+} msd_Vin_t;
+
+/* ControlType */
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure describing the main control elements of the MSD.
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct {
+   bool                 automaticActivation;
+   bool                 testCall;
+   bool                 positionCanBeTrusted;
+   MSD_VEHICLE_TYPE_E    vehType;
+} msd_Control_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure describing the vehicle propulsion storage type.
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct {
+   bool gasolineTankPresent;
+   bool dieselTankPresent;
+   bool compressedNaturalGas;
+   bool liquidPropaneGas;
+   bool electricEnergyStorage;
+   bool hydrogenStorage;
+   bool otherStorage;
+} msd_VehiclePropulsionStorageType_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure describing the last known vehicle location.
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct {
+   int32_t    latitude;
+   int32_t    longitude;
+} msd_VehicleLocation_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure describing the location of the vehicle some time before the generation of the data
+ * for the MSD message..
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct {
+   int32_t    latitudeDelta;
+   int32_t    longitudeDelta;
+} msd_VehicleLocationDelta_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure to gather optional data.
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct {
+   uint8_t  oidlen;
+   uint8_t  dataLen;
+   uint8_t* oid;
+   uint8_t* data;
+} msd_optionalData_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure describing the MSD without the additional optional data.
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct {
+   uint8_t                             messageIdentifier;
+   msd_Control_t                       control;
+   msd_Vin_t                           vehIdentificationNumber;
+   msd_VehiclePropulsionStorageType_t  vehPropulsionStorageType;
+   uint32_t                            timestamp;
+   msd_VehicleLocation_t               vehLocation;
+   uint8_t                             vehDirection;
+   /* Optional */
+   bool                                recentVehLocationN1Pres;
+   msd_VehicleLocationDelta_t          recentVehLocationN1;
+   /* Optional */
+   bool                                recentVehLocationN2Pres;
+   msd_VehicleLocationDelta_t          recentVehLocationN2;
+   /* Optional */
+   bool                                numberOfPassengersPres;
+   uint8_t                             numberOfPassengers;
+} msd_Structure_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure describing the MSD with the additional optional data.
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct {
+   msd_Structure_t    msdStruct;
+   /* Optional */
+   bool               optionalDataPres;
+   msd_optionalData_t optionalData;
+} msd_Message_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure describing the MSD message.
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct {
+    uint8_t       version;
+    msd_Message_t msdMsg;
+} msd_t;
+
+
+/* ERA GLONASS specific types for the OptionalData_t parts */
+//--------------------------------------------------------------------------------------------------
+/**
+ * Data structure to gather the ERA GLONASS specific data.
+ *
+ */
+//--------------------------------------------------------------------------------------------------
+
+typedef struct {
+   /*
+    * ERAAdditionalData ::= SEQUENCE {
+    * crashSeverity INTEGER(0..2047) OPTIONAL,
+    * diagnosticResult DiagnosticResult OPTIONAL,
+    * crashInfo CrashInfo OPTIONAL,
+    * coordinateSystemType CoordinateSystemType DEFAULT wgs84,
+    * ...
+    * }
+    */
+   uint8_t msdVersion;
+
+   bool presentCrashSeverity;
+   uint32_t crashSeverity; /* INTEGER(0..2047) OPTIONAL */
+
+   bool presentDiagnosticResult;
+   struct
+   {
+      bool presentMicConnectionFailure;
+      bool micConnectionFailure;
+
+      bool presentMicFailure;
+      bool micFailure;
+
+      bool presentRightSpeakerFailure;
+      bool rightSpeakerFailure;
+
+      bool presentLeftSpeakerFailure;
+      bool leftSpeakerFailure;
+
+      bool presentSpeakersFailure;
+      bool speakersFailure;
+
+      bool presentIgnitionLineFailure;
+      bool ignitionLineFailure;
+
+      bool presentUimFailure;
+      bool uimFailure;
+
+      bool presentStatusIndicatorFailure;
+      bool statusIndicatorFailure;
+
+      bool presentBatteryFailure;
+      bool batteryFailure;
+
+      bool presentBatteryVoltageLow;
+      bool batteryVoltageLow;
+
+      bool presentCrashSensorFailure;
+      bool crashSensorFailure;
+
+      bool presentFirmwareImageCorruption;
+      bool firmwareImageCorruption;
+
+      bool presentCommModuleInterfaceFailure;
+      bool commModuleInterfaceFailure;
+
+      bool presentGnssReceiverFailure;
+      bool gnssReceiverFailure;
+
+      bool presentRaimProblem;
+      bool raimProblem;
+
+      bool presentGnssAntennaFailure;
+      bool gnssAntennaFailure;
+
+      bool presentCommModuleFailure;
+      bool commModuleFailure;
+
+      bool presentEventsMemoryOverflow;
+      bool eventsMemoryOverflow;
+
+      bool presentCrashProfileMemoryOverflow;
+      bool crashProfileMemoryOverflow;
+
+      bool presentOtherCriticalFailures;
+      bool otherCriticalFailures;
+
+      bool presentOtherNotCriticalFailures;
+      bool otherNotCriticalFailures;
+   } diagnosticResult;
+
+   bool presentCrashInfo;
+   struct
+   {
+      bool presentCrashFront;
+      bool crashFront;
+
+      bool presentCrashLeft;
+      bool crashLeft;
+
+      bool presentCrashRight;
+      bool crashRight;
+
+      bool presentCrashRear;
+      bool crashRear;
+
+      bool presentCrashRollover;
+      bool crashRollover;
+
+      bool presentCrashSide;
+      bool crashSide;
+
+      bool presentCrashFrontOrSide;
+      bool crashFrontOrSide;
+
+      bool presentCrashAnotherType;
+      bool crashAnotherType;
+   } crashType;
+
+   bool presentCoordinateSystemTypeInfo;
+   ECALL_MSD_COORINATE_SYSTEM_TYPE_E coordinateSystemType;
+} msd_EraGlonassData_t;
+
+typedef struct ecall ecall_t;
+
+void print_msd_hexstr(uint8_t *msd,uint32_t msd_len);
+
+QL_ERR_MSD_RESULT_E ql_msd_encode
+(
+    uint8_t  *pBuiltMsd,                    //< built MSD
+    uint32_t *pBuiltMsdSize,                //< Size of the built MSDvoid
+    ECALL_SYSTEM_STD_E      systemStandard, 
+    msd_EraGlonassData_t    eraGlonassDataObj,
+    msd_t                   msdContent
+);
+
+bool IsVinValid
+(
+    msd_Vin_t vin
+);
+
+int32_t ConvertDdToDms
+(
+    int32_t    ddVal
+);
+
+
+
+#endif // _ASN1_MSD_INCLUDE_GUARD_
diff --git a/mbtk/include/ql_v2/ql_atc.h b/mbtk/include/ql_v2/ql_atc.h
new file mode 100755
index 0000000..6a20d42
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_atc.h
@@ -0,0 +1,98 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_atc.h 
+  @brief AT command API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20191225   stan.li      Modify function description.
+  20191225   solomon.cui  Fix possible null pointer dereference.
+  20190702   stan.li      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_ATC_H__
+#define __QL_ATC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define QL_ATC_MAX_REQ_MSG_LEN   513    /**<  Maximum request message size. */
+#define QL_ATC_MAX_RESP_MSG_LEN  4097   /**<  Maximum response message size. */
+
+typedef void (*ql_atc_async_cb)(int async_index, char *req_buf, char *rsp_buf);
+typedef void (*ql_atc_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize ATC service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the ATC service was successfully intialized.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_atc_init(void);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief send at command async.
+  @param[in] req_buf At command request content
+  @param[out] async_index Async AT command index
+  @param[in] async_cb Async callback function
+  @return Whether to successfully send the AT command asynchronously
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_atc_send_async(char *req_buf, int *async_index, void *async_cb);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief send AT command.
+  @param[in] req_buf At command request content
+  @param[in] rsp_buf At command response content
+  @param[in] rsp_len The length of rsp_buf
+  @return Whether to successfully send AT command
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_atc_send(char *req_buf, char *rsp_buf, int rsp_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize ATC service.
+  @return Whether the DM service was successfully deintialized.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_atc_deinit(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/mbtk/include/ql_v2/ql_audio_cfg.h b/mbtk/include/ql_v2/ql_audio_cfg.h
new file mode 100755
index 0000000..92a56ba
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_audio_cfg.h
@@ -0,0 +1,533 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_audio_cfg.h
+  @brief audio config API, including audio initlization, audio configuration
+
+  @detailes
+  Quectel AG55x series module AUDIO service.
+
+  @htmlonly
+  <span style="font-weight: bold">History</span>
+  @endhtmlonly
+
+  when       |   who      	|    what, where, why
+  --------   |   ---      	|    ----------------------------------------------------------
+  2021-11-03 |   dameng.lin |    Created .
+
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+#ifndef __QL_AUDIO_CFG_H__
+#define __QL_AUDIO_CFG_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#define QL_AUDIO_STATE_0  0
+#define QL_AUDIO_STATE_1  1
+
+
+/**
+  @brief  The audio service error callback function
+  @param  error  error code.See ql_type.h for details.
+*/
+typedef void (*ql_audio_service_error_cb_f)(int error);
+
+extern ql_audio_service_error_cb_f audio_error_callback;
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function initializes an audio service.
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_SERVICE_NOT_READY  Audio service not ready. Try again later.
+  @retval  Others Failed execution.See ql_type.h for error codes
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function deinitializes audio services.
+
+  @retval  QL_ERR_OK Successful
+  @retval  QL_ERR_SERVICE_NOT_READY Service is not ready, need to retry
+  @retval  Others Failed execution.See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the value of a mixer.
+
+  @param[in] control    the name of the mixer
+  @param[in] val_list   the value of the mixer to be set. String type value.Multiple values are separated by spaces.
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others Failed execution.See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_mixer_control(const char *control, const char *val_list);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the value of the mixer.
+
+  @param[in]  control       the name of the mixer
+  @param[out] val_list_buf  buffer for storing mixer values
+  @param[in]  buf_size      the buffer size. Unit:Byte
+
+  @retval  QL_ERR_OK Successful execution.
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others Failed execution.See ql_type.h for error codes.
+
+  @note  Generally, 64 bytes is enough
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_mixer_control(const char *control, char *val_list_buf, uint32_t buf_size);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the microphone gain for voice call uplink.
+
+  @param[in] mic_gain  the microphone gain to be set. range:0-65535
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called before a voice call
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_tx_voice_mic_gain(int32_t mic_gain);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the microphone gain for voice call uplink.
+
+  @param[out] p_mic_gain  the current microphone gain for voice call uplink.
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_tx_voice_mic_gain(int32_t *p_mic_gain);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the speaker gain for voice call downlink.
+
+  @param[in] spkr_gain   the speaker gain to be set. range:0-65535
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called before a voice call
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_rx_voice_spkr_gain(int32_t spkr_gain);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the speaker gain for voice call downlink.
+
+  @param[out] p_spkr_gain   the current speaker gain for voice call downlink.
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_rx_voice_spkr_gain(int32_t *p_spkr_gain);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the mute state of voice call uplink.
+
+  @param[in] mute_state  the mute state to be set.
+             QL_AUDIO_STATE_0: unmute, QL_AUDIO_STATE_1: mute
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called during the call
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_tx_voice_mute_state(int32_t mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the mute state of voice call uplink.
+
+  @param[out] p_mute_state  the current mute state of voice call uplink. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_tx_voice_mute_state(int32_t *p_mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the mute state of voice call downlink.
+
+  @param[in] mute_state  the mute state to be set.
+             QL_AUDIO_STATE_0: unmute, QL_AUDIO_STATE_1: mute
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called during the call
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_rx_voice_mute_state(int32_t mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the mute state of voice call downlink.
+
+  @param[out] p_mute_state  the current mute state of voice call downlink. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_rx_voice_mute_state(int32_t *p_mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the uplink volume of a codec.
+
+  @param[in] up_volume  the uplink volume to be set. range:0-100
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_up_vol(int32_t up_volume);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the uplink volume of a codec.
+
+  @param[out] p_up_volume  the current uplink volume of codec. range:0-100
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_up_vol(int32_t *p_up_volume);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the downlink volume of a codec.
+
+  @param[in] down_volume  the volume to be set. range:0-100
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_down_vol(int32_t down_volume);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the downlink volume of a codec.
+
+  @param[out] p_down_volume  the current downlink volume of codec. range:0-100
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_down_vol(int32_t *p_down_volume);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the microphone mute state of a codec.
+
+  @param[in] mute_state  the muute state to be set.
+             QL_AUDIO_STATE_0: unmute, QL_AUDIO_STATE_1: mute
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called during the call or audio playback
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_mic_mute_state(int32_t mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the microphone mute state of a codec.
+
+  @param[out] p_mute_state  the current microphone mute state of codec. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_mic_mute_state(int32_t *p_mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the speaker mute state of a codec.
+
+  @param[in] mute_state  the mute state to be set.
+             QL_AUDIO_STATE_0: unmute, QL_AUDIO_STATE_1: mute
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called during the call or audio playback
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_spk_mute_state(int32_t mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the speaker mute state of a codec.
+
+  @param[out] p_mute_state  the current speaker mute state of codec. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_spk_mute_state(int32_t *p_mute_state);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function enables/disables loopback.
+
+  @param[in] enable_state  enable/disable the loopback to be set.
+             QL_AUDIO_STATE_0: disable, QL_AUDIO_STATE_1: enable
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_loopback_enable_state(int32_t enable_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  The function gets the loopback state.
+
+  @param[out] p_enable_state  the current loopback state. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_loopback_enable_state(int32_t *p_enable_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the sidetone gain.
+
+  @param[in] sidetone_gain  sidetone gain to be set. range: 0-65535
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_sidetone_gain(int32_t sidetone_gain);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the sidetone gain.
+
+  @param[out] p_sidetone_gain  the current sidetone gain. range: 0-65535, default value: 1298
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_sidetone_gain(int32_t *p_sidetone_gain);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the voice call manager state. By default, voice call services such as ringtones, ringback
+tones, third-party ringtones and voice stream status control are all implemented by ql_audiod program
+automatically.
+
+  @param[in] manager_state  The manager state to be set. Voice call services include ringtones, ringback tones, the third-party
+ringtones and voice stream status control. range: QL_AUDIO_STATE_0 and QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The voice service, such as call ring, beep tone, will not work during a voice call
+         If the manager_state is set to QL_AUDIO_STATE_1
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_voice_call_manager_state(int32_t manager_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the voice call manager state.
+
+  @param[out] p_manager_state  the current voice call manager state.
+              QL_AUDIO_STATE_0: close, QL_AUDIO_STATE_1:open
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_voice_call_manager_state(int32_t *p_manager_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the voice stream state.
+
+  @param[in] stream_state  voice stream state to be set.
+             QL_AUDIO_STATE_0: close, QL_AUDIO_STATE_1:open
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  After the voice call manager state is set to QL_AUDIO_STATE_1 by calling
+ql_audio_set_voice_call_manager_state(), the service program ql_audiod will not enable voice stream
+while establishing a voice call. In such a case, call ql_audio_set_voice_stream_state() to enable voice
+stream state by setting stream_state to QL_AUDIO_STATE_1, and then the voice stream can be disabled
+by setting stream_state to QL_AUDIO_STATE_0.*/
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_audio_set_voice_stream_state(int32_t stream_state);
+int ql_audio_set_voice_stream_state(int32_t stream_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  The function gets the voice stream state.
+
+  @param[out] p_stream_state  the current voice stream state. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_audio_get_voice_stream_state(int32_t *p_stream_state);
+int ql_audio_get_voice_stream_state(int32_t *p_stream_state);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the callback function for audio service errors. 
+  @param[in] cb  The callback function for audio service errors.Only when the audioservice exit abnormally,the callback function is executed.
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_service_error_cb(ql_audio_service_error_cb_f cb);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function switch codec.
+
+  @param[in] codec_switch  the which codec to be switch.
+             0:GSSP  1:internal codec
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_switch(int32_t codec_switch);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the tone state.
+
+  @param[out] p_codec_switch  which codec has switch.    
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_switch(int32_t *p_codec_switch);
+
+
+typedef struct ql_audio_tone_config_struct
+{
+    int32_t low_fre;
+    int32_t high_fre;
+    int32_t on_duration;
+    int32_t off_duration;
+    int32_t volume;
+    int32_t count;
+}ql_audio_tone_config_t;
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set tone enable state
+
+  @param[in] low_fre   low frequency, range: 100~4000
+  @param[in] high_fre  high frequency, range: 100~4000
+  @param[in] on_duration  tone play time,  unit is millisecond
+  @param[in] off_duration  tone pause time,  unit is millisecond
+  @param[in] volume  tone play volume, range: 0~5000
+  @param[in] count  tone play count
+
+  @return  QL_ERR_OK - Successful
+           QL_ERR_INVALID_ARG - Invalid arguments
+           Other errorcode defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_tone_enable_state(int32_t enable_state,ql_audio_tone_config_t *p_tone_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Get tone enable state
+
+  @param[out] p_enable_state  tone enable state,
+              QL_AUDIO_STATE_0: close, QL_AUDIO_STATE_1:open
+
+  @return  QL_ERR_OK - Successful
+           QL_ERR_INVALID_ARG - Invalid arguments
+           Other errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_tone_enable_state(int32_t *p_enable_state);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_audio_pcm.h b/mbtk/include/ql_v2/ql_audio_pcm.h
new file mode 100755
index 0000000..0ee2941
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_audio_pcm.h
@@ -0,0 +1,525 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_audio_pcm.h
+  @brief playback or capture API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when         who          what, where, why
+  --------     ---          ----------------------------------------------------------
+  2021-11-03   dameng.lin     Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_AUDIO_PCM_H
+#define __QL_AUDIO_PCM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+
+typedef int ql_audio_handle_t;
+
+
+typedef enum QL_AUDIO_STREAM_FORMAT_ENUM
+{
+    QL_AUDIO_STREAM_FORMAT_PCM = 1,         /**< PCM*/
+    QL_AUDIO_STREAM_FORMAT_MP3,             /**< MP3*/
+    QL_AUDIO_STREAM_FORMAT_AMR,             /**< AMR*/
+    QL_AUDIO_STREAM_FORMAT_AMRNB,           /**< AMR-NB*/
+    QL_AUDIO_STREAM_FORMAT_AMRWB,           /**< AMR-WB*/
+}QL_AUDIO_STREAM_FORMAT_E;
+
+
+/**The structure of PCM configuration parameters*/
+typedef struct ql_audio_pcm_config_struct
+{
+    /**  Each sound card maintains a hardware buffer to store audio data. The hardware
+    *  buffer is divided into several periods. The sound card uses period as a unit to transmit data,
+    *  and one period stores some data frames.period_size sets the size of periods in hardware buffer.
+    *  When period_size is set to 0,it means that the period size is calculated by the bottom layer to
+    *  obtain a default value. If period_size is not 0, the recommended value is 128–960. The larger the 
+    *  perod_size is, the larger the kernel overhead is
+    */
+    uint32_t period_size;
+    /**  period_count indicates the count of period that the data occupies, when the application reads data
+    *  from or writes data to the hardware buffer.The size of the data that the application reads from or
+    *  writes to the hardware buffer every time equals period_count multiplied by period_size. The hardware
+    *  buffer has a maximum of 8 periods by default. The recommended value of period_count is 1–3.
+    */  
+    uint32_t period_count;
+    uint32_t num_channels;  /**< Number of channels. 1 Mono 2 Stereo*/
+    uint32_t sample_rate;   /**< Sampling rate. A PCM interface supports 8000 and 16000,and an I2s interface supports 48000.Unit:Hz*/
+    uint32_t pcm_format;        /**< PCM data format.Presently supports 2 only,which means 16-bit little endian format*/
+} ql_audio_pcm_config_t;
+
+#define QL_AUDIO_INVALID_HANDLE  ((ql_audio_handle_t)(void *)NULL)
+
+typedef enum
+{
+    QL_AUDIO_STREAM_DIRECTION_PLAYBACK = 0,
+    QL_AUDIO_STREAM_DIRECTION_CAPTURE,
+    QL_AUDIO_STREAM_DIRECTION_MAX
+}QL_AUDIO_STREAM_DIRECTION_E;
+    
+
+/**The enumeration of the front end PCM device types*/
+typedef enum QL_AUDIO_FE_PCM_DEV_ENUM
+{
+    QL_AUDIO_FE_PCM_DEV_MIN = -1,
+    QL_AUDIO_FE_PCM_DEV_MULTIMEDIA1 = 0,    /**< The first PCM device available for general-purpose audio playback and capturing.*/
+	QL_AUDIO_FE_PCM_DEV_MULTIMEDIA2 = 1,    /**< The sencond PCM device available for general-purpose audio playback and capturing.*/
+	QL_AUDIO_FE_PCM_DEV_MULTIMEDIA3 = 2,    /**< The third PCM device available for general-purpose audio playback and capturing.*/
+	QL_AUDIO_FE_PCM_DEV_MAX
+} QL_AUDIO_FE_PCM_DEV_E;
+
+
+
+typedef enum QL_AUDIO_BE_DAI_ENUM
+{
+    QL_AUDIO_BE_DAI_MIN = -1,
+    QL_AUDIO_BE_DAI_PLAYBACK_PRI_PCM = 0,   /**< Play back audio to the first PCM interface.*/
+    QL_AUDIO_BE_DAI_PLAYBACK_VOICE_TX,      /**< play back audio to the voice call uplink*/
+    QL_AUDIO_BE_DAI_CAPTURE_PRI_PCM,        /**< Capture audio from the first PCM interface*/
+    QL_AUDIO_BE_DAI_CAPTURE_VOICE_UL,       /**< Capture voice stream from voice call uplink*/
+    QL_AUDIO_BE_DAI_CAPTURE_VOICE_DL,       /**< Capture voice stream from voice call downlink*/
+    QL_AUDIO_BE_DAI_MAX
+}QL_AUDIO_BE_DAI_E;
+
+#define QL_AUDIO_BE_DAI_MASK_PLAYBACK_PRI_PCM       (1 << QL_AUDIO_BE_DAI_PLAYBACK_PRI_PCM)
+#define QL_AUDIO_BE_DAI_MASK_PLAYBACK_VOICE_TX      (1 << QL_AUDIO_BE_DAI_PLAYBACK_VOICE_TX)
+#define QL_AUDIO_BE_DAI_MASK_CAPTURE_PRI_PCM        (1 << QL_AUDIO_BE_DAI_CAPTURE_PRI_PCM)
+#define QL_AUDIO_BE_DAI_MASK_CAPTURE_VOICE_UL       (1 << QL_AUDIO_BE_DAI_CAPTURE_VOICE_UL)
+#define QL_AUDIO_BE_DAI_MASK_CAPTURE_VOICE_DL       (1 << QL_AUDIO_BE_DAI_CAPTURE_VOICE_DL)
+
+/**The enumeration of audio playback state*/
+typedef enum  QL_AUDIO_PLAYBACK_STATE_ENUM
+{
+    QL_AUDIO_PLAYBACK_STATE_CLOSE = 0,      /**< Close*/
+    QL_AUDIO_PLAYBACK_STATE_OPEN,           /**< Open*/
+    QL_AUDIO_PLAYBACK_STATE_PREPARE,        /**< Ready*/
+    QL_AUDIO_PLAYBACK_STATE_PLAYING,        /**< Playing*/
+    QL_AUDIO_PLAYBACK_STATE_FINISHED,       /**< Finished*/
+    QL_AUDIO_PLAYBACK_STATE_PAUSE,          /**< Pause*/
+    QL_AUDIO_PLAYBACK_STATE_ERROR,          /**< Error*/
+} QL_AUDIO_PLAYBACK_STATE_E;
+
+/**The enumeration of audio capture state*/
+typedef enum QL_AUDIO_CAPTURE_STATE_ENUM
+{
+    QL_AUDIO_CAPTURE_STATE_CLOSE = 0,       /**< Close*/
+    QL_AUDIO_CAPTURE_STATE_OPEN,            /**< Open*/
+    QL_AUDIO_CAPTURE_STATE_PREPARE,         /**< Prepare*/
+    QL_AUDIO_CAPTURE_STATE_CAPTURING,       /**< Capturing*/
+    QL_AUDIO_CAPTURE_STATE_FINISHED,        /**< Finished*/
+    QL_AUDIO_CAPTURE_STATE_PAUSE,           /**< Pause*/
+    QL_AUDIO_CAPTURE_STATE_ERROR,           /**< Error*/
+} QL_AUDIO_CAPTURE_STATE_E;
+
+
+#define  QL_AUDIO_PLAYBACK_NONBLOCK  0
+#define  QL_AUDIO_PLAYBACK_BLOCK     1
+
+
+/**
+    @brief  The audio capturing state callback function
+    @param  handle Recording handle,which is the return value of ql_audio_capture_open().
+    @param  params Parameters carried by the callback function
+    @param  state  The current audio capturing state.
+*/
+typedef int (*ql_audio_capture_state_cb_f)(ql_audio_handle_t handle, void *params, QL_AUDIO_CAPTURE_STATE_E state);
+
+/**
+    @brief  The playback state callback function
+    @param  handle Playback handle, which is the return value of ql_audio_playback_open().
+    @param  params Parameters carried by the callback function.
+    @param  state  The current playback state.
+*/
+typedef int (*ql_audio_playback_state_cb_f)(ql_audio_handle_t handle, void *params, QL_AUDIO_PLAYBACK_STATE_E state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function opens the audio context for playback.
+
+  @param[in] fe_pcm_dev  Front end PCM device type. defined by QL_AUDIO_FE_PCM_DEV_E
+  @param[in] be_dai_mask  Backend digit audio interface mask, support follow:
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_PRI_PCM  Play back audio to the 1 st PCM interface
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_SEC_PCM  Play back audio to the 2 nd PCM interface
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_PRI_I2S  Play back audio to the 1 st I2S interface
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_SEC_I2S  Play back audio to the 2 nd I2S interface
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_VOICE_TX Play back audio to the voice call uplink
+
+  @retval  A_valid_handle   Successful execution.
+  @retval  QL_AUDIO_INVALID_HANDLE  Failed execution.Invalid handle
+  */
+/*-----------------------------------------------------------------------------------------------*/
+ql_audio_handle_t ql_audio_playback_open(QL_AUDIO_FE_PCM_DEV_E fe_pcm_dev, uint32_t be_dai_mask);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function prepares for audio file playback.
+
+  @param[in] handle     The handle returned by ql_audio_playback_open().
+  @param[in] file_name  The name of the file to be played back.
+  @param[in] pcm_config  Pcm config, including sample rate, channel nums,
+             defined by ql_audio_pcm_config_t. Generally, it is NULL.
+  @param[in] playback_state_cb  Callback function to report the current playback state 
+             The states defined by QL_AUDIO_PLAYBACK_STATE_E
+  @param[in] params Parameters carried by the callback function.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note   Before calling this function, call ql_audio_playback_open() first to obtain a handle.
+          If an audio file is expected to be played back, call this function first to prepare for
+          the playback and then ql_audio_playback_play() to start playback.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_file_prepare(ql_audio_handle_t handle,
+                                   const char *file_name,
+                                   ql_audio_pcm_config_t *pcm_config,
+                                   ql_audio_playback_state_cb_f playback_state_cb,
+                                   void *params);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function prepares for audio stream playback.
+
+  @param[in] handle  The API ql_audio_playback_open return results
+  @param[in] pcm_config  Pcm config, including sample rate, channel nums,
+             defined by ql_audio_pcm_config_t. If it is NULL, the API use defaule value.
+  @param[in] playback_state_cb  Callback function to report the current playback state.
+  @param[in] params  Parameters carried by the callback function.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note   Before calling this function, call ql_audio_playback_open() first to obtain a handle.
+          If an audio stream is expected to be played back, call this function first to prepare
+          for the audio stream playback and then ql_audio_playback_push_stream() to start playback.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_stream_prepare(ql_audio_handle_t handle,
+                                     ql_audio_pcm_config_t *pcm_config,
+                                     ql_audio_playback_state_cb_f playback_state_cb,
+                                     void *params);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function starts playback of the audio data. 
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Before calling this function, call ql_audio_playback_file_prepare() first to prepare the audio file
+            to be played back, otherwise the audio data cannot be played back successfully.This function also supports
+            playback of audio stream data. In this case, call ql_audio_playback_stream_prepare() first to prepare
+            the audio stream to be played back, then this function to start playback, and finally
+            ql_audio_playback_push_stream() to play back the audio stream in buffer.
+ */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_play(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function plays back the audio stream in buffer.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+  @param[in] stream_buf  The buffer that stores the audio stream to be played back.
+  @param[in] buf_size  The size of the audio stream to be played back. Unit: Byte.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_push_stream(ql_audio_handle_t handle, void *stream_buf, uint32_t buf_size);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function pauses the audio playback. 
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_pause(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function resumes the audio playback. 
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_resume(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function stops the audio playback. 
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_stop(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function closes the audio context for playback. 
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @Note     After an audio playback ends, you must call this function to close the audio context,
+            otherwise subsequent call of ql_audio_playback_open() will fail.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_close(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function gets the audio playback state.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+  @param[out] playback_state  the current audio playback state, defined by QL_AUDIO_PLAYBACK_STATE_E
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_get_state(ql_audio_handle_t handle, QL_AUDIO_PLAYBACK_STATE_E *playback_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function sets the block flag for audio playback.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+  @param[in] flags  block flag, including QL_AUDIO_PLAYBACK_NONBLOCK and QL_AUDIO_PLAYBACK_BLOCK
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_ARG   Illegal argument.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Call this function as per the function call sequence below, to make sure the audio playback can be blocked successfully.
+                1) ql_audio_playback_open()
+                2) ql_audio_playback_set_block_flag()
+                3) ql_audio_playback_file_prepare()
+                4) ql_audio_playback_play()
+            If the audio playback is blocked successfully by calling ql_audio_playback_set_block_flag(), then
+                1) If you dial a call or there is an incoming call during the audio playback, the playback will pause;
+                    after the call is hung up, the playback resumes automatically.
+                2) During a voice call, no function can be used to realize audio playback. In this case,
+                    the call of ql_auido_palyback_file_prepare() will fail, which means audio files cannot be played back.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_set_block_flag(ql_audio_handle_t handle, uint8_t flags);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function opens the audio context for capturing.
+
+  @param[in] fe_pcm_dev     Front end PCM device type.
+  @param[in] be_dai_mask    Back end DAI mask,support follow:
+             QL_AUDIO_BE_DAI_MASK_CAPTURE_PRI_PCM
+             QL_AUDIO_BE_DAI_MASK_CAPTURE_VOICE_UL
+             QL_AUDIO_BE_DAI_MASK_CAPTURE_VOICE_DL
+
+@retval  A_valid_handle     Successful execution
+@retval  QL_AUDIO_INVALID_HANDLE    Failed execution.Invalid handle
+  */
+/*-----------------------------------------------------------------------------------------------*/
+ql_audio_handle_t ql_audio_capture_open(QL_AUDIO_FE_PCM_DEV_E fe_pcm_dev, uint32_t be_dai_mask);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function prepares for audio file capturing.
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+  @param[in] file_name  The name of the audio file to be captured.
+  @param[in] type  The format of the audio data in the audio file.
+  @param[in] pcm_config  Pcm config, including sample rate, channel nums,
+             defined by ql_audio_pcm_config_t, If it is NULL, the API use defaule value
+  @param[in] capture_state_cb   Callback function to report the current audio capturing state.
+  @param[in] params     Parameters carried by the callback function.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Before calling this function, call ql_audio_capture_open() first to obtain a handle.
+            If an audio file is expected to be captured, call this function first to prepare for the audio file
+            capturing and then ql_audio_capture_record() to start capturing.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_file_prepare(ql_audio_handle_t handle,
+                                  const char *file_name,
+                                  QL_AUDIO_STREAM_FORMAT_E type,
+                                  ql_audio_pcm_config_t *pcm_config,
+                                  ql_audio_capture_state_cb_f capture_state_cb,
+                                  void *params);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function prepares for audio stream capturing. 
+
+  @param[in] handle  This function prepares for audio stream capturing.
+  @param[in] pcm_config     PCM configuration parameters. 
+  @param[in] capture_state_cb   Callback function to report the current audio capturing state.
+  @param[in] params     Parameters carried by the callback function. 
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Before calling this function, call ql_audio_capture_open() first to obtain a handle.
+            If an audio stream is expected to be captured, call this function first to prepare for
+            the audio stream capturing and then ql_audio_capture_push_stream() to start capturing.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_stream_prepare(ql_audio_handle_t handle,
+                                    ql_audio_pcm_config_t *pcm_config,
+                                    ql_audio_capture_state_cb_f capture_state_cb,
+                                    void *params);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function starts to capture the audio data. 
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note Before calling this function, call ql_audio_capture_file_prepare() first to prepare the audio
+        file to be captured, otherwise the audio data cannot be captured successfully.This function also
+        supports capturing of audio stream data. In this case, call ql_audio_capture_stream_prepare()
+        first to prepare the audio stream to be captured, then this function to start capturing,
+        and finally ql_audio_capture_pull_stream() to capture the audio stream in buffer.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_record(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function captures the audio stream data to the buffer.
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+  @param[out] stream_buf  The buffer that stores the audio stream data to be captured.
+  @param[in] buf_size  Buffer size. Unit: Byte.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_pull_stream(ql_audio_handle_t handle, void *stream_buf, uint32_t buf_size);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function pauses the audio capturing. 
+
+  @param[in] handle     The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_pause(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function resumes the audio capturing. 
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_resume(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function stops the audio capturing. 
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Calling this function will stop audio capturing regardless of whether the capturing is in
+            progress or paused,and the capturing cannot be resumed after it is stopped.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_stop(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function closes the audio context for capturing.
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  @note     After audio capturing ends, you must call this function to close the audio context,
+            otherwise subsequent call of ql_audio_capture_open() will fail.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_close(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function gets the current audio capturing state.
+
+  @param[in] handle     The handle returned by ql_audio_capture_open().
+  @param[out] capture_state  The current audio capturing state.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_audio_capture_get_state(ql_audio_handle_t handle, QL_AUDIO_CAPTURE_STATE_E *capture_state);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_cell_locator.h b/mbtk/include/ql_v2/ql_cell_locator.h
new file mode 100755
index 0000000..af5102a
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_cell_locator.h
@@ -0,0 +1,188 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file  ql_cell_locator.h
+  @brief cell_locator service API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20220810    sunshine     Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_CELL_LOCATOR_H__
+#define __QL_CELL_LOCATOR_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+
+typedef struct 
+{
+    char *ptr;
+    size_t len;
+} curl_rsp_msg_t;
+
+
+
+typedef struct
+{
+    double   latitude;
+    double   longitude;
+    double   altitude;
+} ql_inject_location_t;
+
+typedef struct
+{
+    /*longtitude*/
+    double lon;
+    /*latitude*/
+    double lat;
+    /*accuracy*/
+    unsigned short accuracy;
+
+    char err_msg[256];
+} ql_perform_rsp;
+
+typedef void (*ql_cell_locator_ind_cb_f)(void *msg);
+
+typedef void (*ql_cell_locator_error_cb_f)(int error);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the cell_locator client
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_init(void);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set locator query server and port, server length must be less than 255 bytes.
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_server(char *server, uint16_t port);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set locator query timeout, the value must between 1-300 [seconds]
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_timeout(uint16_t timeout);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set locator query token, token length must be 16 bytes. the token Used to verify that 
+         the client accessing the service is valid.
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_token(char *token);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Register cell_locator callback
+  @param[in] cb
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_ind_cb(ql_cell_locator_ind_cb_f cb);
+
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_service_error_cb(ql_cell_locator_error_cb_f cb);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize the  cell_locator client
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief cell_locator start
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_start(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief cell_locator stop
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_stop(void);
+
+int ql_cell_locator_perform(ql_perform_rsp *rsp_ptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_data_call.h b/mbtk/include/ql_v2/ql_data_call.h
new file mode 100755
index 0000000..978516b
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_data_call.h
@@ -0,0 +1,528 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_data_call.h
+  @brief Data service API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20181024   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_DATA_CALL_H__
+#define __QL_DATA_CALL_H__
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "ql_net_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void ql_data_call_param_t;
+
+typedef struct
+{
+    int call_id;
+    char call_name[QL_NET_MAX_NAME_LEN + 1];
+    QL_NET_IP_VER_E ip_ver;
+    QL_NET_DATA_CALL_STATUS_E call_status;
+    char device[QL_NET_MAX_NAME_LEN + 1];
+    uint8_t has_addr;  /**< Valid when data call state is connected*/
+    ql_net_addr_t addr;
+    uint8_t has_addr6; /**< Valid when data call state is connected*/
+    ql_net_addr6_t addr6;
+    int call_end_reason_type;  /**< Last data call disconnect reason type */
+    int call_end_reason_code;  /**< Last data call disconnect reason code */
+} ql_data_call_status_t;
+
+typedef struct
+{
+    int call_id;
+    char call_name[QL_NET_MAX_NAME_LEN + 1];
+} ql_data_call_item_t;
+
+typedef struct
+{
+    QL_NET_IP_VER_E ip_ver;
+    QL_NET_AUTH_PREF_E auth_pref;
+    char apn_name[QL_NET_MAX_APN_NAME_LEN + 1];
+    char username[QL_NET_MAX_APN_USERNAME_LEN + 1];
+    char password[QL_NET_MAX_APN_PASSWORD_LEN + 1];
+} ql_data_call_apn_config_t;
+
+typedef struct
+{
+    uint64_t tx_pkts;
+    uint64_t tx_bytes;
+    uint64_t tx_dropped_pkts;
+    uint64_t rx_pkts;
+    uint64_t rx_bytes;
+    uint64_t rx_dropped_pkts;
+}ql_data_call_pkt_stats_t;
+
+typedef void (*ql_data_call_status_ind_cb_f)(int call_id,
+        QL_NET_DATA_CALL_STATUS_E pre_call_status,
+        ql_data_call_status_t *p_msg);
+
+typedef void (*ql_data_call_service_error_cb_f)(int error);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call service
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Create a data call instance
+  @param[in] call_id The unique identifier of the data call instance, specified by the user
+  @param[in] call_name Friendly data call name,  specified by the user
+  @param[in] is_background Whether the data call status is maintained by the data call service daemon.
+  If it is 0, the data call instance will be deleted after the data call process exits.
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_create(int call_id, const char *call_name, int is_background);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Alloc for a data call configuration instance
+  @return
+  NULL - Not enough memory
+  Other - successful
+  */
+/*-----------------------------------------------------------------------------------------------*/
+ql_data_call_param_t *ql_data_call_param_alloc(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_init(ql_data_call_param_t *param);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Release the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_free(ql_data_call_param_t *param);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Bind APN ID, range:1-16
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_id APN ID, range:1-16
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_apn_id(ql_data_call_param_t *param, int apn_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN ID
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_apn_id(ql_data_call_param_t *param, int *apn_id);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN name
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_name APN name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_apn_name(ql_data_call_param_t *param, const char *apn_name);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN name buffer
+  @param[in] buf_len APN name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_apn_name(ql_data_call_param_t *param, char *buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user name
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_name APN user name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_user_name(ql_data_call_param_t *param, const char *user_name);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user name buffer
+  @param[in] buf_len APN user name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_user_name(ql_data_call_param_t *param, char *buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user password
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_password APN user password
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_user_password(ql_data_call_param_t *param, const char *user_password);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user password from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user password buffer
+  @param[in] buf_len APN user password buffer size
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_user_password(ql_data_call_param_t *param, char *buf, int buf_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[in] auth_pref Defined by QL_DATA_CALL_AUTH_PREF_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_auth_pref(ql_data_call_param_t *param, int auth_pref);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_data Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_auth_pref(ql_data_call_param_t *param, int *p_data);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call IP version
+  @param[in] param Point to the data call configuration instance
+  @param[in] ip_ver Defined by QL_NET_IP_VER_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_ip_version(ql_data_call_param_t *param, int ip_ver);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get IP version from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_ver Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_ip_version(ql_data_call_param_t *param, int *p_ver);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection mode
+  @param[in] param Point to the data call configuration instance
+  @param[in] mode Defined by QL_NET_DATA_CALL_RECONNECT_MODE_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_reconnect_mode(ql_data_call_param_t *param, int reconnect_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection mode from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_mode Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_reconnect_mode(ql_data_call_param_t *param, int *p_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection interval
+  @param[in] param Point to the data call configuration instance
+  @param[in] time_list Interval time list in ms
+  @param[in] num Number of time list
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_reconnect_interval(ql_data_call_param_t *param, int *time_list, int num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection interval from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] time_list Store return value
+  @param[in,out] p_num
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_reconnect_interval(ql_data_call_param_t *param, int *time_list, int *p_num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the specified data call instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_config(int call_id, ql_data_call_param_t *param);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the specified data call configuration instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_config(int call_id, ql_data_call_param_t *param);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Start data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_start(int call_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Stop data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_stop(int call_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Delete a data call instance
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_delete(int call_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the current data call instance list
+  @param[out] list Data call instance array
+  @param[in,out] list_len, in-> Data call instance array size, out->current data call instance number
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_list(ql_data_call_item_t *list, int *list_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the data call status
+  @param[in] call_id Specify a data call instance
+  @param[out] p_sta Point to status instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_status(int call_id, ql_data_call_status_t *p_sta);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Register data call status change event
+  @param[in] cb
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_status_ind_cb(ql_data_call_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set APN related configuration.If the apn does not exist, it is automatically created.
+  @param[in] apn_id APN ID, range:1-16
+  @param[in] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_apn_config(int apn_id, ql_data_call_apn_config_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set APN related configuration. If the apn does not exist, it is automatically created and
+  the default parameters are set.
+  @param[in] apn_id APN ID, range:1-16
+  @param[out] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_apn_config(int apn_id, ql_data_call_apn_config_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set APN related configuration,APN ID:1
+  @param[in] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_attach_apn_config(ql_data_call_apn_config_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally,
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_service_error_cb(ql_data_call_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize the data call service
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_deinit(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_dm.h b/mbtk/include/ql_v2/ql_dm.h
new file mode 100755
index 0000000..e45910b
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_dm.h
@@ -0,0 +1,622 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_dm.h 
+  @brief device management API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200316   stan.li      Optimize the ql_dm_get_modem_state interface
+  20191224   stan.li      Add radio on/off API
+  20190625   stan.li      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_DM_H__
+#define __QL_DM_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define QL_DM_IMEI_MAX_LEN             32
+#define QL_DM_MEID_MAX_LEN             32
+#define QL_DM_FIRMWARE_REV_MAX_LEN     256
+#define QL_DM_NV_ITEM_NAME_MAX_LEN     127
+#define QL_DM_NV_ITEM_VALUE_MAX_LEN    2048
+
+//enable
+#define QL_DM_QOOS_ENABLE_MAX          2
+#define QL_DM_QOOS_ENABLE_MIN          0
+
+//pre_time
+#define QL_DM_QOOS_PRE_TIME_MAX        600
+#define QL_DM_QOOS_PRE_TIME_MIN        1
+
+//sleep_time
+#define QL_DM_QOOS_SLEEP_TIME_MAX      (60*60*12)
+#define QL_DM_QOOS_SLEEP_TIME_MIN      1
+
+//acq_time
+#define QL_DM_QOOS_ACQ_TIME_MAX        600
+#define QL_DM_QOOS_ACQ_TIME_MIN        1
+
+//cir_cnt
+#define QL_DM_QOOS_CIR_CNT_MAX         255
+#define QL_DM_QOOS_CIR_CNT_MIN         1
+
+//sleep_step
+#define QL_DM_QOOS_SLEEP_STEP_MAX      60
+#define QL_DM_QOOS_SLEEP_STEP_MIN      0
+
+//acq_step
+#define QL_DM_QOOS_ACQ_STEP_MAX        60
+#define QL_DM_QOOS_ACQ_STEP_MIN        0        
+
+//adj_cnt
+#define QL_DM_QOOS_ADJ_CNT_MAX         5
+#define QL_DM_QOOS_ADJ_CNT_MIN         0
+
+//idle_interval
+#define QL_DM_QOOS_IDLE_INTERVAL_MAX   60
+#define QL_DM_QOOS_IDLE_INTERVAL_MIN   1
+
+typedef enum QL_DW_AIR_PLANE_MODE_TYPE_ENUM
+{
+    QL_DM_AIR_PLANE_MODE_UNKNOWN   = 0,    /**<  Radio online. */
+    QL_DM_AIR_PLANE_MODE_ON        = 1,    /**<  Radio power off or unknown. Airplane ON. */
+    QL_DM_AIR_PLANE_MODE_OFF       = 2,    /**<  Radio online. Airplane OFF. */
+    QL_DM_AIR_PLANE_MODE_NA        = 3     /**<  Radio Unvailable. */
+}QL_DM_AIR_PLANE_MODE_TYPE_E;
+
+/** modified by kin.tan@20210125 start: matching modem state sent by service **/
+typedef enum QL_DM_MODEM_STATE_TYPE_ENUM
+{
+    QL_DM_MODEM_STATE_OFFLINE = 0,
+    QL_DM_MODEM_STATE_ONLINE = 1,
+    QL_DM_MODEM_STATE_UNKNOWN = 2
+}QL_DM_MODEM_STATE_TYPE_E;
+/** modified by kin.tan@20210125 end: matching modem state sent by service **/
+
+typedef enum QL_DM_QOOS_ENABLE_TYPE_ENUM
+{
+    QL_DM_QOOS_ENABLE_STATE_OFF           = 0,  /**<  close QOOS function. */
+    QL_DM_QOOS_ENABLE_STATE_ON_NO_SERVICE = 1,  /**<  open QOOS function */
+}QL_DM_QOOS_ENABLE_TYPE_E;
+
+/** bind subscription */
+typedef enum QL_DM_BIND_SUB_TYPE_ENUM
+{
+  QL_DM_BIND_SUB_PRIMARY = 0, 
+  QL_DM_BIND_SUB_SECONDARY = 1, 
+}QL_DM_BIND_SUB_TYPE_E;
+
+/** boot up reason */
+typedef enum QL_DM_BOOT_UP_REASON_ENUM
+{
+    QL_DM_BOOT_UP_INVALID    = -1,
+    QL_DM_BOOT_UP_HARD_RESET = 0,
+    QL_DM_BOOT_UP_SMPL       = 1,
+    QL_DM_BOOT_UP_RTC        = 2,
+    QL_DM_BOOT_UP_DC_CHG     = 3,
+    QL_DM_BOOT_UP_USB_CHG    = 4,
+    QL_DM_BOOT_UP_PON1       = 5,
+    QL_DM_BOOT_UP_CBLPWR_N   = 6,
+    QL_DM_BOOT_UP_KPDPWR_N   = 7,
+}QL_DM_BOOT_UP_REASON_E;
+
+/** shutdown reason */
+typedef enum QL_DM_SHUTDOWN_REASON_ENUM
+{
+    QL_DM_SHUTDOWN_INVALID          = -1,
+    QL_DM_SHUTDOWN_SOFT             = 0,
+    QL_DM_SHUTDOWN_PS_HOLD          = 1,
+    QL_DM_SHUTDOWN_PMIC_WD          = 2,
+    QL_DM_SHUTDOWN_GP1              = 3,
+    QL_DM_SHUTDOWN_GP2              = 4,
+    QL_DM_SHUTDOWN_KPDPWR_AND_RESIN = 5,
+    QL_DM_SHUTDOWN_RESIN_N          = 6,
+    QL_DM_SHUTDOWN_KPDPWR_N         = 7,
+}QL_DM_SHUTDOWN_REASON_E;
+
+
+// typedef struct {
+//     uint16_t pre_time;      /**<  the upper limit of the first search time, range is 1 to 600, default value is 180, in seconds. */
+//     uint16_t sleep_time;    /**<  the first sleep time, range is 1 to 43200, default value is 30, in seconds. */
+//     uint16_t acq_time;      /**<  the first search time, range is 1 to 600, default value is 20, in seconds. */
+//     uint8_t cir_cnt;        /**<  the number of sleep->search cycle, range is 5 to 255, default value is 10, in seconds. */
+//     uint8_t sleep_step;     /**<  the sleep time increment, range is 0 to 60, default vaue is 15, in seconds. */
+//     uint8_t acq_step;       /**<  the acq time increment, range is 0 to 60, default value is 0, in seconds. */
+//     uint8_t adj_cnt;        /**<  the adjustment times for sleep-search cylce, range is 0 to 5, default value is 2, in seconds. */
+//     uint8_t idle_interval;  /**<  when the module is registered, check whether the module if offline, range is 1 to 60,default value is 1, in seconds. */
+// }ql_dm_qoos_config_t;
+
+
+typedef struct {
+    char enable;
+    int phase[3];
+}ql_dm_qoos_config_t;
+
+typedef struct 
+{
+    uint8_t imei_valid; 
+    char imei[QL_DM_IMEI_MAX_LEN + 1];    /**<  imei.*/
+    uint8_t imei2_valid; 
+    char imei2[QL_DM_IMEI_MAX_LEN + 1];    /**<  imei2.*/
+    uint8_t meid_valid; 
+    char meid[QL_DM_MEID_MAX_LEN + 1];    /**<  meid.*/
+}ql_dm_device_serial_numbers_info_t;
+
+
+typedef void (*ql_dm_air_plane_mode_ind_cb)(QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode);
+
+typedef void (*ql_dm_modem_state_ind_cb)(int modem_state);
+
+typedef void (*ql_dm_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize DM service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the DM service was successfully intialized.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_init(void);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Denitialize DM service.
+  @return Whether the DM service was successfully deintialized.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device software version.
+  @param[out] soft_ver Return software version
+  @param[in] soft_ver_len The length of soft_ver
+  @return Whether to successfully get the software version
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_software_version(char *soft_ver, int soft_ver_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem state.
+  @details QL_DM_MODEM_STATE_ONLINE,if modem starts normally.
+  @details QL_DM_MODEM_STATE_OFFLINE,in modem starts abnormally.
+  @details QL_DM_MODEM_STATE_UNKNOWN,unknown error.
+  @param[out] modem_state The state of modem
+  @return Whether to successfully get the modem state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_modem_state(QL_DM_MODEM_STATE_TYPE_E *modem_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register modem state event.
+  @param[in] cb_func modem state indication callback function
+  @return Whether the modem state event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_modem_state_change_ind_cb(ql_dm_modem_state_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get module temperature.
+  @param[out] temperature The current temperature
+  @return Whether to successfully get the temperature
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_temperature(float *temperature);
+
+    
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device serial numbers.
+  @param[out] p_info Pointer that point to ql_dm_device_serial_numbers_info_t
+  @return Whether to successfully get the serial numbers
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_device_serial_numbers(ql_dm_device_serial_numbers_info_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device firmware revision identification.
+  @param[out] firmware_rev_id Return device firmware revision id
+  @param[in] firmware_rev_id_len The length of firmware_rev_id
+  @return Whether to successfully get the firmware revision id
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_device_firmware_rev_id(char *firmware_rev_id, int firmware_rev_id_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get air plane mode.
+  @param[out] p_info Pointer that point to QL_DM_AIR_PLANE_MODE_TYPE_E
+  @return Whether to successfully get the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_air_plane_mode(QL_DM_AIR_PLANE_MODE_TYPE_E *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set air plane mode.
+  @param[in] air_plane_mode 1:ON, 2:OFF
+  @return Whether to successfully set the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_air_plane_mode(QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register air plane mode event.
+  @param[in] cb_func Air plane mode indication callback function
+  @return Whether the air plane mode event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_air_plane_mode_ind_cb(ql_dm_air_plane_mode_ind_cb cb_func);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get cpu occupancy.
+  @param[out] cpu_occupancy The percentage of cpu occupancy
+  @return Whether to successfully get the cpu occupancy
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_cpu_occupancy(float *cpu_occupancy);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get mem usage.
+  @param[out] mem_use The percentage of mem usage
+  @return Whether to successfully get the memory usage
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_mem_usage(float *mem_use);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get NV item value.
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[out] nv_item_value The NV value buf of nv_item_name
+  param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully get the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len, 
+        int *nv_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set NV item value.
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[in] nv_item_value The NV value of nv_item_name
+  @param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully set the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len, 
+        int *nv_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio on, its function is the same as at+cfun=1.
+  @return Whether to successfully set the radio on
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_radio_on(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio off, its function is the same as at+cfun=0.
+  @return Whether to successfully set the radio off
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_radio_off(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem mem and CPU utilization.
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_modem_cpu_occupancy(float *cpu_occupancy);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem mem utilization.
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_modem_mem_usage(float *mem_use);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS enable state
+  @param[out] enable The enable state of QOOS
+  @return Whether to successfully get the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_qoos_enable(char *enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS enable state
+  @param[in] enable The enable state of QOOS
+  @return Whether to successfully set the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_qoos_enable(char enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS configuration
+  @param[out] config The configuration of QOOS
+  @return Whether to successfully get the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_dm_get_qoos_config(ql_dm_qoos_config_t *config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS configuration
+  @param[in] config The configuration of QOOS
+  @return Whether to successfully set the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_dm_set_qoos_config(ql_dm_qoos_config_t config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get MSSR(Modem SubSysem Reset) level.
+  @param[out] p_level The MSSR level
+  @return Whether to successfully get the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_mssr_level(int *p_level);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set MSSR(Modem SubSysem Reset) level.
+  @param[in] level The MSSR level
+  @return Whether to successfully set the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_mssr_level(int level);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  bind subscription 
+  @param[in] sub_type subscription type 
+  @return Whether to successfully bind subscription.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_bind_subscription(QL_DM_BIND_SUB_TYPE_E sub_type);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_service_error_cb(ql_dm_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get module the last time shutdown reason 
+  @param[out] shutdown_reason the shutdown reason
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_shutdown_reason(QL_DM_SHUTDOWN_REASON_E *shutdown_reason);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get module this time bootup reason 
+  @param[out] bootup_reason the bootup reason
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_bootup_reason(QL_DM_BOOT_UP_REASON_E *bootup_reason);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set oos config 
+  @param[out] oos param
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_qoos_config(int p1, int p2, int p3);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief get oos config 
+  @param[out] oos param
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_qoos_config(int *p1, int *p2, int *p3);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set oos enable 
+  @param[out] oos param
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_qoos_enable(char enable);
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_ecall.h b/mbtk/include/ql_v2/ql_ecall.h
new file mode 100755
index 0000000..04b0951
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_ecall.h
@@ -0,0 +1,561 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_ecall.c
+  @brief Ecall APIs
+*/
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who                 what, where, why
+  --------   ---                 ----------------------------------------------------------
+  202306xx   Lyndsay.Xie         Created .
+-------------------------------------------------------------------------------------------------*/
+#ifndef __ECALL_H__
+#define __ECALL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#include <time.h>
+#include "ql_asn1Msd.h"
+#include "ql_ms_voice.h"
+#include "ql_type.h"
+// #include "ql_voice.h"
+
+#define ASSERT(condition) \
+        if (!(condition)) { LOGE("Assert Failed: '%s'", #condition);}
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * Unlimited dial attempts for eCall session (used for PAN-European system)
+ */
+//--------------------------------------------------------------------------------------------------
+#define UNLIMITED_DIAL_ATTEMPTS      UINT32_MAX
+#define QL_VOICE_MAX_ECALL_MSD       (140)
+
+typedef enum
+{
+    QL_ECALL_TX_MODE_PULL           = 0, /**< Pull mode (modem/host waits for MSD request from PSAP to send MSD). */
+    QL_ECALL_TX_MODE_PUSH           = 1  /**< Push mode (modem/host sends MSD to PSAP right after eCall is connected). */
+} QL_ECALL_MSD_TX_MODE_E;
+
+typedef enum
+{
+    QL_ECALL_RESET_SESSION_NONE     = 0,
+    QL_ECALL_RESET_SESSION_AUTOANSWER= 1, /**< Reset the ecall session to allow automatic answering of calls
+                                          * It can only be enabled once after calling ql_ecall_init() == OK*/
+    QL_ECALL_RESET_SESSION_MAX      = 0xff
+
+} QL_ECALL_RESET_SESSION_MODE_E;
+
+typedef struct
+{
+    uint8_t  t5_timeout_ms_valid;
+    uint16_t t5_timeout_ms;
+
+    uint8_t  t6_timeout_ms_valid;
+    uint16_t t6_timeout_ms;
+
+    uint8_t  t7_timeout_ms_valid;
+    uint16_t t7_timeout_ms;
+
+    uint8_t  autoAnswer_timeout_ms_valid;       // callback
+    uint32_t autoAnswer_timeout_ms;  // default 3600000 ms (1 hour)
+
+    uint8_t  dialDurationTimer_timout_ms_valid; // dial
+    uint32_t dialDurationTimer_timout_ms;
+
+    uint8_t  maxDialAttempts_valid; // redialcnt
+    uint32_t maxDialAttempts;
+
+    uint8_t  intervalBetweenAttempts_valid;
+    uint16_t intervalBetweenAttempts;
+
+    uint8_t  resetEcallSessionMode_valid;
+    uint8_t  resetEcallSessionMode;
+} ql_ecall_config_t;
+
+typedef void (*ql_ecall_user_ind_f)(int ind, void *userdata);
+
+typedef enum{
+    QL_ECALL_MAKE_ECALL_TYPE_TEST = 0,
+    QL_ECALL_MAKE_ECALL_TYPE_RECONFIG = 1,
+    QL_ECALL_MAKE_ECALL_TYPE_MANUAL = 2,
+    QL_ECALL_MAKE_ECALL_TYPE_AUTOMATIC = 3,
+}QL_ECALL_MAKE_ECALL_TYPE;
+
+/** eCall mode */
+typedef enum {
+    QL_ECALL_MODE_NORMAL  = 0, /**< eCall enabled normal mode. */
+    QL_ECALL_MODE_ONLY    = 1, /**< eCall-only mode. */
+    QL_ECALL_MODE_DEFAULT = 2,
+} QL_ECALL_MODE_E;
+
+typedef enum
+{
+    QL_ECALL_EVENT_SENDING_START                = 1,
+    QL_ECALL_EVENT_SENDING_MSD                  = 2,
+    QL_ECALL_EVENT_LLACK_RECEIVED               = 3,
+    QL_ECALL_EVENT_ALLACK_POSITIVE_RECEIVED     = 4,
+    QL_ECALL_EVENT_ALLACK_CLEARDOWN_RECEIVED    = 5,
+    QL_ECALL_EVENT_ACTIVE                       = 11,
+    QL_ECALL_EVENT_DISCONNECTED                 = 12,
+    QL_ECALL_EVENT_ABNORMAL_HANGUP              = 15,
+    // QL_ECALL_EVENT_IMS_MSD_ACK = 0x0014,
+    // QL_ECALL_EVENT_IMS_UPDATE_MSD,
+    QL_ECALL_EVENT_ONLY_DEREGISTRATION          = 31,
+    QL_ECALL_EVENT_MAY_DEREGISTRATION           = 32,
+    QL_ECALL_EVENT_PSAP_CALLBACK_START          = 40,
+
+    QL_ECALL_EVENT_ECALL_STARTED                = 260,
+    QL_ECALL_EVENT_INCOMING_CALL                = 261,
+    QL_ECALL_EVENT_T2_TIMEOUT                   = 262,
+    QL_ECALL_EVENT_T5_TIMEOUT                   = 263,
+    QL_ECALL_EVENT_T6_TIMEOUT                   = 264,
+    QL_ECALL_EVENT_T7_TIMEOUT                   = 265,
+    QL_ECALL_EVENT_DIAL_DURATION_TIMEOUT        = 266,
+    QL_ECALL_EVENT_INTERVAL_TIMEOUT             = 267,
+    QL_ECALL_EVENT_AUTO_ANSWER_TIMEOUT          = 268,
+
+    // TO DO - add customer app events
+} QL_ECALL_EVENT_E;
+
+// TODO: Will be used potentially. If not remove it!
+// QL_ERR_MSD_RESULT_E QL_Set_MsdMessageData(msd_Message_t *pMsdMsg);
+// QL_ERR_MSD_RESULT_E QL_Set_EraGlonassData(msd_EraGlonassData_t *pEraGlonassData);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set the system standard.
+  @param[in] system_std system standard which can be set to PAN-European or ERA-GLONASS.
+  @return Whether the system standard was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_set_system_std(ECALL_SYSTEM_STD_E system_std);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Get the system standard.
+  @param[out] system_std pointer to system standard which can be PAN-European or ERA-GLONASS.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_get_system_std(ECALL_SYSTEM_STD_E* system_std);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set the MSD version.
+  @param[in] msd_version MSD version which can be set to ASN1_ECALL_MSD_VERSION_1 or ASN1_ECALL_MSD_VERSION_2
+  @return Whether the MSD version was set successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_VERSION unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_set_msd_version(uint8_t msd_version);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Get the MSD version.
+  @param[out] msd_version pointer to MSD version.
+  @return Whether the MSD version was get successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_VERSION unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_get_msd_version(uint8_t* msdVersionPtr);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets MSD's testCall field.
+  @param[in] testCall MSD call type: true = Test call false = Emergency
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_set_msd_call_type(bool testCall);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets MSD's testCall field.
+  @param[out] testCall pointer to MSD call type: true = Test call false = Emergency
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_get_msd_call_type(bool* testCall);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets VehicleType.
+  @param[in] vehicleType vehicle type
+  @return Whether the vehicleType was set successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_BADPARM unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_set_msd_vehicle_type(uint8_t vehicleType);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets VehicleType.
+  @param[out] vehicleType pointer to vehicle type
+  @return Whether the vehicleType was get successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_BADPARM unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_get_msd_vehicle_type(uint8_t* vehicleType);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets Vehicle Identification Number
+  @param[in] vin vehicle identification number
+  @return Whether the vehicle identification number was set successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_VEH_IDENTIFI_NUMBER unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_set_msd_vin(msd_Vin_t vin);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets Vehicle Identification Number
+  @param[out] vin pointer to vehicle identification number
+  @return Whether the vehicle identification number was get successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_VEH_IDENTIFI_NUMBER unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_get_msd_vin(msd_Vin_t* vin);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets Propulsion Type.
+  @param[in] PropulsionType propulsion type.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_set_msd_propulsion_type(uint8_t PropulsionType);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets Propulsion Type.
+  @param[out] PropulsionType pointer to propulsion type.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_get_msd_propulsion_type(uint8_t* PropulsionType);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets number of passangers.
+  @param[in] numberOfPassengers number of passangers.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_set_msd_passengers_count(uint8_t numberOfPassengers);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets vehicle location.
+  @param[in] isTrusted true if the position can be trusted, false otherwise.
+  @param[in] latitude latitude of vehicle's location.
+  @param[in] longitude longitude of vehicle's location.
+  @param[in] direction direction of vehicle's location.
+  @return Whether the vehicle location was set successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_LATITUDE latitude unsupported value.
+  @retval QL_ERR_MSD_LONGITUDE longitude unsupported value.
+  @retval QL_ERR_MSD_VEH_DIRECTION direction unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_set_msd_position(bool isTrusted, int32_t latitude, int32_t longitude, int32_t direction);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set the position Delta N-1 from position set in ql_ecall_set_msd_position() transmitted by the MSD.
+  @param[in] latitudeN2 latitude delta from position set in ql_ecall_set_msd_position().
+  @param[in] longitudeN2 longitude delta from position set in ql_ecall_set_msd_position().
+  @return Whether the vehicle location delta was set successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_LATITUDE delta latitude unsupported value.
+  @retval QL_ERR_MSD_LONGITUDE delta longitude unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_set_msd_position_n1(int32_t latitudeDeltaN1, int32_t longitudeDeltaN1);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set the position Delta N-2 from position set in ql_ecall_set_msd_position() transmitted by the MSD.
+  @param[in] latitudeN2 latitude delta from position set in ql_ecall_set_msd_position_n1().
+  @param[in] longitudeN2 longitude delta from position set in ql_ecall_set_msd_position_n1().
+  @return Whether the vehicle location delta was set successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_LATITUDE delta latitude unsupported value.
+  @retval QL_ERR_MSD_LONGITUDE delta longitude unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_set_msd_position_n2(int32_t latitudeDeltaN2, int32_t longitudeDeltaN2);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set MSD TX Mode.
+  @param[in] tx_mode Transmission MSD mode, 0 - PULL, 1 - PUSH.
+  @return Whether the transmission MSD mode was set successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_BADPARM unsupported value.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+QL_ERR_MSD_RESULT_E ql_ecall_set_msd_tx_mode(QL_ECALL_MSD_TX_MODE_E tx_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Get MSD TX Mode.
+  @param[out] tx_mode Pointer to transmission MSD mode, 0 - PULL, 1 - PUSH.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_get_msd_tx_mode(QL_ECALL_MSD_TX_MODE_E* tx_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set the minimum interval value between dial attempts. Available for both manual and test modes.
+  @param[in] pause the minimum interval value in seconds.
+  @retval ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_set_interval_between_dial_attempts(uint16_t pause);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Get the minimum interval value between dial attempts.
+  @param[out] pause pointer to the minimum interval value in seconds.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_get_interval_between_dial_attempts(uint16_t* pause);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Initialize MSD to default values.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_msd_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Start a test eCall session.
+  @return Whether the test ecall was started successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_BADPARM unsupported value.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_start_test(int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Start a manual eCall session.
+  @return Whether the manually triggered ecall was started successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_BADPARM unsupported value.
+  @retval Other MSD error code defined by QL_ERR_MSD_RESULT_E.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_start_manual(int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Start an automatic eCall session.
+  @return Whether the automatically triggered ecall was started successfully.
+  @retval QL_ERR_MSD_SUCCESS successful.
+  @retval QL_ERR_MSD_BADPARM unsupported value.
+  @retval Other MSD error code defined by QL_ERR_MSD_RESULT_E.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_start_automatic(int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Initializes ecall service.
+  @return Whether the ecall service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Deinitializes ecall service.
+  @return Whether the ecall service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets ecall User indication callback.
+  @param[in] cb call back handler.
+  @param[in] userdata user data.
+  @return void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_ecall_set_user_ind_cb(ql_ecall_user_ind_f cb, void *userdata);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Dials eCall.
+  @param[in]  sim_id sim id.
+  @param[in]  p_info eCall info.
+  @param[out] p_id   call id.
+  @return Whether a eCall was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_dial(int sim_id, const ql_voice_ecall_info_t* const p_info, uint32_t* const p_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Hangs up eCall.
+  @return Whether the eCall was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_hangup(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Updates eCall MSD with raw data.
+  @param[in] msd Minimum Set of Data.
+  @param[in] msd_len Length of Minimum Set of Data.
+  @return Whether the eCall MSD was successfully updated.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_update_msd_raw(const uint8_t* msd, uint32_t msd_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Updates eCall MSD.
+  @return Whether the eCall MSD was successfully updated.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_update_msd(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Pushes eCall MSD.
+  @param[out] state eCall state.
+  @return Whether the eCall MSD was successfully pushed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_push_msd(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Setting ecall test number. Number will be saved on the modem side.
+  @param[in] number  test number
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_set_test_number(int sim_id, const char* number);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Setting ecall test number. Number will be saved on the modem side.
+  @param[in] number  test number
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_reset_test_number(int sim_id, const char* number);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Reset IVS during ecall session and switch to voice.
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_reset_ivs(int sim_id);
+
+#if 0
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Starts ecall session.
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_make_ecall(int sim_id, QL_ECALL_MAKE_ECALL_TYPE ecall_type);
+#endif
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deregister from Network.
+  @return Whether a request was executed.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ecall_terminate_nw_registration(void);
+
+void ql_ecall_set_config_info(ql_ecall_config_t ecall_context_info);
+
+void ql_ecall_get_config_info(ql_ecall_config_t* ecall_context_info);
+
+int ql_ecall_set_ecall_only_mode(bool ecall_only_value);
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* __ECALL_H__ */
diff --git a/mbtk/include/ql_v2/ql_fota.h b/mbtk/include/ql_v2/ql_fota.h
new file mode 100755
index 0000000..b07cbaf
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_fota.h
@@ -0,0 +1,124 @@
+/**  
+  @file
+  ql_fota.h
+
+  @brief
+  This file provides the definitions for device, and declares the 
+  API functions.
+
+*/
+/*============================================================================
+  Copyright (c) 2017 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+ =============================================================================*/
+/*===========================================================================
+
+                        EDIT HISTORY FOR MODULE
+
+This section contains comments describing changes made to the module.
+Notice that changes are listed in reverse chronological order.
+
+
+WHEN        WHO            WHAT, WHERE, WHY
+----------  ------------   ----------------------------------------------------
+25/11/2021  jessie.lei      create
+=============================================================================*/
+#ifndef __QL_FOTA_H__
+#define __QL_FOTA_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "fota_info.h"
+
+
+/*
+ * callback function define, used to get upgrade state and rate of process
+ */
+typedef int(*ql_fota_cb_f)(int state, int percent);
+
+
+/*******************************************************************************
+* @brief fota initialize
+  @param 
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_init(void);
+
+
+/*******************************************************************************
+* @brief fota de-initialize
+  @param 
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_deinit(void);
+
+
+/*******************************************************************************
+* @brief set fota callback
+  @param 
+    cb: callback function
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_set_cb(ql_fota_cb_f cb);
+
+
+/*******************************************************************************
+* @brief fota initialize
+  @param 
+    otasize: The OTA firmware size
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_start(unsigned int otasize);
+
+
+/*******************************************************************************
+* @brief write fota firmware data
+  @param 
+    buffer: The buffer 
+    size  : Data length in buffer
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_write(unsigned char *buffer, unsigned int size);
+
+
+/*******************************************************************************
+* @brief get fota state
+  @param 
+    state: fota state, refer to fota_state_t
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_get_state(fota_state_t *state);
+
+
+/*******************************************************************************
+* @brief set fota state
+  @param 
+    state: fota state, refer to fota_state_t
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_set_state(fota_state_t state);
+
+
+/*******************************************************************************
+* @brief finish fota process
+  @param 
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_done(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //__QL_FOTA_H__
diff --git a/mbtk/include/ql_v2/ql_fota_api.h b/mbtk/include/ql_v2/ql_fota_api.h
new file mode 100755
index 0000000..1db2142
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_fota_api.h
@@ -0,0 +1,91 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_fwupdate.h
+  @brief
+       This file declare OTA upgrade interface
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20211125   Jessie.lei     Created .
+-------------------------------------------------------------------------------------------------*/
+
+
+#ifndef QL_FOTA_API_H_
+#define QL_FOTA_API_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <errno.h>
+#include "fota_info.h"
+
+typedef enum
+{
+    E_NO_ERROR=0,
+    E_FOTA_INIT_FAILED=1,
+    E_UPDATE_PACKAGE_NOEXIST=2,
+    E_WRITE_SEG_FAILED=3,
+} fota_exit_code_t;
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * upgrade info
+ */
+//--------------------------------------------------------------------------------------------------
+typedef struct
+{
+    unsigned int percentage;       ///< the upgrade progress
+    fota_state_t ota_state;        ///< the device ota upgrade status
+    fota_exit_code_t exit_code;    ///< the fota process
+} update_info_t;
+
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * @brief
+ * 		This function starts ota upgrade to flash partition.
+ * @Parameter
+ * 		[IN] package_path, the location of quectel_AB_OTA.img.
+ * @return
+ *      - On success               0  indicate the upgrad is succeed
+ *      - On failure               -1 indicate *package_path is invalid or failed to set fota start state.
+ *                                 Otherwise, it returns a positve number, the exit code of update, one of
+ *                                 the enum fota_exit_code_t.
+ */
+//--------------------------------------------------------------------------------------------------
+int ql_abfota_start_update(const char *package_path);
+
+
+//--------------------------------------------------------------------------------------------------
+/**
+ * @brief
+ * 		get the upgrade progress
+ * @Parameter
+ *      [InOut] upgrade_info, store the fota progress & state info
+ * @return
+ *      - On success                  0
+ *      - On failure                 -1
+ */
+//--------------------------------------------------------------------------------------------------
+int ql_abfota_get_update_status(update_info_t * update_info);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //QL_FOTA_API_H_
diff --git a/mbtk/include/ql_v2/ql_fota_common.h b/mbtk/include/ql_v2/ql_fota_common.h
new file mode 100755
index 0000000..1a0cb90
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_fota_common.h
@@ -0,0 +1,48 @@
+
+/**
+  @file
+  ql_fota_common.h
+
+  @brief
+  This file provides the definitions for common functions, and declares the
+  common functions.
+
+*/
+/*============================================================================
+  Copyright (c) 2017 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+ =============================================================================*/
+/*===========================================================================
+
+                        EDIT HISTORY FOR MODULE
+
+This section contains comments describing changes made to the module.
+Notice that changes are listed in reverse chronological order.
+
+
+WHEN        WHO            WHAT, WHERE, WHY
+----------  ------------   ----------------------------------------------------
+23/08/2019  Nebula.li      create
+=============================================================================*/
+
+#ifndef __QL_FOTA_COMMON_H
+#define __QL_FOTA_COMMON_H
+
+#include <stdint.h>
+
+#define QL_OTAD_CLIENT_INIT_CNT_MAX  20
+
+#define QL_OTAD_SEND_MSG_TIMEOUT     (3 * 1000)
+
+typedef void (*ql_otad_service_error_cb_f)(int error);
+
+int ql_otad_client_init(void);
+int ql_otad_client_release(void);
+int ql_otad_send_msg_sync(int32_t msg_id, 
+                          void *p_req_msg_data,
+                          uint32_t req_msg_data_len,
+                          void *p_resp_msg_data,
+                          uint32_t resp_msg_data_len,
+                          uint32_t timeout);
+
+#endif  /* __QL_FOTA_COMMON_H */
diff --git a/mbtk/include/ql_v2/ql_fota_log.h b/mbtk/include/ql_v2/ql_fota_log.h
new file mode 100755
index 0000000..11a84f2
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_fota_log.h
@@ -0,0 +1,56 @@
+/**  
+  @file
+  DSI_ConnectManager.h
+
+  @brief
+  This file provides the definitions for quectel log api, and declares the 
+  API functions.
+
+*/
+/*============================================================================
+  Copyright (c) 2017 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+ =============================================================================*/
+/*===========================================================================
+
+                        EDIT HISTORY FOR MODULE
+
+This section contains comments describing changes made to the module.
+Notice that changes are listed in reverse chronological order.
+
+
+WHEN        WHO            WHAT, WHERE, WHY
+----------  ------------   ----------------------------------------------------
+24/07/2019  Nebula.li      create
+=============================================================================*/
+
+#ifndef _QL_LOG_H_
+#define _QL_LOG_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ql_sys_log.h>
+
+#define QL_LOG_DEBUG(fmt, ...)	do{ \
+    ql_sys_log_print(QL_SYS_LOG_ID_SYSTEM, QL_SYS_LOG_DEBUG, QL_SYS_LOG_TAG, "[%s_%d]:"fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__);\
+}while(0)
+
+#define QL_LOG_INFO(fmt, ...)	do{ \
+    ql_sys_log_print(QL_SYS_LOG_ID_SYSTEM, QL_SYS_LOG_INFO, QL_SYS_LOG_TAG, "[%s_%d]:"fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__);\
+}while(0)
+
+#define QL_LOG_WARN(fmt, ...)	do{ \
+    ql_sys_log_print(QL_SYS_LOG_ID_SYSTEM, QL_SYS_LOG_WARN, QL_SYS_LOG_TAG, "[%s_%d]:"fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__);\
+}while(0)
+
+#define QL_LOG_ERROR(fmt, ...)	do{ \
+    ql_sys_log_print(QL_SYS_LOG_ID_SYSTEM, QL_SYS_LOG_ERROR, QL_SYS_LOG_TAG, "[%s_%d]:"fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__);\
+}while(0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/mbtk/include/ql_v2/ql_gnss.h b/mbtk/include/ql_v2/ql_gnss.h
new file mode 100755
index 0000000..ca67bba
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_gnss.h
@@ -0,0 +1,439 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_gnss.h 
+  @brief GNSS service API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+
+
+#ifndef __QL_GNSS_H__
+#define __QL_GNSS_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef enum {
+    /** Cold Start Gnss*/
+    QL_GNSS_COLD_START = 0,
+    /** Warm Start Gnss */
+    QL_GNSS_WARM_START,
+    /** Hot Start Gnss*/
+    QL_GNSS_HOT_START,
+}QL_GNSS_START_MODE_E;
+
+typedef enum 
+{
+    /**  gnss engine is off  */
+    QL_GNSS_ENGINE_STATE_OFF = 0, 
+    /**  gnss engine is on  */
+    QL_GNSS_ENGINE_STATE_ON = 1, 
+}QL_GNSS_ENGINE_STATE_E;
+
+typedef enum 
+{
+    QL_GNSS_EPH_DATA_GPS = 0x01, 
+    QL_GNSS_EPH_DATA_BDS = 0x02,
+    QL_GNSS_EPH_DATA_GLO = 0x04,
+    QL_GNSS_EPH_DATA_GAL = 0x08,
+    QL_GNSS_EPH_DATA_QZSS = 0x10,
+}QL_GNSS_EPH_DATA_E;
+
+typedef enum
+{
+  GPS_ONLY = 0x01,
+  BDS_ONLY = 0x02,
+  GPS_BDS = 0x03,
+  GLONASS_ONLY = 0x04,
+  GPS_GLONASS = 0x05,
+  BDS_GLONASS = 0x06,
+  GPS_BDS_GLONASS = 0x07,
+  GPS_SBAS_QZSS = 0x08,                 /* GPS+SBAS+QZSS           */              
+  GPS_BDS_GALILEO_SBAS_QZSS = 0x11,     /* GPS+BDS+GAL+SBAS+QZSS   */
+  GPS_GLONASS_GALILEO_SBAS_QZSS = 0x101 /* Not currently supported */
+} QL_GNSS_CONSTELLATION_MASK_E;
+
+typedef enum
+{
+    QL_GNSS_NMEA_VERSION_V30,           /* NMEA 3.0 */
+    QL_GNSS_NMEA_VERSION_V41            /* NMEA 4.1 */
+}QL_GNSS_NMEA_VERSION_ID_E;
+
+typedef enum
+{
+    QL_GNSS_MSG_MIN = 0,                  /* GNSS MIN  MSG  */
+    QL_GNSS_NMEA_MSG,                     /* GNSS NMEA DATA */
+    QL_GNSS_STATUS_MSG,                   /* GNSS NMEA DATA */
+    QL_GNSS_MSG_MAX                       /* GNSS MAX  MSG  */
+}QL_GNSS_IND_MSG_ID_E;
+
+/**
+ *  gnss state definition
+ */
+typedef enum
+{
+    QL_GNSS_STATUS_UNDEFINE = 0u,       /* Undefined state  */
+    QL_GNSS_STATUS_FOTA_START,          /* Fota init state  */
+    QL_GNSS_STATUS_FOTA_REQ,            /* Fota state req   */
+    QL_GNSS_STATUS_FOTA_ING,            /* Fota progressing */
+    QL_GNSS_STATUS_FOTA_BOOT,           /* Fota bootloader  */
+    QL_GNSS_STATUS_FOTA_FIRM,           /* Fota firmware    */
+    QL_GNSS_STATUS_FOTA_END,            /* Fota end         */
+    QL_GNSS_STATUS_WORKING,             /* GNSS working     */
+    QL_GNSS_STATUS_MAX,                 /* Max   state      */
+}QL_GNSS_STATUS_E;
+
+
+typedef struct 
+{
+    char *ptr;
+    size_t len;
+} curl_rsp_msg_t;
+
+typedef struct
+{
+    uint8_t  msg_id;
+    uint32_t time;
+    char nmea_sentence[128];
+} nmea_srv_ind_msg;
+
+typedef struct
+{
+    uint8_t  msg_id;
+    QL_GNSS_STATUS_E g_status;
+} gnss_status_ind_msg;
+
+typedef struct
+{
+    double   latitude;
+    double   longitude;
+    double   altitude;
+} ql_inject_location_t;
+
+
+typedef struct 
+{
+    uint8_t mask;     
+    struct
+    {
+        uint8_t gga_nmea_len;    /* GGA */
+        char  gga_sent[128];
+    }gga_sentences;
+    
+    struct
+    {
+        uint8_t rmc_nmea_len;    /* RMC */
+        char  rmc_sent[128];
+    }rmc_sentences;
+    
+    uint8_t   gpgsv_lines;
+    struct 
+    {  
+        uint8_t  nmea_sentences_len; /* GPGSV */
+        char    gsv_sent[128];        
+    }gpgsv_sentences[4];  
+
+    uint8_t   bdgsv_lines;
+    struct 
+    {
+        uint32_t  gsv_lines;
+        uint8_t  nmea_sentences_len; /* BD/GBGSV */
+        char    gsv_sent[128];        
+    }bdgsv_sentences[4];
+    
+} nmeasrc_sentences;
+
+typedef void (*ql_gnss_ind_cb_f)(void *msg);
+
+typedef void (*ql_gnss_error_cb_f)(int error);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the gnss client
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize the  gnss client
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Start gnss
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_start(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Stop gnss
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_stop(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss start mode
+  @param[in] mask Gnss start mode
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_start_mode(QL_GNSS_START_MODE_E mask);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get gnss nmea
+  @param[in] nmea_str
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_qgpsgnmea(nmeasrc_sentences *nmea_str);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss qgpscfg
+  @param[in] enable
+  @param[in] str
+  @param[in] len
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_qgpscfg(uint32_t enable, char *str, uint32_t len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get engine state 
+  @param[out] state  on/ff
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_get_engine_state(QL_GNSS_ENGINE_STATE_E *state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Set Constellation .
+  @param[in] mask  GPS/GLO/BDS/GAL/QZSS/SBAS
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_constellation(QL_GNSS_CONSTELLATION_MASK_E mask);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get Constellation 
+  @param[out] mask   GPS/GLO/BDS/GAL/QZSS/SBAS
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_get_constellation(QL_GNSS_CONSTELLATION_MASK_E *mask);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set nmea type
+  @param[in] mask type
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_nmea_type(uint32_t mask);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get nmea version
+  @param[out] version nmea version
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_get_nmea_version(QL_GNSS_NMEA_VERSION_ID_E *version);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set nmea version
+  @param[in] version nmea version
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_nmea_version(QL_GNSS_NMEA_VERSION_ID_E version);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss agnss mode
+  @param[in] mask Gnss agnss mode
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_agnss_mode(uint32_t mask);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Inject  agnss data
+  @param[in] data agnss data
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_inject_agnss_data(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Inject UTC time to GNSS Engine.
+  @param[in] timestamp ,unit: ms
+  @return Whether to successfully Start Gnss 
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_FAILED  Start Gnss Failed
+  @retval Other error code defined by ql_gnss.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_inject_utc_time(uint64_t timestamp);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss suspend
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_suspend(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss resume
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_resume(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Register gnss callback
+  @param[in] cb
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_ind_cb(ql_gnss_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_service_error_cb(ql_gnss_error_cb_f cb);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_gpio.h b/mbtk/include/ql_v2/ql_gpio.h
new file mode 100755
index 0000000..144d363
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_gpio.h
@@ -0,0 +1,445 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of Quectel Co., Ltd. 2019
+*
+*****************************************************************************/
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *   ql_gpio.h 
+ *
+ * Project:
+ * --------
+ *   OpenLinux
+ *
+ * Description:
+ * ------------
+ *   GPIO API defines.
+ *
+ *
+ *============================================================================
+ *             HISTORY
+ *----------------------------------------------------------------------------
+ * WHO            WHEN                WHAT
+ *----------------------------------------------------------------------------
+ * Larry.Zhang   24/09/2021		  Create.
+ ****************************************************************************/
+
+#ifndef __QL_GPIO_H__
+#define __QL_GPIO_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GPIO MAP */
+typedef enum{
+	PINNAME_BEGIN = -1,
+
+	/* GPIO1 ~ GPIO8 */
+	PINNAME_GPIO_117 = 117,    /* GPIO1 */
+	PINNAME_GPIO_118 = 118,    /* GPIO2 */
+	PINNAME_GPIO_120 = 120,    /* GPIO3 */
+	PINNAME_GPIO_122 = 122,    /* GPIO4 */
+	PINNAME_GPIO_38  = 38,     /* GPIO5 */
+	PINNAME_GPIO_39  = 39,     /* GPIO6 */
+	PINNAME_GPIO_37  = 37,     /* GPIO7 */
+	PINNAME_GPIO_40  = 40,     /* GPIO8 */
+
+	/* The follow pins are not use as GPIO by defaut, please contract Quectel for support */
+
+	/* WLAN */
+	PINNAME_GPIO_58  = 58,     /* SDIO1_CMD */
+	PINNAME_GPIO_59  = 59,     /* SDIO1_CLK */
+	PINNAME_GPIO_57  = 57,     /* SDIO1_DATA0 */
+	PINNAME_GPIO_56  = 56,     /* SDIO1_DATA1 */
+	PINNAME_GPIO_55  = 55,     /* SDIO1_DATA2 */
+	PINNAME_GPIO_48  = 48,     /* SDIO1_DATA3 */
+	PINNAME_GPIO_19  = 19,     /* WLAN_EN */
+	PINNAME_GPIO_43  = 43,     /* WLAN_SLP_CLK */
+	PINNAME_GPIO_123 = 123,    /* WLAN_PWR_EN */
+	PINNAME_GPIO_11  = 11,     /* BT_EN */
+	PINNAME_GPIO_127 = 127,    /* WLAN_WAKE */
+	PINNAME_GPIO_125 = 125,    /* RESERVED */
+
+	/* I2C */
+	PINNAME_GPIO_50  = 50,     /* I2C1_SDA */
+	PINNAME_GPIO_49  = 49,     /* I2C1_SCL */
+	PINNAME_GPIO_42  = 42,     /* I2C2_SDA */
+	PINNAME_GPIO_41  = 41,     /* I2C2_SCL */
+
+	/* UART */
+	PINNAME_GPIO_32  = 32,     /* MAIN_CTS */
+	PINNAME_GPIO_31  = 31,     /* MAIN_RTS */
+	PINNAME_GPIO_51  = 51,     /* MAIN_RXD */
+	PINNAME_GPIO_52  = 52,     /* MAIN_TXD */
+	PINNAME_GPIO_54  = 54,     /* BT_TXD */
+	PINNAME_GPIO_47  = 47,     /* BT_CTS */
+	PINNAME_GPIO_53  = 53,     /* BT_RXD */
+	PINNAME_GPIO_46  = 46,     /* BT_RTS */
+	PINNAME_GPIO_45  = 45,     /* GNSS_TXD */
+	PINNAME_GPIO_44  = 44,     /* GNSS_RXD */
+
+	/* SPI */
+	PINNAME_GPIO_23  = 23,     /* SPI1_DOUT */
+	PINNAME_GPIO_24  = 24,     /* SPI1_DIN */
+	PINNAME_GPIO_22  = 22,     /* SPI1_CS */
+	PINNAME_GPIO_21  = 21,     /* SPI1_CLK */
+	PINNAME_GPIO_34  = 34,     /* SPI2_CS */
+	PINNAME_GPIO_35  = 35,     /* SPI2_DIN */
+	PINNAME_GPIO_36  = 36,     /* SPI2_DOUT */
+	PINNAME_GPIO_33  = 33,     /* SPI2_CLK */
+
+	PINNAME_END = 127
+}ENUM_PINNAME;
+
+
+/****************************************************************************
+ * Error Code Definition
+ ***************************************************************************/
+enum {
+        RES_OK = 0,
+        RES_BAD_PARAMETER  = -1,     ///< Parameter is invalid.
+        RES_IO_NOT_SUPPORT = -2,
+        RES_IO_ERROR = -3,
+        RES_NOT_IMPLEMENTED = -4
+};
+
+typedef enum{
+    PINDIRECTION_IN  = 0,	/** GPIO input direction */
+    PINDIRECTION_OUT = 1	/** GPIO output direction */
+}ENUM_PIN_DIRECTION;
+
+typedef enum{
+    PINLEVEL_LOW  = 0,		/** GPIO low level */
+    PINLEVEL_HIGH = 1		/** GPIO high level */
+}ENUM_PIN_LEVEL;
+
+typedef enum{
+    PINPULLSEL_DISABLE  = 0,		 /** Disable pull selection */
+    PINPULLSEL_PULLDOWN = 1, 	 	/**pull down */
+    PINPULLSEL_PULLUP   = 2  		/**pull up */
+}ENUM_PIN_PULLSEL;
+
+/****************************************************************************
+ * GPIO Config Items
+ ***************************************************************************/
+typedef struct{
+    ENUM_PINNAME            pin_name;	  /** GPIO pin_name arrey*/
+    ENUM_PIN_DIRECTION      pin_direction;  /** GPIO pinDirection arrey*/
+    ENUM_PIN_LEVEL          pin_level;	  /** GPIO pinLevel arrey*/
+    ENUM_PIN_PULLSEL        pin_pullSel;	  /** GPIO pinPullSel arrey*/
+}st_gpio_config;
+
+//------------------------------------------------------------------------------
+/**
+ * The type of GPIO Edge Sensivity.
+ */
+//------------------------------------------------------------------------------
+typedef enum {
+    EINT_SENSE_NONE,       // pin is input, but no an interrupt pin.
+    EINT_SENSE_RISING,
+    EINT_SENSE_FALLING,
+    EINT_SENSE_BOTH
+}ENUM_EINT_TYPE;
+
+/*****************************************************************
+* Function:     ql_gpio_init 
+* 
+* Description:
+*               This function enables the GPIO function of the specified pin,
+*               and initialize the configurations, including direction,
+*               level and pull selection.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of ENUM_PINNAME.
+*               dir:
+*                   The initial direction of GPIO, one value of ENUM_PIN_DIRECTION.
+*               level:
+*                   The initial level of GPIO, one value of ENUM_PIN_LEVEL. 
+*               pullSel:
+*                   Pull selection, one value of ENUM_PIN_PULLSEL.
+* Return:        
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int ql_gpio_init(ENUM_PINNAME       pin_name, 
+                 ENUM_PIN_DIRECTION  dir, 
+                 ENUM_PIN_LEVEL      level, 
+                 ENUM_PIN_PULLSEL    pull_sel
+                 );
+
+/*****************************************************************
+* Function:     ql_gpio_base_init 
+* 
+* Description:
+*               This function enables the GPIO function of the specified pin.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of ENUM_PINNAME.
+*            
+* Return:        
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 
+*               RES_IO_ERR, the function failed
+*****************************************************************/
+int ql_gpio_base_init(ENUM_PINNAME pin_name );
+
+/*****************************************************************
+* Function:     ql_gpio_set_level 
+* 
+* Description:
+*               This function sets the level of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of ENUM_PINNAME.
+*               level:
+*                   The initial level of GPIO, one value of ENUM_PIN_LEVEL. 
+* Return:        
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int ql_gpio_set_level(ENUM_PINNAME pin_name, ENUM_PIN_LEVEL level);
+
+/*****************************************************************
+* Function:     ql_gpio_get_level 
+* 
+* Description:
+*               This function gets the level of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of ENUM_PINNAME.
+* Return:        
+*               The level value of the specified GPIO, which is 
+*               nonnegative integer.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.
+*****************************************************************/
+int ql_gpio_get_level(ENUM_PINNAME pin_name);
+
+/*****************************************************************
+* Function:     ql_gpio_set_direction 
+* 
+* Description:
+*               This function sets the direction of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of ENUM_PINNAME.
+*               dir:
+*                   The initial direction of GPIO, one value of ENUM_PIN_DIRECTION.
+* Return:        
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int ql_gpio_set_direction(ENUM_PINNAME pin_name, ENUM_PIN_DIRECTION dir);
+
+/*****************************************************************
+* Function:     ql_gpio_get_direction 
+* 
+* Description:
+*               This function gets the direction of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of ENUM_PINNAME.
+* Return:        
+*               0  INPUT
+*               1  OUTPUT
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int ql_gpio_get_direction(ENUM_PINNAME pin_name);
+
+
+/*****************************************************************
+* Function:     ql_gpio_set_pull_selection 
+* 
+* Description:
+*               This function sets the pull selection of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of ENUM_PINNAME.
+*               ENUM_PIN_PULLSEL:
+*                   Pull selection, one value of ENUM_PIN_PULLSEL.
+* Return:        
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int ql_gpio_set_pull_selection(ENUM_PINNAME pin_name, ENUM_PIN_PULLSEL pull_sel);
+
+/*****************************************************************
+* Function:     ql_gpio_get_pull_selection 
+* 
+* Description:
+*               This function gets the pull selection of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of ENUM_PINNAME.
+* Return:        
+*               0   no pull
+*               1   pull down
+*               3   pull up
+*****************************************************************/
+int ql_gpio_get_pull_selection(ENUM_PINNAME pin_name);
+
+/*****************************************************************
+* Function:     ql_gpio_uninit 
+* 
+* Description:
+*               This function releases the specified GPIO that was 
+*               initialized by calling ql_gpio_init() previously.
+*               After releasing, the GPIO can be used for other purpose.
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of ENUM_PINNAME.
+* Return:        
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int ql_gpio_uninit(ENUM_PINNAME pin_name);
+
+//------------------------------------------------------------------------------
+/*
+* Description:
+*     Definition for EINT callback function.
+* 
+* Parameters:
+*     pin_name:
+*         EINT pin name, one value of ENUM_PINNAME.
+*
+*     level:
+*         The EINT level value, one value of ENUM_PIN_LEVEL. 
+*         0 or 1
+*/
+//------------------------------------------------------------------------------
+typedef void (*ql_eint_callback)(ENUM_PINNAME eint_pin_name, int level);
+
+//------------------------------------------------------------------------------
+/*
+* Function:     ql_eint_enable 
+* 
+* Description:
+*               Set the interrupt sense mode, and enable interrupt. 
+*
+* Parameters:
+*               eint_pin_name:
+*                   EINT pin name, one value of ENUM_PINNAME that has 
+*                   the interrupt function.
+*
+*               eint_type:
+*                   Interrupt type, level-triggered or edge-triggered.
+*                   Now, only edge-triggered interrupt is supported.
+*
+*               eint_callback:
+*                   call back function
+*
+* Return:        
+*               RES_OK, this function succeeds.
+*               else failed to execute the function. 
+*/
+//------------------------------------------------------------------------------
+int ql_eint_enable(ENUM_PINNAME eint_pin_name, ENUM_EINT_TYPE eint_type, ql_eint_callback eint_callback);
+
+
+//------------------------------------------------------------------------------
+/*
+* Function:     ql_eint_disable 
+* 
+* Description:
+*               Disable the interrupt sense. 
+*
+* Parameters:
+*               eint_pin_name:
+*                   EINT pin name, one value of ENUM_PINNAME that has 
+*                   the interrupt function.
+*
+* Return:        
+*               RES_OK, this function succeeds.
+*               else failed to execute the function. 
+*/
+//------------------------------------------------------------------------------
+int ql_eint_disable(ENUM_PINNAME eint_pin_name);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+Function:     ql_set_gpio_function 
+* 
+* Description:
+*             set pin function. 
+*
+* Parameters:
+*            pin_name:
+*            EINT pin name, one value of ENUM_PINNAME.
+*		 func:
+*		 pin function,value range from 0 to 7
+*
+* Return:        
+*               RES_OK, this function succeeds.
+*               else failed to execute the function. 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+int ql_set_gpio_function(ENUM_PINNAME pin_name,unsigned int func);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/*Function:     ql_get_gpio_function 
+* 
+* Description:
+*               get pin function. 
+*
+* Parameters:
+*               pin_name:
+*               EINT pin name, one value of ENUM_PINNAME.
+*
+* Return:        
+*               return 0-7, this function succeeds.
+*               else failed to execute the function. 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+int ql_get_gpio_function(ENUM_PINNAME pin_name);
+
+/*-----------------------------------------------------------------------------------------------*/
+/*Function:     ql_check_pin_function_status 
+* 
+* Description:
+*               Check whether the pin is gpio function. 
+*
+* Parameters:
+*               pin_name:
+*               EINT pin name, one value of ENUM_PINNAME.
+*
+* Return:        
+*               return 1, this pin is gpio function.
+*               return 0, this pin is not gpio function. 
+*		     else failed to execute the function.
+*/
+/*-----------------------------------------------------------------------------------------------*/
+int ql_check_pin_function_status(ENUM_PINNAME  pin_name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // __QL_GPIO_H__
diff --git a/mbtk/include/ql_v2/ql_gpio_internal.h b/mbtk/include/ql_v2/ql_gpio_internal.h
new file mode 100755
index 0000000..a00a3c0
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_gpio_internal.h
@@ -0,0 +1,335 @@
+#ifndef __QL_GPIO_INTERNAL_H

+#define __QL_GPIO_INTERNAL_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#include "ql_gpio.h"

+

+typedef enum{

+    INTERNAL_BEGIN = -1,

+    INTERNAL_GPIO_10 = 10,

+    INTERNAL_GPIO_11 = 11,

+    INTERNAL_GPIO_19 = 19,

+    INTERNAL_GPIO_21 = 21,

+    INTERNAL_GPIO_22 = 22,

+    INTERNAL_GPIO_23 = 23,

+    INTERNAL_GPIO_24 = 24,

+    INTERNAL_GPIO_25 = 25,

+    INTERNAL_GPIO_26 = 26,

+    INTERNAL_GPIO_27 = 27,

+    INTERNAL_GPIO_31 = 31,

+    INTERNAL_GPIO_32 = 32,

+    INTERNAL_GPIO_33 = 33,

+    INTERNAL_GPIO_34 = 34,

+    INTERNAL_GPIO_35 = 35,

+    INTERNAL_GPIO_36 = 36,

+    INTERNAL_GPIO_37 = 37,

+    INTERNAL_GPIO_38 = 38,

+    INTERNAL_GPIO_39 = 39,

+    INTERNAL_GPIO_40 = 40,

+    INTERNAL_GPIO_43 = 43,

+    INTERNAL_GPIO_48 = 48,

+    INTERNAL_GPIO_49 = 49,

+    INTERNAL_GPIO_50 = 50,

+    INTERNAL_GPIO_51 = 51,

+    INTERNAL_GPIO_52 = 52,

+    INTERNAL_GPIO_53 = 53,

+    INTERNAL_GPIO_54 = 54,

+    INTERNAL_GPIO_55 = 55,

+    INTERNAL_GPIO_56 = 56,

+    INTERNAL_GPIO_57 = 57,

+    INTERNAL_GPIO_58 = 58,

+    INTERNAL_GPIO_59 = 59,

+    INTERNAL_GPIO_99 = 99,

+    INTERNAL_GPIO_117 = 117,

+    INTERNAL_GPIO_118 = 118,

+    INTERNAL_GPIO_119 = 119,

+    INTERNAL_GPIO_120 = 120,

+    INTERNAL_GPIO_122 = 122,

+    INTERNAL_GPIO_123 = 123,

+    INTERNAL_GPIO_126 = 126,

+    INTERNAL_END = 127

+}INTERNAL_ENUM_PINNAME;

+

+

+/*****************************************************************

+* Function:     __ql_gpio_init 

+* 

+* Description:

+*               This function enables the GPIO function of the specified pin,

+*               and initialize the configurations, including direction,

+*               level and pull selection.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*               dir:

+*                   The initial direction of GPIO, one value of ENUM_PIN_DIRECTION.

+*               level:

+*                   The initial level of GPIO, one value of ENUM_PIN_LEVEL. 

+*               pullSel:

+*                   Pull selection, one value of ENUM_PIN_PULLSEL.

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_init(INTERNAL_ENUM_PINNAME       pin_name, 

+                 ENUM_PIN_DIRECTION  dir, 

+                 ENUM_PIN_LEVEL      level, 

+                 ENUM_PIN_PULLSEL    pull_sel

+                 );

+

+/*****************************************************************

+* Function:     __ql_gpio_base_init 

+* 

+* Description:

+*               This function enables the GPIO function of the specified pin.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*            

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*****************************************************************/

+int __ql_gpio_base_init(INTERNAL_ENUM_PINNAME pin_name );

+

+/*****************************************************************

+* Function:     __ql_gpio_set_level 

+* 

+* Description:

+*               This function sets the level of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*               level:

+*                   The initial level of GPIO, one value of ENUM_PIN_LEVEL. 

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_set_level(INTERNAL_ENUM_PINNAME pin_name, ENUM_PIN_LEVEL level);

+

+/*****************************************************************

+* Function:     __ql_gpio_get_level 

+* 

+* Description:

+*               This function gets the level of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+* Return:        

+*               The level value of the specified GPIO, which is 

+*               nonnegative integer.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.

+*****************************************************************/

+int __ql_gpio_get_level(INTERNAL_ENUM_PINNAME pin_name);

+

+/*****************************************************************

+* Function:     __ql_gpio_set_direction 

+* 

+* Description:

+*               This function sets the direction of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*               dir:

+*                   The initial direction of GPIO, one value of ENUM_PIN_DIRECTION.

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_set_direction(INTERNAL_ENUM_PINNAME pin_name, ENUM_PIN_DIRECTION dir);

+

+/*****************************************************************

+* Function:     __ql_gpio_get_direction 

+* 

+* Description:

+*               This function gets the direction of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+* Return:        

+*               0  INPUT

+*               1  OUTPUT

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_get_direction(INTERNAL_ENUM_PINNAME pin_name);

+

+

+/*****************************************************************

+* Function:     __ql_gpio_set_pull_selection 

+* 

+* Description:

+*               This function sets the pull selection of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*               ENUM_PIN_PULLSEL:

+*                   Pull selection, one value of ENUM_PIN_PULLSEL.

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_set_pull_selection(INTERNAL_ENUM_PINNAME pin_name, ENUM_PIN_PULLSEL pull_sel);

+

+/*****************************************************************

+* Function:     __ql_gpio_get_pull_selection 

+* 

+* Description:

+*               This function gets the pull selection of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+* Return:        

+*               0   no pull

+*               1   pull down

+*               3   pull up

+*****************************************************************/

+int __ql_gpio_get_pull_selection(INTERNAL_ENUM_PINNAME pin_name);

+

+/*****************************************************************

+* Function:     __ql_gpio_uninit 

+* 

+* Description:

+*               This function releases the specified GPIO that was 

+*               initialized by calling ql_gpio_init() previously.

+*               After releasing, the GPIO can be used for other purpose.

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_uninit(INTERNAL_ENUM_PINNAME pin_name);

+

+//------------------------------------------------------------------------------

+/*

+* Function:     __ql_eint_enable 

+* 

+* Description:

+*               Set the interrupt sense mode, and enable interrupt. 

+*

+* Parameters:

+*               eint_pin_name:

+*                   EINT pin name, one value of INTERNAL_ENUM_PINNAME that has 

+*                   the interrupt function.

+*

+*               eint_type:

+*                   Interrupt type, level-triggered or edge-triggered.

+*                   Now, only edge-triggered interrupt is supported.

+*

+*               eint_callback:

+*                   call back function

+*

+* Return:        

+*               RES_OK, this function succeeds.

+*               else failed to execute the function. 

+*/

+//------------------------------------------------------------------------------

+int __ql_eint_enable(INTERNAL_ENUM_PINNAME eint_pin_name, ENUM_EINT_TYPE eint_type, ql_eint_callback eint_callback);

+

+

+//------------------------------------------------------------------------------

+/*

+* Function:     __ql_eint_disable 

+* 

+* Description:

+*               Disable the interrupt sense. 

+*

+* Parameters:

+*               eint_pin_name:

+*                   EINT pin name, one value of INTERNAL_ENUM_PINNAME that has 

+*                   the interrupt function.

+*

+* Return:        

+*               RES_OK, this function succeeds.

+*               else failed to execute the function. 

+*/

+//------------------------------------------------------------------------------

+int __ql_eint_disable(INTERNAL_ENUM_PINNAME eint_pin_name);

+

+

+/*-----------------------------------------------------------------------------------------------*/

+/**

+Function:     __ql_set_gpio_function 

+* 

+* Description:

+*             set pin function. 

+*

+* Parameters:

+*            pin_name:

+*            EINT pin name, one value of INTERNAL_ENUM_PINNAME.

+*		 func:

+*		 pin function,value range from 0 to 7

+*

+* Return:        

+*               RES_OK, this function succeeds.

+*               else failed to execute the function. 

+*/

+/*-----------------------------------------------------------------------------------------------*/

+int __ql_set_gpio_function(INTERNAL_ENUM_PINNAME pin_name,unsigned int func);

+

+

+/*-----------------------------------------------------------------------------------------------*/

+/*Function:     __ql_get_gpio_function 

+* 

+* Description:

+*               get pin function. 

+*

+* Parameters:

+*               pin_name:

+*               EINT pin name, one value of INTERNAL_ENUM_PINNAME.

+*

+* Return:        

+*               return 0-7, this function succeeds.

+*               else failed to execute the function. 

+*/

+/*-----------------------------------------------------------------------------------------------*/

+int __ql_get_gpio_function(INTERNAL_ENUM_PINNAME pin_name);

+

+/*-----------------------------------------------------------------------------------------------*/

+/*Function:     __ql_check_pin_function_status 

+* 

+* Description:

+*               Check whether the pin is gpio function. 

+*

+* Parameters:

+*               pin_name:

+*               EINT pin name, one value of INTERNAL_ENUM_PINNAME.

+*

+* Return:        

+*               return 1, this pin is gpio function.

+*               return 0, this pin is not gpio function. 

+*		     else failed to execute the function.

+*/

+/*-----------------------------------------------------------------------------------------------*/

+int __ql_check_pin_function_status(INTERNAL_ENUM_PINNAME  pin_name);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif

diff --git a/mbtk/include/ql_v2/ql_lanhost.h b/mbtk/include/ql_v2/ql_lanhost.h
new file mode 100755
index 0000000..66f28dd
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_lanhost.h
@@ -0,0 +1,105 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_lanhost.h 
+  @brief LANHOST API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20191016   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_LANHOST_H__
+#define __QL_LANHOST_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "ql_net_common.h"
+
+
+typedef void (*ql_lanhost_ind_cb_f)(QL_LANHOST_EVENT_TYPE_E event_type, ql_lanhost_t *p_host);
+
+typedef void (*ql_lanhost_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Initialize the lanhost service
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get all lanhost list, the maximum of lanhost is defined by QL_NET_MAX_LANHOST_NUM 
+  @param[out] list Lanhost array
+  @param[in,out] list_len, in-> array size, out->current instance number
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_get_list(ql_lanhost_t *list, int *list_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Register lanhost status change event
+  @param[in] cb 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_set_ind_cb(ql_lanhost_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_set_service_error_cb(ql_lanhost_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitialize the lanhost service 
+  @return 
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_deinit(void);
+
+#ifdef __cplusplus
+} 
+#endif
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_lpm.h b/mbtk/include/ql_v2/ql_lpm.h
new file mode 100755
index 0000000..376c4b4
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_lpm.h
@@ -0,0 +1,45 @@
+/*
+ *@file     ql_lpm.h
+ *@date     2020-04-01
+ *@author   gale
+ *@brief    the function is suitable for this product: 
+*/
+
+#ifndef __QL_LPM_H__
+#define __QL_LPM_H__
+
+typedef enum 
+{
+    E_QL_LPM_FALLING	= 0, /* Falling, Means wakeupin falling to wakeup the module, or wakeupout falling to wakeup mcu. */
+    E_QL_LPM_RISING	= 1, /* Rising, Means  wakeupin rising to wakeup the module,  or wakeupout rising to wakeup  mcu. */
+}ql_lpm_edge_t;
+
+/* Callback function registered via QL_Lpm_Init();
+ * It will be called when wakeup_in state changed.
+ * lpm_edge: report the wakeup_in state.
+*/
+typedef void (*ql_lpm_handler_t)
+(
+	ql_lpm_edge_t lpm_edge
+);
+
+/* Init QL LPM Init function.
+ * Para:
+ * 	ql_lpm_handler: the callback handler.
+ * 	
+ * Return value:
+ *	0  --> success
+ * 	-1 --> failed
+*/
+extern int ql_lpm_init(ql_lpm_handler_t ql_lpm_handler);
+
+/* Deinit QL LPM function
+ * Rmmod ql_lpm kmod, remove lpm handler.
+ * Return value:
+ * 	0  --> success
+ *	-1 --> failed 
+*/
+extern int ql_lpm_deinit(void);
+
+#endif // __QL_LPM_H__
+
diff --git a/mbtk/include/ql_v2/ql_ms_data_call.h b/mbtk/include/ql_v2/ql_ms_data_call.h
new file mode 100755
index 0000000..02d45fe
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_ms_data_call.h
@@ -0,0 +1,495 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_data_call.h
+  @brief Data service API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20181024   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_MS_DATA_CALL_H__
+#define __QL_MS_DATA_CALL_H__
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "ql_data_call.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call service
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Create a data call instance
+  @param[in] call_id The unique identifier of the data call instance, specified by the user
+  @param[in] call_name Friendly data call name,  specified by the user
+  @param[in] is_background Whether the data call status is maintained by the data call service daemon.
+  If it is 0, the data call instance will be deleted after the data call process exits.
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_create(int call_id, const char *call_name, int is_background);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Alloc for a data call configuration instance
+  @return
+  NULL - Not enough memory
+  Other - successful
+  */
+/*-----------------------------------------------------------------------------------------------*/
+ql_data_call_param_t *ql_ms_data_call_param_alloc(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_init(ql_data_call_param_t *param);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Release the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_free(ql_data_call_param_t *param);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Bind APN ID, range:1-16
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_id APN ID, range:1-16
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_apn_id(ql_data_call_param_t *param, int apn_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN ID
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_apn_id(ql_data_call_param_t *param, int *apn_id);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN name
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_name APN name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_apn_name(ql_data_call_param_t *param, const char *apn_name);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN name buffer
+  @param[in] buf_len APN name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_apn_name(ql_data_call_param_t *param, char *buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user name
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_name APN user name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_user_name(ql_data_call_param_t *param, const char *user_name);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user name buffer
+  @param[in] buf_len APN user name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_user_name(ql_data_call_param_t *param, char *buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user password
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_password APN user password
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_user_password(ql_data_call_param_t *param, const char *user_password);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user password from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user password buffer
+  @param[in] buf_len APN user password buffer size
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_user_password(ql_data_call_param_t *param, char *buf, int buf_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[in] auth_pref Defined by QL_DATA_CALL_AUTH_PREF_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_auth_pref(ql_data_call_param_t *param, int auth_pref);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_data Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_auth_pref(ql_data_call_param_t *param, int *p_data);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call IP version
+  @param[in] param Point to the data call configuration instance
+  @param[in] ip_ver Defined by QL_NET_IP_VER_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_ip_version(ql_data_call_param_t *param, int ip_ver);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get IP version from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_ver Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_ip_version(ql_data_call_param_t *param, int *p_ver);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection mode
+  @param[in] param Point to the data call configuration instance
+  @param[in] mode Defined by QL_NET_DATA_CALL_RECONNECT_MODE_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_reconnect_mode(ql_data_call_param_t *param, int reconnect_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection mode from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_mode Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_reconnect_mode(ql_data_call_param_t *param, int *p_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection interval
+  @param[in] param Point to the data call configuration instance
+  @param[in] time_list Interval time list in ms
+  @param[in] num Number of time list
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_reconnect_interval(ql_data_call_param_t *param, int *time_list, int num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection interval from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] time_list Store return value
+  @param[in,out] p_num
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_reconnect_interval(ql_data_call_param_t *param, int *time_list, int *p_num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call sim id
+  @param[in] param Point to the data call configuration instance
+  @param[in] sim_id Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_sim_id(ql_data_call_param_t *param, int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the data call sim id from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_sim_id Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_sim_id(ql_data_call_param_t *param, int *p_sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the specified data call instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_config(int call_id, ql_data_call_param_t *param);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the specified data call configuration instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_get_config(int call_id, ql_data_call_param_t *param);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Start data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_start(int call_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Stop data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_stop(int call_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Delete a data call instance
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_delete(int call_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the current data call instance list
+  @param[out] list Data call instance array
+  @param[in,out] list_len, in-> Data call instance array size, out->current data call instance number
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_get_list(ql_data_call_item_t *list, int *list_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the data call status
+  @param[in] call_id Specify a data call instance
+  @param[out] p_sta Point to status instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_get_status(int call_id, ql_data_call_status_t *p_sta);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Register data call status change event
+  @param[in] cb
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_set_status_ind_cb(ql_data_call_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set APN related configuration.If the apn does not exist, it is automatically created.
+  @param[in] sim_id SIM ID, range:1-2
+  @param[in] apn_id APN ID, range:1-16
+  @param[in] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_set_apn_config(int sim_id, int apn_id, ql_data_call_apn_config_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set APN related configuration. If the apn does not exist, it is automatically created and
+  the default parameters are set.
+  @param[in] sim_id SIM ID, range:1-2
+  @param[in] apn_id APN ID, range:1-16
+  @param[out] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_get_apn_config(int sim_id, int apn_id, ql_data_call_apn_config_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally,
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_set_service_error_cb(ql_data_call_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize the data call service
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_deinit(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_ms_dm.h b/mbtk/include/ql_v2/ql_ms_dm.h
new file mode 100755
index 0000000..b25c38f
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_ms_dm.h
@@ -0,0 +1,436 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_dm.h 
+  @brief device management API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2021 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200316   stan.li      Optimize the ql_dm_get_modem_state interface
+  20191224   stan.li      Add radio on/off API
+  20190625   stan.li      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_MS_DM_H__
+#define __QL_MS_DM_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ql_type.h"
+#include "ql_dm.h"
+
+typedef void (*ql_ms_dm_air_plane_mode_ind_cb)(int sim_id, QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode);
+typedef void (*ql_ms_dm_modem_state_ind_cb)(int statue);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize DM service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the DM service was successfully intialized.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_init(void);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize DM service.
+  @return Whether the DM service was successfully deintialized.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_deinit(void);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device software version. 
+  @param[out] soft_ver Return software version
+  @param[in] soft_ver_len The length of soft_ver
+  @return Whether to successfully get the software version
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_software_version(char *soft_ver, int soft_ver_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem state.
+  @details QL_DM_MODEM_STATE_ONLINE,if modem starts normally.
+  @details QL_DM_MODEM_STATE_OFFLINE,in modem starts abnormally.
+  @details QL_DM_MODEM_STATE_UNKNOWN,unknown error. 
+  @param[out] modem_state The state of modem
+  @return Whether to successfully get the modem state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_modem_state(QL_DM_MODEM_STATE_TYPE_E *modem_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register modem state event. 
+  @param[in] cb_func modem state indication callback function
+  @return Whether the modem state event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_modem_state_change_ind_cb(ql_dm_modem_state_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get module temperature. 
+  @param[out] temperature The current temperature
+  @return Whether to successfully get the temperature
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_temperature(float *temperature);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device serial numbers. 
+  @param[out] p_info Pointer that point to ql_dm_device_serial_numbers_info_t
+  @return Whether to successfully get the serial numbers
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_device_serial_numbers(ql_dm_device_serial_numbers_info_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device firmware revision identification. 
+  @param[out] firmware_rev_id Return device firmware revision id
+  @param[in] firmware_rev_id_len The length of firmware_rev_id
+  @return Whether to successfully get the firmware revision id
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_device_firmware_rev_id(char *firmware_rev_id, int firmware_rev_id_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get air plane mode. 
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to QL_DM_AIR_PLANE_MODE_TYPE_E
+  @return Whether to successfully get the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_air_plane_mode(int sim_id, QL_DM_AIR_PLANE_MODE_TYPE_E *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set air plane mode. 
+  @param[in] sim id number
+  @param[in] air_plane_mode 1:ON, 2:OFF
+  @return Whether to successfully set the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_air_plane_mode(int sim_id, QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register air plane mode event.
+  @param[in] sim_id Sim id number
+  @param[in] cb_func Air plane mode indication callback function
+  @return Whether the air plane mode event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_air_plane_mode_ind_cb(int sim_id, ql_ms_dm_air_plane_mode_ind_cb cb_func);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get cpu occupancy. 
+  @param[out] cpu_occupancy The percentage of cpu occupancy
+  @return Whether to successfully get the cpu occupancy
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_cpu_occupancy(float *cpu_occupancy);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get mem usage. 
+  @param[out] mem_use The percentage of mem usage
+  @return Whether to successfully get the memory usage
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_mem_usage(float *mem_use);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get NV item value. 
+  @param[in] sim id number
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[out] nv_item_value The nv value buf of nv_item_name
+  param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully get the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len,  int *nv_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set NV item value. 
+  @param[in] sim id number
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[in] nv_item_value The NV value of nv_item_name
+  @param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully set the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len, int *nv_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio on, its function is the same as at+cfun=1. 
+  @param[in] sim id number
+  @return Whether to successfully set the radio on
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_radio_on(int sim_id);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio off, its function is the same as at+cfun=0. 
+  @param[in] sim id number
+  @return Whether to successfully set the radio off
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_radio_off(int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem CPU utilization. 
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_modem_cpu_occupancy(float *cpu_occupancy);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem mem utilization. 
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_modem_mem_usage(float *mem_use);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS enable state 
+  @param[in] sim id number
+  @param[out] enable The enable state of QOOS
+  @return Whether to successfully get the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_qoos_enable(int sim_id, QL_DM_QOOS_ENABLE_TYPE_E *enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS enable state 
+  @param[in] sim id number
+  @param[in] enable The enable state of QOOS
+  @return Whether to successfully set the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_qoos_enable(int sim_id, QL_DM_QOOS_ENABLE_TYPE_E enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS configuration 
+  @param[in] sim id number
+  @param[out] config The configuration of QOOS
+  @return Whether to successfully get the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_qoos_config(int sim_id, ql_dm_qoos_config_t *config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS configuration 
+  @param[in] sim id number
+  @param[in] config The configuration of QOOS
+  @return Whether to successfully set the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_qoos_config(int sim_id, char enable ,int p1, int p2, int p3);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get MSSR(Modem SubSysem Reset) level. 
+  @param[out] p_level The MSSR level
+  @return Whether to successfully get the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_mssr_level(int *p_level);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set MSSR(Modem SubSysem Reset) level. 
+  @param[in] level The MSSR level
+  @return Whether to successfully set the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_mssr_level(int level);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_service_error_cb(ql_dm_service_error_cb_f cb);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_ms_nw.h b/mbtk/include/ql_v2/ql_ms_nw.h
new file mode 100755
index 0000000..4ff5463
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_ms_nw.h
@@ -0,0 +1,459 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_ms_nw.h 
+  @brief network registration service API, support Dual Sim Dual Active(DSDA).
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2021 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200518   rambo.shan   Add WEA and ETWS alert indication.
+  20191225   stan.li      Modify function description.
+  20191202   stan.li      change the name of ql_nw_pref_nwmode_roming_info_t
+  20190528   stan.li      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_MS_NW_H__
+#define __QL_MS_NW_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ql_type.h"
+#include "ql_nw.h"
+
+typedef void (*ql_ms_nw_voice_reg_ind_cb)(int sim_id, ql_nw_reg_status_info_t *p_info);
+
+typedef void (*ql_ms_nw_data_reg_ind_cb)(int sim_id, ql_nw_reg_status_info_t *p_info);
+
+typedef void (*ql_ms_nw_signal_strength_ind_cb)(int sim_id, ql_nw_signal_strength_info_t *p_info, QL_NW_SIGNAL_STRENGTH_LEVEL_E level);
+
+typedef void (*ql_ms_nw_cell_access_status_ind_cb)(int sim_id, QL_NW_CELL_ACCESS_STATE_TYPE_E status);
+
+typedef void (*ql_ms_nw_nitz_time_update_ind_cb)(int sim_id, ql_nw_nitz_time_info_t *p_info);
+
+typedef void (*ql_ms_nw_network_scan_async_cb)(int sim_id, int async_index, ql_nw_scan_result_list_info_t *p_info);
+
+typedef void (*ql_ms_nw_wea_reg_ind_cb)(int sim_id, ql_nw_wea_alert_info_t *p_info);
+
+typedef void (*ql_ms_nw_etws_reg_ind_cb)(int sim_id, ql_nw_etws_alert_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize NW service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the NW service was successfully intialized.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes NW service.
+  @return Whether the NW service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief scan network status.
+  @param[in] sim id number
+  @param[out] async_index The index of request msg
+  @param[in] async_cb The callback function of request msg
+  @return Whether to successfully trigger the network scan operation
+  @retval QL_ERR_OK  successful
+  @retval QL_ERR_NOT_INIT  uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY  service is not ready
+  @retval QL_ERR_INVALID_ARG  Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_network_scan(int sim_id, int *async_index, ql_ms_nw_network_scan_async_cb async_cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set power mode.
+  @param[in] sim id number
+  @param[in] lower_mode, defined by QL_NW_LOWER_POWER_MASK_XXX
+  @return Whether to successfully set the power mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_power_mode(int sim_id, uint8_t lower_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set perferred NW mode and roaming indicator.
+  @param[in] sim id number
+  @param[in] p_info Pointer that point to ql_nw_pref_nwmode_roaming_info_t
+  @return Whether to successfully set nwmode and roaming
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_pref_nwmode_roaming(int sim_id, ql_nw_pref_nwmode_roaming_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get perferred NW mode and roaming indicator.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_pref_nwmode_roaming_info_t 
+  @return Whether to successfully get nwmode and roaming
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_pref_nwmode_roaming(int sim_id, ql_nw_pref_nwmode_roaming_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get mobile operator name.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_mobile_operator_name_info_t
+  @return Whether to successfully get the mobile operator name
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_mobile_operator_name(int sim_id, ql_nw_mobile_operator_name_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get cell information.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_cell_info_t
+  @return Whether to successfully get the cell information
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_cell_info(int sim_id, ql_nw_cell_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get voice registration status.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_reg_status_info_t
+  @return Whether to successfully get the voice registration status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_voice_reg_status(int sim_id, ql_nw_reg_status_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get data registration status.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_reg_status_info_t
+  @return Whether to successfully get the data registration status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_data_reg_status(int sim_id, ql_nw_reg_status_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get current signal strength.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_signal_strength_info_t
+  @param[out] p_level: signal strength level
+  @return Whether to successfully get the signal strength
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_signal_strength(int sim_id, ql_nw_signal_strength_info_t *p_info, QL_NW_SIGNAL_STRENGTH_LEVEL_E* p_level);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get current cell acccess status.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to QL_NW_CELL_ACCESS_STATE_TYPE_E
+  @return Whether to successfully get the cell access status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_cell_access_status(int sim_id, QL_NW_CELL_ACCESS_STATE_TYPE_E *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get network time.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_nitz_time_info_t 
+  @return Whether to successfully get the network time
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_nitz_time_info(int sim_id, ql_nw_nitz_time_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register voice registration event.
+  @param[in] sim id number
+  @param[in] cb_func Voice registration indication callback function
+  @return Whether the voice registration event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+ */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_voice_reg_ind_cb(int sim_id, ql_ms_nw_voice_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register data registration event.
+  @param[in] sim id number
+  @param[in] cb_func Data registration indication callback function
+  @return Whether the data registration event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_data_reg_ind_cb(int sim_id, ql_ms_nw_data_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register signal strength event.
+  @param[in] sim id number
+  @param[in] cb_func Signal strength indication callback function
+  @return Whether the signal strength event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_signal_strength_ind_cb(int sim_id, ql_ms_nw_signal_strength_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register cell access status event.
+  @param[in] sim id number
+  @param[in] cb_func Cell access status indication callback function
+  @return Whether the cell access status event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_cell_access_status_ind_cb(int sim_id, ql_ms_nw_cell_access_status_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register network time event.
+  @param[in] sim id number
+  @param[in] cb_func nitz time update indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_nitz_time_update_ind_cb(int sim_id, ql_ms_nw_nitz_time_update_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register wea alert event.
+  @param[in] sim id number
+  @param[in] cb_func wea alert indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_wea_alert_ind_cb(int sim_id, ql_ms_nw_wea_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register etws alert event.
+  @param[in] sim id number
+  @param[in] cb_func etws alert indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_etws_alert_ind_cb(int sim_id, ql_ms_nw_etws_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set wea alert config.
+  @param[in] sim id number
+  @param[in] item Items to set.
+  @param[in] p_info Pointer that point to ql_nw_wea_config_t.
+  @return Whether to successfully set the wea config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_wea_config(int sim_id, int item, ql_nw_wea_config_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets wea config.
+  @param[in] sim id number
+  @param[out] p_config wea config.
+  @return Whether the wea config was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_wea_config(int sim_id, ql_nw_wea_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set etws alert config.
+  @param[in] sim id number
+  @param[in] etws config.
+  @return Whether to successfully set the etws config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_etws_config(int sim_id, uint8_t enable_etws);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get etws alert config.
+  @param[in] sim id number
+  @param[out] p_enable_etws Pointer.
+  @return Whether to successfully set the etws config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_etws_config(int sim_id, uint8_t* p_enable_etws);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get high capability subscription.
+  @param[in] sim id number
+  @param[out] p_high_cap pointer that point to QL_NW_BIND_SUB_TYPE_E
+  @return Whether the high capability subscription was successfully obtained.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_high_cap_sub(QL_NW_BIND_SUB_TYPE_E *p_high_cap);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set the SIM card index that can uniquely register to the 5G network. 
+  the main difference between high and non-high capability subscription is that high capability 
+  subscription can register to 5G network while non-high capability subscription can only 
+  register to LTE or GSM.
+  @param[in] sim id number
+  @param[in] high_cap high capability subscription 
+  @return Whether to successfully set the high capability subscription.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_high_cap_sub(QL_NW_BIND_SUB_TYPE_E high_cap);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] sim id number
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_service_error_cb(ql_nw_service_error_cb_f cb);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_ms_sim.h b/mbtk/include/ql_v2/ql_ms_sim.h
new file mode 100755
index 0000000..01dc771
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_ms_sim.h
@@ -0,0 +1,369 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_ms_sim.h 
+  @brief subscriber identity module service API, support Dual Sim Dual Active(DSDA). 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2021 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200720   solomon.cui  Created .
+-------------------------------------------------------------------------------------------------*/
+#ifndef __QL_MS_SIM_H__
+#define __QL_MS_SIM_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ql_type.h"
+#include "ql_sim.h"
+
+typedef void (*ql_ms_sim_card_status_cb_f)(int sim_id, ql_sim_card_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Initializes SIM service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the SIM service was intialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Deinitializes SIM service.
+  @return Whether the SIM service was deintialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets the IMSI (for 3GPP) or IMSI_M (for 3GPP2) from the SIM in ASCII form.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [out] imsi Buffer to fill IMSI data.
+  @param [in] imsi_len Buffer length.
+  @return Whether the IMSI was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_imsi(int sim_id, QL_SIM_APP_TYPE_E app_type, char *imsi, int imsi_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the Integrated Circuit Card ID (ICCID) stored on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [out] iccid Buffer to fill ICCID data.
+  @param [in] iccid_len Buffer length.
+  @return Whether the ICCID was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_iccid(int sim_id, char *iccid, int iccid_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the device phone number stored on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [out] phone_num Buffer to fill phone number.
+  @param [in] phone_num_len Buffer length.
+  @return Whether the phone number was successfully retrieved.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_phone_num(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                          char *phone_num, int phone_num_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the preferred operators stored on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] list Buffer to hold operators
+  @note This function is only supported by 3GPP applications.
+  @return Whether the preferred operators were successfully retrieved.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_operators(int sim_id, ql_sim_operator_list_t *list);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Enables the PIN on an application.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] pin_value PIN value. NULL terminated.
+  @return Whether the PIN was successfully enabled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_enable_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Disables the PIN on an application.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] pin_value PIN value. NULL terminated.
+  @return Whether the PIN was successfully disabled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_disable_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Verifies the PIN value of an application.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] pin_value PIN value. NULL terminated.
+  @note PIN must be enabled before calling this function.
+  @return Whether the PIN was successfully verified.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_verify_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Changes the PIN value of an application.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] old_pin_value Old PIN value. NULL terminated.
+  @param [in] new_pin_value New PIN value. NULL terminated.
+  @return Whether the PIN was successfully changed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_change_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *old_pin_value, const char *new_pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Unblocks a blocked PIN using the PUK code.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] puk_value PUK value.  NULL terminated.
+  @param [in] pin_value New PIN value.  NULL terminated.
+  @note The user must pass PUK1 to unblock PIN1 or PUK2 to unblock PIN2.
+  @return Whether the PIN was successfully unblocked.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_unblock_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *puk_value, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the card info stored on a card.
+  @param [in] sim_id sim_id to be used.
+  @param [out] p_info Pointer of ql_ms_sim_card_info_t.
+  @return Whether the card info was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_card_info(int sim_id, ql_sim_card_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Reads data from a specific file on a specified application on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [inout] p_file Pointer of ql_ms_sim_file_t.
+  @return Whether the file was successfully read.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_read_file(int sim_id, QL_SIM_APP_TYPE_E app_type, ql_sim_file_t *p_file);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Writes data to a specific file on a specified application on the card. 
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] p_file Pointer of ql_ms_sim_file_t
+  @note The type of file is determined by the record number field,
+    which indicates a transparent file when zero and a record-based file otherwise.
+  @return Whether the file was successfully written.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_write_file(int sim_id, QL_SIM_APP_TYPE_E app_type, ql_sim_file_t *p_file);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the info of a specific file on a specified application on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [inout] p_info Pointer of ql_ms_sim_file_info_t.
+  @return Whether the file info was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_file_info(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                                 ql_sim_file_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Reads phone book on a specified application on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Spplication type.
+  @param [in] pb_path Phone book path. NULL terminated.
+  @param [in] record_idx Record index to read. Starts from 1.
+  @param [out] p_record Pointer of ql_ms_sim_phone_book_record_t.
+  @return Whether the phone book record was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_read_phone_book(int sim_id, QL_SIM_APP_TYPE_E app_type,
+                                    const char *pb_path, uint8_t record_idx,
+                                    ql_sim_phone_book_record_t *p_record);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Writes phone book on a specified application on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pb_path Phone book path. NULL terminated.
+  @param [in] record_idx Record index to write. Starts from 1.
+  @param [in] p_record Pointer of ql_ms_sim_phone_book_record_t.
+  @note If p_record->name[0] = 0 and p_record->number[0] = 0, record will be deleted.
+  @return Whether the phone book record was successfully saved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_write_phone_book(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                                    const char *pb_path, uint8_t record_idx,
+                                    ql_sim_phone_book_record_t *p_record);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Opens a logical channel on a UICC card.
+  @param [in] sim_id sim_id to be used.
+  @param [out] channel_id Channel opened.
+  @return Whether the logical channel was successfully opened.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_open_logical_channel(int sim_id, uint8_t *channel_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Closes a logical channel on a UICC card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] channel_id Channel to be closed.
+  @return Whether the logical channel was successfully closed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_close_logical_channel(int sim_id, uint8_t channel_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sends an APDU to the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] channel_id Channel to be used.
+  @param [inout] p_apdu Pointer of ql_ms_sim_apdu_t.
+  @note You must call ql_ms_sim_open_logical_channel before sending an APDU.
+  @return Whether the APDU was successfully sent.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_send_apdu(int sim_id, uint8_t channel_id, ql_sim_apdu_t *p_apdu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets SIM card status callback handler
+  @param [in] sim_id sim_id to be used.
+  @param[in] cb call back handler.
+  @return Whether the card status callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_set_card_status_cb(int sim_id, ql_ms_sim_card_status_cb_f cb);
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_set_service_error_cb(ql_sim_service_error_cb_f cb);
+
+int ql_ms_sim_switch_slot(int sim_id, QL_SIM_PHY_SLOT_E phy_slot);
+int ql_ms_sim_get_active_slots(int sim_id, ql_sim_active_slots_t *p_active_slots);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_ms_sms.h b/mbtk/include/ql_v2/ql_ms_sms.h
new file mode 100755
index 0000000..c4f90c4
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_ms_sms.h
@@ -0,0 +1,206 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_ms_sms.h 
+  @brief short message service API, support Dual Sim Dual Active(DSDA). 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2021 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  2021069   Stan.li       Created.
+-------------------------------------------------------------------------------------------------*/
+#ifndef __QL_MS_SMS_H__
+#define __QL_MS_SMS_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ql_type.h"
+#include "ql_sms.h"
+
+
+typedef void (*ql_ms_sms_msg_async_cb_f)(int sim_id, int id, int result);
+typedef void (*ql_ms_sms_msg_recv_cb_f)(int sim_id, ql_sms_msg_t *p_msg, ql_sms_timestamp_t *timestamp,
+                                             ql_sms_user_data_head_t *head);
+typedef void (*ql_ms_sms_pdu_async_cb_f)(int sim_id, int id, int result);
+typedef void (*ql_ms_sms_pdu_recv_cb_f)(int sim_id, ql_sms_pdu_t *p_pdu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Initializes SMS service.
+  @return Whether the SMS service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes SMS service.
+  @return Whether the SMS service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets the service center address.
+  @param[in] sim id number
+  @param[in] addr service center address.
+  @param[in] len  service center address length.
+  @return Whether the service center address was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_set_service_center_addr(int sim_id, char *addr, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets the service center address.
+  @param[in] sim id number
+  @param[out] addr service center address.
+  @param[in] len  service center address length.
+  @return Whether the service center address was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_get_service_center_addr(int sim_id, char *addr, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends message synchronously.
+  @param[in] sim id number
+  @param[in] p_msg pointer to ql_ms_sms_msg_t.
+  @return Whether the message was successfully sent synchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_send_msg(int sim_id, ql_sms_msg_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends message asynchronously.
+  @param[in] sim id number
+  @param[in] p_msg  pointer to ql_ms_sms_msg_t
+  @param[out] id    id for this async operation
+  @param[in] cb     async callback
+  @return Whether the message was successfully sent asynchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_send_msg_async(int sim_id, ql_sms_msg_t *p_msg, int *id, ql_ms_sms_msg_async_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets SMS message reception callback hanlder.
+  @param[in] sim id number
+  @param[in] cb message reception callback handler.
+  @return Whether the message reception callback hanlder was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_set_msg_recv_cb(int sim_id, ql_ms_sms_msg_recv_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends PDU synchronously.
+  @param[in] sim id number
+  @param[in] p_pdu SMS PDU.
+  @return Whether the PDU was successfully sent synchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_send_pdu(int sim_id, ql_sms_pdu_t *p_pdu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends PDU asynchronously.
+  @param[in] sim id number
+  @param[in] p_pdu sms pdu.
+  @param[out] id id for this async operation.
+  @param[in] cb async callback.
+  @return Whether the PDU was successfully sent asynchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_send_pdu_async(int sim_id, ql_sms_pdu_t *p_pdu, int *id, ql_ms_sms_pdu_async_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets SMS PDU reception callback hanlder.
+  @param[in] sim id number
+  @param[in] cb PDU reception callback handler.
+  @return Whether the PDU reception callback hanlder was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_set_pdu_recv_cb(int sim_id, ql_ms_sms_pdu_recv_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_set_service_error_cb(ql_sms_service_error_cb_f cb);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_ms_voice.h b/mbtk/include/ql_v2/ql_ms_voice.h
new file mode 100755
index 0000000..54707e5
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_ms_voice.h
@@ -0,0 +1,428 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_ms_voice.h 
+  @brief Voice service DSDA API. 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20210622   Rambo.shan   Created, Added Voice DSDA API.
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_MS_VOICE_H__
+#define __QL_MS_VOICE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include "ql_voice.h"
+
+typedef void (*ql_ms_voice_ecall_status_cb_f)(int sim_id, uint32_t id, 
+                                                   QL_VOICE_ECALL_MSD_TRANS_STATUS_E status);
+
+typedef void (*ql_ms_voice_ecall_event_cb_f)(int sim_id, ql_voice_ecall_event_t *p_event);
+
+typedef void (*ql_ms_voice_call_cb_f)(int sim_id, ql_voice_record_array_t *p_arr);
+
+/** voice dtmf event callback */
+typedef void (*ql_ms_voice_dtmf_cb_f)(int sim_id, uint32_t id, QL_VOICE_DTMF_EVENT_E event, 
+                                        char *digits, int len); /**< len: length of digits */
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Initializes voice service.
+  @return Whether the voice service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes voice service.
+  @return Whether the voice service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Dials a call.
+  @param[in] num    phone number to dial.
+  @param[in] len    length of phone number, should be less than 
+                    or euqnal to QL_VOICE_MAX_PHONE_NUMBER.
+  @param[out] id    call id.
+  @return Whether a voice call was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_dial(int sim_id, char *num, int len, uint32_t *id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Cancels dialing with given id.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully cancelled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_cancel_dial(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  hangup all dialing.
+  @return Whether all voice call were successfully hangup.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_hangup_all(int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Answers the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully answered.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_answer(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Hangs up the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_hangup(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Holds the call when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully held.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_hold(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Releases the call from hold when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully unheld.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_unhold(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets call records.
+  @param[in] p_arr  pointer to ql_voice_record_array_t.
+  @return Whether the call records were successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_get_records(int sim_id, ql_voice_record_array_t *p_arr);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Registers or Unregisters forwarding.
+  @param[in] reg    0 - unregister, 1 - register.
+  @param[in] cond   forwarding condition.
+  @param[in] num    phone number.
+  @param[in] len    length of phone numebr.
+  @return Whether the voice call forward was registered or unregistered successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_forwarding(int sim_id, int reg, QL_VOICE_FW_COND_E cond, char *num, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets forwarding status.
+  @param[in]  cond      forwarding condition.
+  @param[out] p_status  pointer to ql_voice_fw_status_t.
+  @return Whether the voice call forward status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_get_forwarding_status(int sim_id, QL_VOICE_FW_COND_E cond, ql_voice_fw_status_t *p_status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Enables or disables call waiting.
+  @param[in] enable 0 - disable, other - enable.
+  @return Whether the voice call waiting was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_waiting(int sim_id, int enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets call waiting status.
+  @param[out] enabled 0 - waiting is disabled, 1 - waiting is enabled.
+  @return Whether the voice call waiting status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_get_waiting_status(int sim_id, int *enabled);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Enables or disables auto answer.
+  @param[in] enable 0 - disable, other - enable.
+  @param[in] sec    wait this `sec' seconds before auto answer.
+  @return Whether the voice call autoanswer was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_autoanswer(int sim_id, int enable, uint32_t sec);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends a DTMF(Dual Tone Multi Frequency) character over the call ID.
+  @param[in] id call id returned from dial.
+  @param[in] c DTMF character to be sent. Valid DTMF characters are 0-9, A-D, '*', '#'.
+  @return Whether a DTMF character was successfully sent.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_send_dtmf_char(int sim_id, uint32_t id, char c);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets voice call callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_set_call_cb(int sim_id, ql_ms_voice_call_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets voice dtmf callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call DTMF repcetion callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_set_dtmf_cb(int sim_id, ql_ms_voice_dtmf_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Dials eCall.
+  @param[in] p_info eCall info.
+  @return Whether a eCall was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_dial(int sim_id, ql_voice_ecall_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Hangs up eCall.
+  @return Whether the eCall was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_hangup(int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Updates eCall MSD.
+  @param[in] msd Minimum Set of Data.
+  @param[in] msd_len Length of Minimum Set of Data.
+  @return Whether the eCall MSD was successfully updated.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_update_msd(int sim_id, const uint8_t *msd, uint32_t msd_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Pushes eCall MSD.
+  @param[out] state eCall state.
+  @return Whether the eCall MSD was successfully pushed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_push_msd(int sim_id, QL_VOICE_ECALL_STATE_E *state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets eCall config.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_get_config(int sim_id, ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall config.
+  @param[in] item Items to set.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_set_config(int sim_id, int item, ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall event callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall event callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_set_event_cb(int sim_id, ql_ms_voice_ecall_event_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall status callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall status callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_set_status_cb(int sim_id, ql_ms_voice_ecall_status_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_set_service_error_cb(ql_voice_service_error_cb_f cb);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* __QL_VOICE_H__ */
+
diff --git a/mbtk/include/ql_v2/ql_net_common.h b/mbtk/include/ql_v2/ql_net_common.h
new file mode 100755
index 0000000..b6071d8
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_net_common.h
@@ -0,0 +1,151 @@
+#ifndef __QL_NET_COMMON_H__
+#define __QL_NET_COMMON_H__
+
+#include <stdint.h>
+/**  Maximum length of the APN name. */
+#define QL_NET_MAX_APN_NAME_LEN   150
+
+/**  Maximum length of the APN user name. */
+#define QL_NET_MAX_APN_USERNAME_LEN   127
+
+/**  Maximum length of the password. */
+#define QL_NET_MAX_APN_PASSWORD_LEN   127
+
+/**  Maximum address length. */
+#define QL_NET_MAX_ADDR_LEN       46
+
+// 1 - 7 (ASR 1806)
+#define QL_NET_MAX_DATA_CALL_NUM  7
+
+/**  Maximum lenth of the device name. */
+#define QL_NET_MAX_NAME_LEN         32
+#define QL_NET_MAX_RECONNECT_INTERVAL_LEN  20
+#define QL_NET_MAX_APN_ID                  QL_NET_MAX_DATA_CALL_NUM
+#define QL_NET_USB_DEV_MAX_NUM             QL_NET_MAX_DATA_CALL_NUM
+
+#define QL_NET_MAX_LANHOST_NUM      18
+#define QL_NET_MAX_LANHOST_NAME_LEN 64
+
+typedef enum {
+  QL_NET_DATA_CALL_STATUS_MIN = -1,
+  QL_NET_DATA_CALL_STATUS_NONE = 0x0,    /**< Call state is NONE     */
+  QL_NET_DATA_CALL_STATUS_CREATED = 0x1, /**< Call state was created  */
+  QL_NET_DATA_CALL_STATUS_IDLE = 0x2,    /**< Call state is IDLE.    */
+  QL_NET_DATA_CALL_STATUS_CONNECTING = 0x3,           /**< Call is connecting.    */
+  QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED = 0x4, /**< V4V6 mode, V4 is connected.  */
+  QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED = 0x5, /**< V4V6 mode, V6 is connected.  */
+  QL_NET_DATA_CALL_STATUS_CONNECTED = 0x6,            /**< Call is connected.     */
+  QL_NET_DATA_CALL_STATUS_DISCONNECTED = 0x7,         /**< Call is disconnected.  */
+  QL_NET_DATA_CALL_STATUS_ERROR = 0x8,                /**< Error ocurred   */
+  QL_NET_DATA_CALL_STATUS_DELETED = 0x9,              /**< Data Call was deleted   */
+  QL_NET_DATA_CALL_STATUS_MAX
+} QL_NET_DATA_CALL_STATUS_E;
+
+#define IS_QL_NET_DATA_CALL_STATUS_VALID(status) \
+    ((status)>QL_NET_DATA_CALL_STATUS_MIN && (status)<QL_NET_DATA_CALL_STATUS_MAX)
+
+typedef enum {
+  QL_NET_DATA_CALL_RECONNECT_MODE_MIN = -1,
+  QL_NET_DATA_CALL_RECONNECT_DISABLE = 0x0,
+  QL_NET_DATA_CALL_RECONNECT_NORMAL = 0x1, /**< Normal mode, interval defined by reconnect_interval[0] in sec  */
+  QL_NET_DATA_CALL_RECONNECT_MODE_1 = 0x2, /**< Mode 1, time interval list defined by reconnect_interval in sec,
+    if the time interval list is T1,T2,T3...Tn, the reconnection interval is T1,T2,T3...Tn,Tn,Tn...Tn  */
+  QL_NET_DATA_CALL_RECONNECT_MODE_2 = 0x3, /**< Mode 2, time interval list defined by reconnect_interval in sec,
+    if the time interval list is T1,T2,T3...Tn, the reconnection interval is T1,T2,T3..Tn,T1,T2,T3..Tn,T1..   */
+  QL_NET_DATA_CALL_RECONONECT_MODE_MAX
+} QL_NET_DATA_CALL_RECONNECT_MODE_E;
+
+#define IS_QL_NET_DATA_CALL_RECONNECT_MODE_VALID(mode) \
+    ((mode)>QL_NET_DATA_CALL_RECONNECT_MODE_MIN && (mode)<QL_NET_DATA_CALL_RECONONECT_MODE_MAX)
+
+typedef enum {
+  QL_NET_IP_VER_MIN = -0,
+  QL_NET_IP_VER_V4 = 0x1,
+  QL_NET_IP_VER_V6 = 0x2,
+  QL_NET_IP_VER_V4V6 = 0x3,
+  QL_NET_IP_VER_MAX
+} QL_NET_IP_VER_E;
+
+#define IS_QL_NET_IP_VER_VALID(ver) \
+    ((ver)>QL_NET_IP_VER_MIN && (ver)<QL_NET_IP_VER_MAX)
+
+typedef enum {
+  QL_NET_AUTH_PREF_MIN = -1,
+  QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED = 0,
+  QL_NET_AUTH_PREF_PAP_ONLY_ALLOWED = 1,
+  QL_NET_AUTH_PREF_CHAP_ONLY_ALLOWED = 2,
+  QL_NET_AUTH_PREF_PAP_CHAP_BOTH_ALLOWED = 3,
+  QL_NET_AUTH_PREF_MAX
+} QL_NET_AUTH_PREF_E;
+
+#define IS_QL_NET_AUTH_PREF_VALID(pref) \
+    ((pref)>QL_NET_AUTH_PREF_MIN && (pref)<QL_NET_AUTH_PREF_MAX)
+
+typedef enum {
+  QL_NET_USB_DEV_TYPE_MIN = 0,
+  QL_NET_USB_DEV_TYPE_ECM = 1,
+  QL_NET_USB_DEV_TYPE_NCM = 2,
+  QL_NET_USB_DEV_TYPE_RNDIS = 3,
+  QL_NET_USB_DEV_TYPE_MBIM = 4,
+  QL_NET_USB_DEV_TYPE_MAX
+} QL_NET_USB_DEV_TYPE_E;
+
+typedef enum {
+  QL_NET_USB_DEV_STATUS_MIN = -1,
+  QL_NET_USB_DEV_STATUS_NONE = 0,
+  QL_NET_USB_DEV_STATUS_LINKDOWN = 1,
+  QL_NET_USB_DEV_STATUS_LINKUP = 2,
+  QL_NET_USB_DEV_STATUS_MAX
+} QL_NET_USB_DEV_STATUS_E;
+
+typedef enum {
+  QL_NET_NF_CMD_FORMAT_MIN = -1,
+  QL_NET_NF_CMD_FORMAT_COMMON = 0,
+  QL_NET_NF_CMD_FORMAT_JSON = 1,
+  QL_NET_NF_CMD_FORMAT_MAX
+} QL_NET_NF_CMD_FORMAT_E;
+
+typedef enum {
+    QL_LANHOST_EVENT_ADD = 0,
+    QL_LANHOST_EVENT_DEL,
+    QL_LANHOST_EVENT_UPDATE,
+} QL_LANHOST_EVENT_TYPE_E;
+
+typedef struct {
+  char device[QL_NET_MAX_NAME_LEN];
+  QL_NET_USB_DEV_TYPE_E type;
+  QL_NET_USB_DEV_STATUS_E status;
+  int8_t inst_id;
+} ql_net_usb_dev_t;
+
+typedef struct {
+  char addr[QL_NET_MAX_ADDR_LEN];    /**< IPV4 address format string */
+  char netmask[QL_NET_MAX_ADDR_LEN]; /**< Subnet mask, format */
+  uint8_t subnet_bits;                     /**< Subnet mask bit number, exp:
+                                            255.255.255.0 is 24, 255.255.0.0 is 16 */
+  char gateway[QL_NET_MAX_ADDR_LEN]; /**< Gateway, IPV4 address*/
+  char dnsp[QL_NET_MAX_ADDR_LEN];    /**< Primary DNS server address. */
+  char dnss[QL_NET_MAX_ADDR_LEN];    /**< Secondary DNS server address. */
+} ql_net_addr_t;
+
+typedef struct
+{
+  char addr[QL_NET_MAX_ADDR_LEN];    /**< IPV6 address format string */
+  char prefix[QL_NET_MAX_ADDR_LEN];
+  int32_t prefix_bits;
+  char gateway[QL_NET_MAX_ADDR_LEN]; /**< Gateway address. */
+  char dnsp[QL_NET_MAX_ADDR_LEN];    /**< Primary DNS server address. */
+  char dnss[QL_NET_MAX_ADDR_LEN];    /**< Secondary DNS server address. */
+} ql_net_addr6_t;
+
+typedef struct
+{
+    char addr[QL_NET_MAX_ADDR_LEN];    /**< IPV4 address format string */
+    char macaddr[18];                   /**< MAC address, format: XX:XX:XX:XX:XX:XX */
+    char name[QL_NET_MAX_LANHOST_NAME_LEN]; /**< hostname */
+    char ifname[QL_NET_MAX_NAME_LEN];  /**< device name */
+    int  uptime;                       /**< online time in sec */
+} ql_lanhost_t;
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_net_usb_dev.h b/mbtk/include/ql_v2/ql_net_usb_dev.h
new file mode 100755
index 0000000..427c88b
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_net_usb_dev.h
@@ -0,0 +1,190 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_net_usb_dev.h 
+  @brief USB net device API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20190709   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_NET_USB_DEV_H__
+#define __QL_NET_USB_DEV_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "ql_net_common.h"
+
+
+typedef void (*ql_net_usb_dev_ind_cb_f)(const char *device,
+        QL_NET_USB_DEV_STATUS_E pre_status,
+        ql_net_usb_dev_t *p_dev);
+
+typedef void (*ql_net_usb_dev_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Initialize the USB net device service
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get USB network device status
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[out] p_dev Return device status information
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  QL_ERR_INTERFACE_NOT_FOUND - device does not exist
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_get_status(const char *device, ql_net_usb_dev_t *p_dev);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get all USB network device list
+  @param[out] list USB network device array
+  @param[in,out] list_len, in-> array size, out->current instance number
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_get_list(ql_net_usb_dev_t *list, int *list_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Set USB network device MTU. If it does not currently exist, then set it after the device 
+  appears.
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[in] mtu MTU 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_set_mtu(const char *device, int mtu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get USB network device MTU
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[out] p_mtu Reutn device MTU
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  QL_ERR_INTERFACE_NOT_FOUND - device does not exist
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_get_mtu(const char *device, int *p_mtu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Set USB network device MAC address. If it does not currently exist, then set it after the device 
+  appears.
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[in] macaddr MAC address, format: XX:XX:XX:XX:XX:XX 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  QL_ERR_INTERFACE_NOT_FOUND - device does not exist
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_set_macaddr(const char *device, const char *macaddr);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get USB network device MAC address
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[out] macaddr_buf Return MAC address
+  @param[in] buf_len Buffer size
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  QL_ERR_INTERFACE_NOT_FOUND - device does not exist
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_get_macaddr(const char *device, char *macaddr_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Register USB network device status change event
+  @param[in] cb 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_set_ind_cb(ql_net_usb_dev_ind_cb_f cb);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_set_service_error_cb(ql_net_usb_dev_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Deinitialize the USB net device service
+  @return 
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_deinit(void);
+
+#ifdef __cplusplus
+} 
+#endif
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_nf.h b/mbtk/include/ql_v2/ql_nf.h
new file mode 100755
index 0000000..d07a524
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_nf.h
@@ -0,0 +1,135 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_nf.h 
+  @brief Network framework API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20181024   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_NF_H__
+#define __QL_NF_H__
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "ql_net_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+    char name[QL_NET_MAX_NAME_LEN];
+    char ifname[QL_NET_MAX_NAME_LEN];
+    char pre_status[16];
+    char status[16];
+    uint8_t has_addr;
+    ql_net_addr_t addr;
+    uint8_t has_addr6;
+    ql_net_addr6_t addr6;
+} ql_nf_interface_status_t;
+
+typedef void (*ql_nf_interface_status_ind_cb_f)(ql_nf_interface_status_t *p_msg);
+
+typedef void (*ql_nf_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Initialize network service
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Send a command and wait for a response
+  @param[in] cmd Command
+  @param[out] resp_buf Response 
+  @param[in] resp_len Response buffer length 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_cmd(const char *cmd, char *resp_buf, int resp_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Send a command and wait for a response
+  @param[in] cmd Command
+  @param[out] resp_buf Response 
+  @param[in] resp_len Response buffer length 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_cmd_json(const char *cmd, char *resp_buf, int resp_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Register NF interface status change event event
+  @param[in] cb 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_set_interface_status_ind_cb(ql_nf_interface_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_set_service_error_cb(ql_nf_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Deinitialize the data call service
+  @return 
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_deinit(void);
+
+#ifdef __cplusplus
+} 
+#endif
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_nslookup.h b/mbtk/include/ql_v2/ql_nslookup.h
new file mode 100755
index 0000000..9874c04
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_nslookup.h
@@ -0,0 +1,30 @@
+/**
+ *@file     quectel_nslookup.h
+ *@date     2017-07-05
+ *@author   running.qian
+ *@brief    Simple DNS Reslove
+ */
+#ifndef _QUECTEL_NSLOOKUP_H_
+#define _QUECTEL_NSLOOKUP_H_
+
+#include <arpa/inet.h>
+
+typedef enum  {
+    QUERY_IPV4_E,
+    QUERY_IPV6_E
+} QUERY_IP_TYPE;
+
+
+typedef struct {
+    int addr_cnt;//must be set 0 when call QL_nslookup 
+    struct in_addr addr[5];
+    
+    int addr6_cnt;//must be set 0 when call QL_nslookup
+    struct in6_addr addr6[5];
+} hostaddr_info_u;
+
+/**
+ * Perform a DNS query by sending a packet
+ */
+void ql_nslookup(char *host, char *dns_server_ip, QUERY_IP_TYPE ip_type, hostaddr_info_u *resolved_addr);
+#endif
diff --git a/mbtk/include/ql_v2/ql_nw.h b/mbtk/include/ql_v2/ql_nw.h
new file mode 100755
index 0000000..d0504e0
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_nw.h
@@ -0,0 +1,885 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_nw.h 
+  @brief network registration API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+
+
+#ifndef __QL_NW_H__
+#define __QL_NW_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define QL_NW_MODE_NONE    0x00    /**<  No network. */
+#define QL_NW_MODE_GSM     0x01    /**<  Include GSM networks. */
+#define QL_NW_MODE_WCDMA   0x02    /**<  Include WCDMA networks. */
+#define QL_NW_MODE_CDMA    0x04    /**<  Include CDMA networks. */
+#define QL_NW_MODE_EVDO    0x08    /**<  Include EVDO networks. */
+#define QL_NW_MODE_LTE     0x10    /**<  Include LTE networks. */
+#define QL_NW_MODE_TDSCDMA 0x20    /**<  Include TDSCDMA networks. */
+#define QL_NW_MODE_NR5G    0x40    /**<  Include NR5G networks. */
+#define QL_NW_MODE_PRL     0x10000 /**<  Give preference according to the preferred roaming list. */
+
+#define QL_NW_NR5G_SO_NONE      0X00 /**<  No service option */
+#define QL_NW_NR5G_SO_TDD       0X01 /**<  Include service option TDD, Time Division Duplex */
+#define QL_NW_NR5G_SO_SUB6      0X02 /**<  Include service option SUB6, 5G frequency, SUB_6GHz */
+#define QL_NW_NR5G_SO_MMWAVE    0X04 /**<  Include service option MMWARE, 5G frequency, 30~300GHz */
+#define QL_NW_NR5G_SO_NSA       0X08 /**<  Include service option NSA, Non_Stand Alone, 5G base station and 4G core network */
+#define QL_NW_NR5G_SO_SA        0X10 /**<  Include service option SA, Stan Alone, 5G base station and 5G core network */
+
+#define QL_NW_LOWER_POWER_MASK_DISABLE  0x00
+#define QL_NW_LOWER_POWER_MASK_NORMAL   0x01
+#define QL_NW_LOWER_POWER_MASK_NETWORK  0x02
+#define QL_NW_LOWER_POWER_MASK_SIM      0x04
+#define QL_NW_LOWER_POWER_MASK_SMS      0x08
+#define QL_NW_LOWER_POWER_MASK_VOICE    0x10
+
+#define QL_NW_NITZ_BUF_LEN      30
+#define QL_NW_SCAN_MAX_LIST_NUM 40
+#define QL_NW_MAX_GSM_CELL_INFO_NUM     20
+#define QL_NW_MAX_UMTS_CELL_INFO_NUM    20
+#define QL_NW_MAX_LTE_CELL_INFO_NUM     20
+
+#define QL_NW_MAX_WEA_ALERT_LENGTH_V01  512
+#define QL_NW_MAX_ETWS_ALERT_LENGTH_V01 256
+
+typedef enum QL_NW_SIGNAL_STRENGTH_LEVEL_ENUM
+{
+    QL_NW_SIGNAL_STRENGTH_LEVEL_MIN             = -1,
+    QL_NW_SIGNAL_STRENGTH_LEVEL_NONE            = 0,  /**<  none or unknown signal strength level */
+    QL_NW_SIGNAL_STRENGTH_LEVEL_POOR            = 1,  /**<  poor     signal strength level */
+    QL_NW_SIGNAL_STRENGTH_LEVEL_MODERATE        = 2,  /**<  moderate signal strength level */
+    QL_NW_SIGNAL_STRENGTH_LEVEL_GOOD            = 3,  /**<  good     signal strength level */
+    QL_NW_SIGNAL_STRENGTH_LEVEL_GREAT           = 4,  /**<  great    signal strength level */
+    QL_NW_SIGNAL_STRENGTH_LEVEL_MAX
+}QL_NW_SIGNAL_STRENGTH_LEVEL_E;
+
+typedef enum QL_NW_ROAM_STATE_TYPE_ENUM
+{
+    QL_NW_ROAM_STATE_OFF  = 0,    /**<  None, or roaming indicator off. */
+    QL_NW_ROAM_STATE_ON   = 1     /**<  Roaming indicator on. */
+}QL_NW_ROAM_STATE_TYPE_E;
+
+typedef enum QL_NW_NETWORK_STATUS_TYPE_ENUM
+{
+    QL_NW_NETWORK_STATUS_NONE            = 0,    /**<  Network status not available. */
+    QL_NW_NETWORK_STATUS_CURRENT_SERVING = 1,    /**<  Current serving network. */
+    QL_NW_NETWORK_STATUS_PREFERRED       = 2,    /**<  Preferred network. */
+    QL_NW_NETWORK_STATUS_NOT_PREFERRED   = 3,    /**<  Not the preferred network. */
+    QL_NW_NETWORK_STATUS_AVAILABLE       = 4,    /**<  Service available. */
+    QL_NW_NETWORK_STATUS_FORBIDDEN       = 5     /**<  Forbidden service. */
+}QL_NW_NETWORK_STATUS_TYPE_E;
+
+typedef enum QL_NW_RADIO_TECH_TYPE_ENUM
+{
+    QL_NW_RADIO_TECH_TD_SCDMA = 1,
+    QL_NW_RADIO_TECH_GSM      = 2,    /**<  GSM; only supports voice. */
+    QL_NW_RADIO_TECH_HSPAP    = 3,    /**<  HSPA+. */
+    QL_NW_RADIO_TECH_LTE      = 4,    /**<  LTE. */
+    QL_NW_RADIO_TECH_EHRPD    = 5,    /**<  EHRPD. */
+    QL_NW_RADIO_TECH_EVDO_B   = 6,    /**<  EVDO B. */
+    QL_NW_RADIO_TECH_HSPA     = 7,    /**<  HSPA. */
+    QL_NW_RADIO_TECH_HSUPA    = 8,    /**<  HSUPA. */
+    QL_NW_RADIO_TECH_HSDPA    = 9,    /**<  HSDPA. */
+    QL_NW_RADIO_TECH_EVDO_A   = 10,   /**<  EVDO A. */
+    QL_NW_RADIO_TECH_EVDO_0   = 11,   /**<  EVDO 0. */
+    QL_NW_RADIO_TECH_1xRTT    = 12,   /**<  1xRTT. */
+    QL_NW_RADIO_TECH_IS95B    = 13,   /**<  IS95B. */
+    QL_NW_RADIO_TECH_IS95A    = 14,   /**<  IS95A. */
+    QL_NW_RADIO_TECH_UMTS     = 15,   /**<  UMTS. */
+    QL_NW_RADIO_TECH_EDGE     = 16,   /**<  EDGE. */
+    QL_NW_RADIO_TECH_GPRS     = 17,   /**<  GPRS. */
+    QL_NW_RADIO_TECH_NR5G     = 18,   /**<  NR5G. */
+    QL_NW_RADIO_TECH_NONE     = 19    /**<  No technology selected. */
+}QL_NW_RADIO_TECH_TYPE_E;
+
+typedef enum QL_NW_TECH_DOMAIN_TYPE_ENUM
+{
+    QL_NW_TECH_DOMAIN_NONE    = 0,    /**<  None. */
+    QL_NW_TECH_DOMAIN_3GPP    = 1,    /**<  3GPP. */
+    QL_NW_TECH_DOMAIN_3GPP2   = 2,    /**<  3GPP2. */
+}QL_NW_TECH_DOMAIN_TYPE_E;
+
+typedef enum QL_NW_DENY_REASON_TYPE_ENUM
+{
+    QL_NW_IMSI_UNKNOWN_IN_HSS_DENY_REASON                                  = 2, /**<  IMSI unknown in HSS */
+    QL_NW_ILLEGAL_UE_DENY_REASON                                           = 3, /**<  Illegal UE */
+    QL_NW_IMEI_NOT_ACCEPTED_DENY_REASON                                    = 5, /**<  IMEI not accepted */
+    QL_NW_ILLEGAL_ME_DENY_REASON                                           = 6, /**<  Illegal ME */
+    QL_NW_EPS_SERVICES_NOT_ALLOWED_DENY_REASON                             = 7, /**<  EPS services not allowed */
+    QL_NW_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED_DENY_REASON        = 8, /**<  EPS services and non-EPS services not allowed */
+    QL_NW_UE_ID_CANNOT_BE_DERIVED_BY_THE_NETWORK_DENY_REASON               = 9, /**<  UE identifity cannot be derived by the network */
+    QL_NW_IMPLICITY_DETACHED_DENY_REASON                                   = 10, /**<  Implicitly detached */
+    QL_NW_PLMN_NOT_ALLOWED_DENY_REASON                                     = 11, /**<  PLMN not allowed */
+    QL_NW_TRACKING_AREA_NOT_ALLOWED_DENY_REASON                            = 12, /**<  Tracking area not allowed */
+    QL_NW_ROAMING_NOT_ALLOWED_IN_THIS_TRACNING_AREA_DENY_REASON            = 13, /**<  Roaming not allowed in this tracking area */
+    QL_NW_EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN_DENY_REASON                = 14, /**<  EPS services not allowed in this PLMN */
+    QL_NW_NO_SUITALBE_CELLS_IN_TRACKING_AREA_DENY_REASON                   = 15, /**<  No suitable cells in tracking area */
+    QL_NW_MSC_TEMPORARILY_NOT_REACHABLE_DENY_REASON                        = 16, /**<  MSC temporarily not reachable */
+    QL_NW_NETWORK_FAILURE_DENY_REASON                                      = 17, /**<  Network failure */
+    QL_NW_CS_DOMAIN_NOT_AVAILABLE_DENY_REASON                              = 18, /**<  CS domain not available */
+    QL_NW_EMS_FAILURE_DENY_REASON                                          = 19, /**<  ESM failure */
+    QL_NW_MAC_FAILURE_DENY_REASON                                          = 20, /**<  MAC failure */
+    QL_NW_SYNC_FAILURE_DENY_REASON                                         = 21, /**<  Synch failure */
+    QL_NW_CONGESTION_DENY_REASON                                           = 22, /**<  Congestion */
+    QL_NW_UE_SECURITY_CAPABILITIES_MISMATCH_DENY_REASON                    = 23, /**<  UE security capabilities mismatch */
+    QL_NW_SECURITY_MODE_REJECTED_DENY_REASON                               = 24, /**<  Security mode rejected, unspecified */
+    QL_NW_NOT_AUTHORIZED_FOR_THIS_CSG_DENY_REASON                          = 25, /**<  Not authorized for this CSG */
+    QL_NW_NON_EPS_AUTHENTICATION_UNCACCEPTABLE_DENY_REASON                 = 26, /**<  Non-EPS authentication unacceptable */
+    QL_NW_REQUESTED_SERVICE_OPTION_NOT_AUTHORIZED_IN_THIS_PLMN_DENY_REASON = 35, /**<  Requested service option not authorized in this PLMN */
+    QL_NW_CS_SERVICE_TEMPORARILY_NOT_AVAILABLE_DENY_REASON                 = 39, /**<  CS service temporarily not available */
+    QL_NW_NO_ESP_BEARER_CONTEXT_ACTIVATED_DENY_REASON                      = 40, /**<  No EPS bearer context activated */
+    QL_NW_SEMAMTICALLY_INCORRECT_MESSAGE_DENY_REASON                       = 95, /**<  Semantically incorrect message. */
+    QL_NW_INVALID_MANDATORY_INFORMATION_DENY_REASON                        = 96, /**<  Invalid mandatory information. */
+    QL_NW_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED_DENY_REASON         = 97, /**<  Message type non-existent or not implemented. */
+    QL_NW_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCAL_STATE_DENY_REASON      = 98, /**<  Message type not compatible with protocol state. */
+    QL_NW_INFORMATION_ELEMENT_NON_EXISTENT_OR_NOT_IMPLEMENTED_DENY_REASON  = 99, /**<   Information element non-existent or not implemented. */
+    QL_NW_CONDITIONAL_IE_ERROR_DENY_REASON                                 = 100, /**<  Conditional IE error. */
+    QL_NW_MESSAGE_NOT_COMPATIBLE_WITH_PROTOCAL_STATE_DENY_REASON           = 101, /**<  Message not compatible with protocol state. */
+}QL_NW_DENY_REASON_TYPE_E;
+
+typedef enum QL_NW_SERVICE_TYPE_ENUM
+{
+    QL_NW_SERVICE_NONE    = 0,  /**<  Not registered or no data. */
+    QL_NW_SERVICE_LIMITED = 1,  /**<  Registered; emergency service only. */
+    QL_NW_SERVICE_FULL    = 2,  /**<  Registered, full service. */
+}QL_NW_SERVICE_TYPE_E;
+
+typedef enum QL_NW_SELECTION_TYPE_ENUM
+{
+    QL_NW_SELECTION_AUTOMATIC = 0,     /**<  Automatic network selection. */
+    QL_NW_SELECTION_MANUAL    = 1,     /**<  Manual network selection. */
+}QL_NW_SELECTION_TYPE_E;
+
+typedef enum QL_NW_CELL_ACCESS_STATE_TYPE_ENUM
+{
+    QL_NW_CELL_ACCESS_NONE           = 0,             /**<  Unknown cell access state. */
+    QL_NW_CELL_ACCESS_NORMAL_ONLY    = 1,             /**<  Cell access is allowed for normal calls only. */
+    QL_NW_CELL_ACCESS_EMERGENCY_ONLY = 2,             /**<  Cell access is allowed for emergency calls only. */
+    QL_NW_CELL_ACCESS_NO_CALLS       = 3,             /**<  Cell access is not allowed for any call type. */
+    QL_NW_CELL_ACCESS_ALL_CALLS      = 4,             /**<  Cell access is allowed for all call types. */
+}QL_NW_CELL_ACCESS_STATE_TYPE_E;
+
+/** wea config items */
+typedef enum
+{
+    QL_NW_WEA_CONFIG_PRESIDENTIAL_ALERT     = (1 << 0),
+    QL_NW_WEA_CONFIG_EXTREME_ALERT          = (1 << 1),
+    QL_NW_WEA_CONFIG_SEVERE_ALERT           = (1 << 2),
+    QL_NW_WEA_CONFIG_AMBER_ALERT            = (1 << 3),
+    QL_NW_WEA_CONFIG_PUBLIC_SAFETY_ALERT    = (1 << 4),
+    QL_NW_WEA_CONFIG_STATE_LOCAL_TEST_ALERT = (1 << 5),
+    QL_NW_WEA_CONFIG_RMT_ALERT              = (1 << 6),
+    QL_NW_WEA_CONFIG_EXERCISE_ALERT         = (1 << 7),
+    QL_NW_WEA_CONFIG_CMSP_DEFINED_ALERT     = (1 << 8),  
+    QL_NW_WEA_CONFIG_SPANISH_ALERT          = (1 << 9), 
+} QL_NW_WEA_CONFIG_E;
+
+/** bind subscription */
+typedef enum QL_NW_BIND_SUB_TYPE_ENUM
+{
+  QL_NW_BIND_SUB_PRIMARY = 0, 
+  QL_NW_BIND_SUB_SECONDARY = 1, 
+}QL_NW_BIND_SUB_TYPE_E;
+
+typedef struct 
+{
+    uint64_t   preferred_nw_mode;               /**<   Preferred network mode for connections; a bitmask of QL_NW_MODE_xxxx.*/
+    QL_NW_ROAM_STATE_TYPE_E preferred_roaming;  /**<   Roaming preference. 0 -- None, or roaming indicator off, 1 -- roaming indicator on*/
+}ql_nw_pref_nwmode_roaming_info_t;
+
+typedef struct 
+{
+    char     nitz_time[QL_NW_NITZ_BUF_LEN + 1]; /**< format: YY/MM/DD,HH:MM:SS'+/-'TZ,daylight, Here TZ multiplied by 4*/
+    uint64_t abs_time;                          /**< 0 means invalid */
+    int8_t   leap_sec;                          /**< 0 means invalid */
+}ql_nw_nitz_time_info_t;
+
+typedef struct 
+{
+    char long_eons[512 + 1];    /**<   Long EONS.*/
+    char short_eons[512 + 1];   /**<   Short EONS.*/
+    char mcc[3 + 1];            /**<   Mobile country code.*/
+    char mnc[3 + 1];            /**<   Mobile network code.*/
+}ql_nw_mobile_operator_name_info_t;
+
+typedef struct 
+{
+    ql_nw_mobile_operator_name_info_t operator_name;   /**<   Operator name.*/
+    QL_NW_NETWORK_STATUS_TYPE_E       network_status;  /**<   Network status.*/
+    QL_NW_RADIO_TECH_TYPE_E           rat;             /**<   Radio technology.*/
+}ql_nw_scan_entry_info_t;
+
+typedef struct 
+{
+    uint32_t                entry_len;                      /**< Must be set to the number of elements in entry. */
+    ql_nw_scan_entry_info_t entry[QL_NW_SCAN_MAX_LIST_NUM]; /**<   Scan entry.*/
+}ql_nw_scan_result_list_info_t;
+
+typedef struct
+{
+    QL_NW_TECH_DOMAIN_TYPE_E tech_domain;        /**<   Technology domain: 0 -- None, 1 -- 3GPP, 2 -- 3GPP2.*/
+    QL_NW_RADIO_TECH_TYPE_E  radio_tech;         /**<   Radio technology; see #QL_NW_RADIO_TECH_TYPE_E.*/
+    QL_NW_ROAM_STATE_TYPE_E  roaming;            /**<   0 -- Off, 1 -- Roaming (3GPP2 has extended values).*/
+    QL_NW_DENY_REASON_TYPE_E deny_reason;        /**<   Set when registration state is #QL_NW_DENY_REASON_TYPE_E, please refer to 3GPP 24301 SPEC ANNEX A chapter*/
+    QL_NW_SERVICE_TYPE_E     reg_state;          /**<   Registration state.*/
+    char                     mcc[3+1];           /**<   Mobile country code.*/
+    char                     mnc[3+1];           /**<   Mobile network code.*/
+    uint8_t                  forbidden;          /**<   Forbidden: 0 -- No, 1 -- Yes.*/
+    uint32_t                 cid;                /**<   Cell ID for the registered 3GPP system.*/
+    uint16_t                 lac;                /**<   Locatin area code for the registered 3GPP system.*/
+    uint16_t                 psc;                /**<   Primary scrambling code (WCDMA only); 0 -- None.*/
+    uint16_t                 tac;                /**<   Tracking area code information for LTE.*/
+    uint8_t                  inPRL;              /**<   0 -- Not in PRL, 1 -- In PRL.*/
+    uint8_t                  css;                /**<   Concurrent services supported: 0 -- No, 1 -- Yes.*/
+    uint16_t                 sid;                /**<   CDMA system ID.*/
+    uint16_t                 nid;                /**<   CDMA network ID.*/
+    uint16_t                 bsid;               /**<   Base station ID. @newpagetable */
+
+    uint16_t                 nr5g_svc_opt;       /**<   NR5G service option or type, defined by QL_NW_NR5G_SO_XXX */
+    uint16_t                 nr5g_pci;           /**<   NR5G physical Cell ID */
+    uint64_t                 nr5g_cid;           /**<   NR5G SA Cell ID */
+    uint32_t                 nr5g_tac;           /**<   NR5G tac info */
+
+    uint8_t                  endc_available;     /**<   EUTRA-NR Dual Connectivity */
+
+}ql_nw_reg_status_info_t;
+
+typedef struct 
+{
+    QL_NW_SELECTION_TYPE_E  nw_selection_type;    /**<   Network selection type. */
+    char                    mcc[3 + 1];           /**<   Mobile country code for a manual network selection.*/
+    char                    mnc[3 + 1];           /**<   Mobile network code for a manual network selection.*/
+    QL_NW_RADIO_TECH_TYPE_E rat;                  /**<   Radio technology.*/
+}ql_nw_pref_net_t;
+
+typedef struct 
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates received signal strength. A signed value; -125 or lower indicates no signal.*/
+}ql_nw_gsm_signal_info_t;
+
+typedef struct 
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Ec. A signed value; -125 or lower indicates no signal.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+}ql_nw_wcdma_signal_info_t;
+
+typedef struct 
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Ec.    a signed value; -125 or lower indicates no signal.*/
+    int8_t      rscp;       /**<   RSCP in dBm.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+    int8_t      sinr;       /**<   Measured SINR in dB. @newpagetable */
+}ql_nw_tdscdma_signal_info_t;
+
+typedef struct 
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Ec. A signed value; -125 or lower indicates no signal.*/
+    int8_t      rsrq;       /**<   RSRQ value in dB (signed integer value), as measured by L1. Range: -3 to -20 (-3 equals -3 dB, -20 equals -20 dB).*/
+    int16_t     rsrp;       /**<   Current RSRP in dBm, as measured by L1. Range: -44 to -140 (-44 equals -44 dBm, -140 equals -140 dBm).*/
+    int16_t     snr;        /**<   SNR level as a scaled integer in units of 0.1 dB; e.g., -16 dB has a value of -160 and 24.6 dB has a value of 246.*/
+}ql_nw_lte_signal_info_t;
+
+typedef struct 
+{
+    int16_t     rsrq;       /**<   Current RSRQ in dBm, as measured by L1.*/
+    int16_t     rsrp;       /**<   Current RSRP in dBm, as measured by L1. Range: -44 to -140 (-44 equals -44 dBm, -140 equals -140 dBm).*/
+    int16_t     snr;        /**<   SNR level as a scaled integer in units of 0.1 dB; e.g., -16 dB has a value of -160 and 24.6 dB has a value of 246.*/
+}ql_nw_nr5g_signal_info_t;
+
+typedef struct 
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Power (AGC) + Ec/Io. A signed value; -125 or lower indicates no signal.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+}ql_nw_cdma_signal_info_t;
+
+typedef struct 
+{
+    int8_t      rssi;       /**<   rssi in dbm. indicates forward link pilot power (agc) + ec/io. a signed value; -125 or lower indicates no signal.*/
+    int16_t     ecio;       /**<   ec/io value representing negative 0.5 db increments, e.g., 2 equals -1 dbm.*/
+    int8_t      sinr;       /**<   sinr level.*/
+    int32_t     io;         /**<   received io in dbm. */
+}ql_nw_hdr_signal_info_t;
+
+typedef struct 
+{
+    uint8_t                     has_gsm;     /**<   Must be set to TRUE if gsm_sig_info is being passed. */
+    ql_nw_gsm_signal_info_t     gsm;         /**<   GSM signal information. */
+    uint8_t                     has_wcdma;   /**<   Must be set to TRUE if wcdma_sig_info is being passed. */
+    ql_nw_wcdma_signal_info_t   wcdma;       /**<   WCDMA signal information. */
+    uint8_t                     has_tdscdma; /**<   Must be set to TRUE if tdscdma_sig_info is being passed. */
+    ql_nw_tdscdma_signal_info_t tdscdma;     /**<   TDSCDMA signal information. */
+    uint8_t                     has_lte;     /**<   Must be set to TRUE if lte_sig_info is being passed. */
+    ql_nw_lte_signal_info_t     lte;         /**<   LTE signal information. */
+    uint8_t                     has_nr5g;    /**<   Must be set to TRUE if nr5g_sig_info is being passed. */
+    ql_nw_nr5g_signal_info_t    nr5g;        /**<   NR5G signal information. */
+    uint8_t                     has_cdma;    /**<   Must be set to TRUE if cdma_sig_info is being passed. */
+    ql_nw_cdma_signal_info_t    cdma;        /**<   CDMA signal information. */
+    uint8_t                     has_hdr;     /**<   Must be set to TRUE if hdr_sig_info is being passed. */
+    ql_nw_hdr_signal_info_t     hdr;         /**<   HDR signal information. */
+}ql_nw_signal_strength_info_t;
+
+typedef struct
+{
+    uint32_t    cid;        /**<   Cell ID, (0 indicates information is not represent).*/
+    char        plmn[3];    /**<   MCC/MNC inforamtion code.(This field should be ignored when cid is not present). */
+    uint16_t    lac;        /**<   Location area code.(This field should be ignord when cid is not present). */
+    uint16_t    arfcn;      /**<   Absolute RF channel number. */
+    uint8_t     bsic;       /**<   Base station identity code. (0 indicates information is not present). */
+    int16_t     rssi;       /**<   Received signal strength indicator in dBm.*/
+}ql_nw_gsm_info_t;;
+
+typedef struct
+{
+    uint32_t cid;           /**<   Cell ID (0 indicates information is not present). */
+    uint32_t lcid;          /**<   UTRAN Cell ID (0 indicates information is not present). */
+    char plmn[3];           /**<   MCC/MNC information code.(This field should be ignored when cid is not present). */
+    uint16_t lac;           /**<   Location area code. (This field should be ignored when cid is not present). */
+    uint16_t uarfcn;        /**<   UTRA absolute RF channel number. */
+    uint16_t psc;           /**<   Primary scrambling code. */
+    int16_t  rssi;          /**<   Received signal strength indicator in dBm.*/
+}ql_nw_umts_info_t;
+
+typedef struct
+{
+    uint32_t cid;           /**<   Global cell ID in the system information block (0 indicates information is not present). */
+    char plmn[3];           /**<   MCC/MNC information code.(This filed should be ignored when cid is not present). */
+    uint16_t tac;           /**<   Tracing area code (This field should be ignored when cid is not present). */
+    uint16_t pci;           /**<   Physical cell ID. Range: 0 to 503. */
+    uint32_t earfcn;        /**<   E-UTRA absolute radio frequency channel number of the cell. RANGE: 0 TO 65535. */
+    int16_t  rssi;          /**<   Received signal strength indicator in dBm.*/
+}ql_nw_lte_info_t;
+
+typedef struct {
+
+  uint64_t cid;             /**<   Global cell ID in the system information block (0 indicates information is not present). */
+  char plmn[3];             /**<   MCC/MNC information coded(This field should be ignored when cid is not present.) */
+  uint32_t tac;             /**<   Tracking area code (This field should be ignored when cid is not present). */
+  uint16_t pci;             /**<   Physical cell ID. Range: 0 to 503.*/
+  uint32_t arfcn;           /**<   UTRA absolute radio frequency channel number of the cell. Range: 0 to 65535.*/
+  int16_t rsrq;             /**<   Current RSRQ in units of 0.1 dB, as measured by L1.*/
+  int16_t rsrp;             /**<   Current RSRP in units of 0.1 dB, as measured by L1.*/
+  int16_t snr;              /**<   Current SNR  in dBm, as measured by L1.*/
+}ql_nw_nr5g_info_t;
+
+typedef struct 
+{
+   uint16_t sid;            /**<   System ID. */
+   uint16_t nid;            /**<   Network ID. */
+   uint16_t bid;            /**<   Base station ID. */
+   uint16_t refpn;          /**<   Reference PN. */
+   uint32_t base_lat;       /**<   Latitude of the current base station in units of 0.25 sec. */
+   uint32_t base_long;      /**<   Longitude of the current base station in units of 0.25 sec. */
+   int16_t  rssi;           /**<   Received signal strength indicator in dBm. */
+}ql_nw_cdma_info_t;
+
+typedef struct 
+{
+    QL_NW_RADIO_TECH_TYPE_E serving_rat;
+    uint8_t                 gsm_info_valid;                         /**<  Must be set to true if gsm_info is being passed */
+    uint8_t                 gsm_info_len;                           /**<  Must be set to the number of elements in entry*/
+    ql_nw_gsm_info_t        gsm_info[QL_NW_MAX_GSM_CELL_INFO_NUM];  /**<  GSM cell information (Serving and neighbor. */  
+    uint8_t                 umts_info_valid;                        /**<  Must be set to true if umts_info is being passed */
+    uint8_t                 umts_info_len;                          /**<  Must be set to the number of elements in entry*/
+    ql_nw_umts_info_t       umts_info[QL_NW_MAX_UMTS_CELL_INFO_NUM];/**<  UMTS cell information (Serving and neighbor). */
+    uint8_t                 lte_info_valid;                         /**<  Must be set to true if lte_info is being passed */
+    uint8_t                 lte_info_len;                           /**<  Must be set to the number of elements in entry*/
+    ql_nw_lte_info_t        lte_info[QL_NW_MAX_LTE_CELL_INFO_NUM];  /**<  LTE cell information (Serving and neighbor). */
+    uint8_t                 nr5g_info_valid;                        /**<  Must be set to true if nr5g_info is being passed */
+    ql_nw_nr5g_info_t       nr5g_info;                              /**<  NR5G cell information (Serving). */
+    uint8_t                 cdma_info_valid;                        /**<  Must be set to true if cdma_info is being passed */
+    ql_nw_cdma_info_t       cdma_info;                              /**<  CDMA cell information (Serving). */  
+}ql_nw_cell_info_t;
+
+typedef struct 
+{
+    uint8_t Presidential_alert;         /**<  Enable Presidential_alert: 0 -- Disable(can't Disable); 1 -- Enable */
+    uint8_t Extreme_alert;              /**<  Enable or disable Extreme_alert: 0 -- Disable; 1 -- Enable */
+    uint8_t Severe_alert;               /**<  Enable or disable Severe_alert: 0 -- Disable; 1 -- Enable */
+    uint8_t Amber_alert;                /**<  Enable or disable Amber_alert: 0 -- Disable; 1 -- Enable */
+    uint8_t PublicSafety_alert;         /**<  Enable or disable PublicSafety_alert: 0 -- Disable; 1 -- Enable */
+    uint8_t StateLocalTest_alert;       /**<  Enable or disable StateLocalTest_alert: 0 -- Disable; 1 -- Enable */
+    uint8_t RMT_alert;                  /**<  Enable or disable RMT_alert: 0 -- Disable; 1 -- Enable */
+    uint8_t Exercise_alert;             /**<  Enable or disable Exercise_alert: 0 -- Disable; 1 -- Enable */
+    uint8_t CMSPDefined_alert;          /**<  Enable or disable CMSPDefined_alert: 0 -- Disable; 1 -- Enable */
+    uint8_t Spanish_alert;              /**<  Enable or disable Spanish_alert: 0 -- Disable; 1 -- Enable */
+}ql_nw_wea_config_t;
+
+typedef struct 
+{
+    uint8_t wea_alert_info_valid; 
+    char wea_alert_info[QL_NW_MAX_WEA_ALERT_LENGTH_V01];
+}ql_nw_wea_alert_info_t;
+
+typedef struct 
+{
+    uint8_t etws_primary_info_valid;
+    char etws_primary_info[QL_NW_MAX_ETWS_ALERT_LENGTH_V01];
+    uint8_t etws_secondary_info_valid;
+    char etws_secondary_info[QL_NW_MAX_ETWS_ALERT_LENGTH_V01];
+}ql_nw_etws_alert_info_t;
+
+typedef void (*ql_nw_voice_reg_ind_cb)(ql_nw_reg_status_info_t *p_info);
+
+typedef void (*ql_nw_data_reg_ind_cb)(ql_nw_reg_status_info_t *p_info);
+
+typedef void (*ql_nw_signal_strength_ind_cb)(ql_nw_signal_strength_info_t *p_info, QL_NW_SIGNAL_STRENGTH_LEVEL_E level);
+
+typedef void (*ql_nw_cell_access_status_ind_cb)(QL_NW_CELL_ACCESS_STATE_TYPE_E status);
+
+typedef void (*ql_nw_nitz_time_update_ind_cb)(ql_nw_nitz_time_info_t *p_info);
+
+typedef void (*ql_nw_network_scan_async_cb)(int async_index, ql_nw_scan_result_list_info_t *p_info);
+
+typedef void (*ql_nw_wea_reg_ind_cb)(ql_nw_wea_alert_info_t *p_info);
+
+typedef void (*ql_nw_etws_reg_ind_cb)(ql_nw_etws_alert_info_t *p_info);
+
+typedef void (*ql_nw_service_error_cb_f)(int error);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize NW service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the NW service was successfully intialized.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes NW service.
+  @return Whether the NW service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief scan network status.
+  @param[out] async_index The index of request msg
+  @param[in] async_cb The callback function of request msg
+  @return Whether to successfully trigger the network scan operation
+  @retval QL_ERR_OK  successful
+  @retval QL_ERR_NOT_INIT  uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY  service is not ready
+  @retval QL_ERR_INVALID_ARG  Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_network_scan(int *async_index, ql_nw_network_scan_async_cb async_cb);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set power mode.
+  @param[in] lower_mode, defined by QL_NW_LOWER_POWER_MASK_XXX
+  @return Whether to successfully set the power mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_power_mode(uint8_t lower_mode);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set perferred NW mode and roaming indicator.
+  @param[in] p_info Pointer that point to ql_nw_pref_nwmode_roaming_info_t
+  @return Whether to successfully set nwmode and roaming
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_pref_nwmode_roaming(ql_nw_pref_nwmode_roaming_info_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get perferred NW mode and roaming indicator.
+  @param[out] p_info Pointer that point to ql_nw_pref_nwmode_roaming_info_t 
+  @return Whether to successfully get nwmode and roaming
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_pref_nwmode_roaming(ql_nw_pref_nwmode_roaming_info_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get mobile operator name.
+  @param[out] p_info Pointer that point to ql_nw_mobile_operator_name_info_t
+  @return Whether to successfully get the mobile operator name
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_mobile_operator_name(ql_nw_mobile_operator_name_info_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get cell information.
+  @param[out] p_info Pointer that point to ql_nw_cell_info_t
+  @return Whether to successfully get the cell information
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_cell_info(ql_nw_cell_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get voice registration status.
+  @param[out] p_info Pointer that point to ql_nw_reg_status_info_t
+  @return Whether to successfully get the voice registration status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_voice_reg_status(ql_nw_reg_status_info_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get data registration status.
+  @param[out] p_info Pointer that point to ql_nw_reg_status_info_t
+  @return Whether to successfully get the data registration status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_data_reg_status(ql_nw_reg_status_info_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get current signal strength.
+  @param[out] p_info Pointer that point to ql_nw_signal_strength_info_t
+  @param[out] p_level: signal strength level
+  @return Whether to successfully get the signal strength
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_signal_strength(ql_nw_signal_strength_info_t *p_info, QL_NW_SIGNAL_STRENGTH_LEVEL_E* p_level);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get current cell acccess status.
+  @param[out] p_info Pointer that point to QL_NW_CELL_ACCESS_STATE_TYPE_E
+  @return Whether to successfully get the cell access status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_cell_access_status(QL_NW_CELL_ACCESS_STATE_TYPE_E *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get network time.
+  @param[out] p_info Pointer that point to ql_nw_nitz_time_info_t 
+  @return Whether to successfully get the network time
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_nitz_time_info(ql_nw_nitz_time_info_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register voice registration event.
+  @param[in] cb_func Voice registration indication callback function
+  @return Whether the voice registration event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+ */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_voice_reg_ind_cb(ql_nw_voice_reg_ind_cb cb_func);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register data registration event.
+  @param[in] cb_func Data registration indication callback function
+  @return Whether the data registration event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_data_reg_ind_cb(ql_nw_data_reg_ind_cb cb_func);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register signal strength event.
+  @param[in] cb_func Signal strength indication callback function
+  @return Whether the signal strength event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_signal_strength_ind_cb(ql_nw_signal_strength_ind_cb cb_func);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register cell access status event.
+  @param[in] cb_func Cell access status indication callback function
+  @return Whether the cell access status event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_cell_access_status_ind_cb(ql_nw_cell_access_status_ind_cb cb_func);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register network time event.
+  @param[in] cb_func nitz time update indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_nitz_time_update_ind_cb(ql_nw_nitz_time_update_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register wea alert event.
+  @param[in] cb_func wea alert indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_wea_alert_ind_cb(ql_nw_wea_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register etws alert event.
+  @param[in] cb_func etws alert indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_etws_alert_ind_cb(ql_nw_etws_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set wea alert config.
+  @param[in] item Items to set.
+  @param[in] p_info Pointer that point to ql_nw_wea_config_t.
+  @return Whether to successfully set the wea config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_wea_config(int item, ql_nw_wea_config_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets wea config.
+  @param[out] p_config wea config.
+  @return Whether the wea config was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_wea_config(ql_nw_wea_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set etws alert config.
+  @param[in] etws config.
+  @return Whether to successfully set the etws config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_etws_config(uint8_t enable_etws);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get etws alert config.
+  @param[out] p_enable_etws Pointer.
+  @return Whether to successfully set the etws config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_etws_config(uint8_t* p_enable_etws);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  bind subscription 
+  @param[in] sub_type subscription type 
+  @return Whether to successfully bind subscription.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_bind_subscription(QL_NW_BIND_SUB_TYPE_E sub_type);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get high capability subscription.
+  @param[out] p_high_cap pointer that point to QL_NW_BIND_SUB_TYPE_E
+  @return Whether the high capability subscription was successfully obtained.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_high_cap_sub(QL_NW_BIND_SUB_TYPE_E *p_high_cap);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set the SIM card index that can uniquely register to the 5G network. 
+  the main difference between high and non-high capability subscription is that high capability 
+  subscription can register to 5G network while non-high capability subscription can only 
+  register to LTE or GSM.
+  @param[in] high_cap high capability subscription 
+  @return Whether to successfully set the high capability subscription.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_high_cap_sub(QL_NW_BIND_SUB_TYPE_E high_cap);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Disable NR5G, NR5G_SA and NR5G_NSA can be disabled individually or together.
+  @param[in] opt_mask Option mask value. Value:
+  0                 - Do not disable NR5G
+  QL_NW_NR5G_SO_SA  - Disable NR5G SA
+  QL_NW_NR5G_SO_NSA - Disable NR5G NSA 
+  @return Whether to successfully disable NR5G mode.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_disable_nr5g(uint16_t opt_mask);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_service_error_cb(ql_nw_service_error_cb_f cb);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/mbtk/include/ql_v2/ql_sim.h b/mbtk/include/ql_v2/ql_sim.h
new file mode 100755
index 0000000..bb9f471
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_sim.h
@@ -0,0 +1,642 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_sim.h 
+  @brief SIM service API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_SIM_H__
+#define __QL_SIM_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#define QL_SIM_IMSI_LENGTH      16      /**<  Maximum length of IMSI data. */
+#define QL_SIM_ICCID_LENGTH     20      /**<  Maximum length of ICCID data. */
+#define QL_SIM_PUK_LENGTH       8       /**<  Maximum length of PUK data. */
+#define QL_SIM_NUM_OPERATOR_MAX 24      /**<  Maximum number of operators */
+#define QL_SIM_PATH_MAX         20      /**<  Maximum length of a full file path in ASCII format. */
+#define QL_SIM_DATA_MAX         4096    /**<  Maximum size of data to be read/written. */
+#define QL_SIM_PIN_MAX          8       /**<  Maximum length of PIN data. */
+#define QL_SIM_MAX_NUM_CARDS    2       /**<  Maximum number of cards. */
+#define QL_SIM_PHONE_NUMBER_MAX 82      /**<  Maximum phone number length. */
+#define QL_SIM_MCC_LENGHT       3       /**<  Length of the MCC. */
+#define QL_SIM_MNC_MAX          3       /**<  Maximum length of the MNC. */
+
+#define QL_SIM_PHONE_BOOK_NAME_MAX      15  /**<  Maximum length of phone book user name. */
+#define QL_SIM_PHONE_BOOK_NUMBER_MAX    25  /**<  Maximum length of phone book number. */
+
+#define QL_SIM_APDU_DATA_MAX    1024  /**<  Maximum number of APDU data. */
+
+#define QL_SIM_PB_DEFAULT_PATH   "3F007F106F3A"   /**< Default phone book path. */
+
+/** Ligcial slot */
+/**> Currently only one active slot is supported, so slot should be always QL_SIM_SLOT_1.*/
+typedef enum 
+{
+    QL_SIM_SLOT_INVALID = 0x000, /**< Invalid slot.  */   
+    QL_SIM_SLOT_1       = 0xB01, /**< Identify card in slot 1.  */
+    QL_SIM_SLOT_2       = 0xB02, /**< Identify card in slot 2.  */
+} QL_SIM_SLOT_E;
+
+/** Physical slot */
+typedef enum 
+{
+    QL_SIM_PHY_SLOT_INVALID = 0x000, /**< Invalid slot.  */   
+    QL_SIM_PHY_SLOT_1       = 0xB01, /**< Identify card in slot 1.  */
+    QL_SIM_PHY_SLOT_2       = 0xB02, /**< Identify card in slot 2.  */
+} QL_SIM_PHY_SLOT_E;
+
+
+typedef enum 
+{
+    QL_SIM_PIN_1 = 0xB01, /**< Level 1 user verification.  */
+    QL_SIM_PIN_2 = 0xB02, /**< Level 2 user verification.  */
+} QL_SIM_PIN_E;
+
+
+/** Application Type */
+typedef enum
+{
+    QL_SIM_APP_TYPE_UNKNOWN = 0xB00, /**<  Unknown application type  */
+    QL_SIM_APP_TYPE_3GPP    = 0xB01, /**< Identify the SIM/USIM application on the card.  */
+    QL_SIM_APP_TYPE_3GPP2   = 0xB02, /**< Identify the RUIM/CSIM application on the card.  */
+    QL_SIM_APP_TYPE_ISIM    = 0xB03, /**< Identify the ISIM application on the card.  */
+} QL_SIM_APP_TYPE_E;
+
+typedef struct 
+{
+    char mcc[QL_SIM_MCC_LENGHT];    /**< MCC value in ASCII characters.*/
+    uint8_t mnc_len;                /**< The number of elements in the MNC, 2 or 3. */
+    char mnc[QL_SIM_MNC_MAX];       /**< MNC value in ASCII characters.*/
+} ql_sim_operator_t;
+
+typedef struct 
+{
+    int len;    /**< Length of actual operators */
+    ql_sim_operator_t operators[QL_SIM_NUM_OPERATOR_MAX];
+} ql_sim_operator_list_t;
+
+typedef enum {
+    /** Card state unknown. */
+    QL_SIM_CARD_STATE_UNKNOWN                       = 0xB01,
+    /** Card is absent. */
+    QL_SIM_CARD_STATE_ABSENT                        = 0xB02,  
+    /** Card is present. */
+    QL_SIM_CARD_STATE_PRESENT                       = 0xB03,
+    /** Unknown error state. */
+    QL_SIM_CARD_STATE_ERROR_UNKNOWN                 = 0xB04,
+    /** Power down. */
+    QL_SIM_CARD_STATE_ERROR_POWER_DOWN              = 0xB05,
+    /** Poll error. */
+    QL_SIM_CARD_STATE_ERROR_POLL_ERROR              = 0xB06,  
+    /**  Failed to receive an answer to reset.  */
+    QL_SIM_CARD_STATE_ERROR_NO_ATR_RECEIVED         = 0xB07, 
+    /** Voltage mismatch. */
+    QL_SIM_CARD_STATE_ERROR_VOLT_MISMATCH           = 0xB08, 
+    /** Parity error. */
+    QL_SIM_CARD_STATE_ERROR_PARITY_ERROR            = 0xB09,    
+    /** Card returned technical problems. */
+    QL_SIM_CARD_STATE_ERROR_SIM_TECHNICAL_PROBLEMS  = 0xB0A,  
+} QL_SIM_CARD_STATE_E;  /**< Card state. */
+
+typedef enum {
+    QL_SIM_SUBSCRIPTION_NONE    = 0xB00, /**<  Nonprovisioning.  */
+    QL_SIM_SUBSCRIPTION_PRI     = 0xB01, /**<  Primary provisioning subscription.  */
+    QL_SIM_SUBSCRIPTION_SEC     = 0xB02, /**<  Secondary provisioning subscription.  */
+} QL_SIM_SUBSCRIPTION_E;
+
+typedef enum
+{
+    QL_SIM_CARD_TYPE_UNKNOWN    = 0xB00, /**<  Unidentified card type.  */
+    QL_SIM_CARD_TYPE_ICC        = 0xB01, /**<  Card of SIM or RUIM type.  */
+    QL_SIM_CARD_TYPE_UICC       = 0xB02, /**<  Card of USIM or CSIM type.  */
+} QL_SIM_CARD_TYPE_E;
+
+typedef enum {
+    QL_SIM_APP_STATE_UNKNOWN                    = 0xB00, /**<  Application state unknown. */
+    QL_SIM_APP_STATE_DETECTED                   = 0xB01, /**<  Detected state.  */
+    QL_SIM_APP_STATE_PIN1_REQ                   = 0xB02, /**<  PIN1 required.  */
+    QL_SIM_APP_STATE_PUK1_REQ                   = 0xB03, /**<  PUK1 required.  */
+    QL_SIM_APP_STATE_INITALIZATING              = 0xB04, /**<  Initializing.  */
+    QL_SIM_APP_STATE_PERSO_CK_REQ               = 0xB05, /**<  Personalization control key required.  */
+    QL_SIM_APP_STATE_PERSO_PUK_REQ              = 0xB06, /**<  Personalization unblock key required.  */
+    QL_SIM_APP_STATE_PERSO_PERMANENTLY_BLOCKED  = 0xB07, /**<  Personalization is permanently blocked.  */
+    QL_SIM_APP_STATE_PIN1_PERM_BLOCKED          = 0xB08, /**<  PIN1 is permanently blocked.  */
+    QL_SIM_APP_STATE_ILLEGAL                    = 0xB09, /**<  Illegal application state.  */
+    QL_SIM_APP_STATE_READY                      = 0xB0A, /**<  Application ready state. */
+} QL_SIM_APP_STATE_E;
+
+typedef enum {
+    /**  Unknown personalization feature.  */
+    QL_SIM_PERSO_FEATURE_UNKNOWN                = 0xB00,
+    /**  Featurization based on 3GPP MCC and MNC.  */
+    QL_SIM_PERSO_FEATURE_3GPP_NETWORK           = 0xB01, 
+    /**  Featurization based on 3GPP MCC, MNC, and IMSI digits 6 and 7.  */
+    QL_SIM_PERSO_FEATURE_3GPP_NETWORK_SUBSET    = 0xB02, 
+    /**  Featurization based on 3GPP MCC, MNC, and GID1.  */
+    QL_SIM_PERSO_FEATURE_3GPP_SERVICE_PROVIDER  = 0xB03,
+    /**  Featurization based on 3GPP MCC, MNC, GID1, and GID2.  */
+    QL_SIM_PERSO_FEATURE_3GPP_CORPORATE         = 0xB04, 
+    /**  Featurization based on the 3GPP IMSI.  */
+    QL_SIM_PERSO_FEATURE_3GPP_SIM               = 0xB05, 
+    /**  Featurization based on 3GPP2 MCC and MNC.  */
+    QL_SIM_PERSO_FEATURE_3GPP2_NETWORK_TYPE_1   = 0xB06, 
+    /**  Featurization based on 3GPP2 IRM code.  */
+    QL_SIM_PERSO_FEATURE_3GPP2_NETWORK_TYPE_2   = 0xB07, 
+    /**  Featurization based on 3GPP2 IMSI_M.  */
+    QL_SIM_PERSO_FEATURE_3GPP2_RUIM             = 0xB08, 
+} QL_SIM_PERSO_FEATURE_E;
+
+typedef enum {
+    /** Unknown PIN state. */
+    QL_SIM_PIN_STATE_UNKNOWN                = 0xB01, 
+    /**  PIN required, but has not been verified.  */
+    QL_SIM_PIN_STATE_ENABLED_NOT_VERIFIED   = 0xB02, 
+    /**  PIN required and has been verified.  */
+    QL_SIM_PIN_STATE_ENABLED_VERIFIED       = 0xB03, 
+    /**  PIN not required.  */
+    QL_SIM_PIN_STATE_DISABLED               = 0xB04, 
+    /**  PIN verification has failed too many times and is blocked. Recoverable through PUK verification.  */
+    QL_SIM_PIN_STATE_BLOCKED                = 0xB05, 
+    /**  PUK verification has failed too many times and is not recoverable.  */
+    QL_SIM_PIN_STATE_PERMANENTLY_BLOCKED    = 0xB06, 
+ } QL_SIM_PIN_STATE_E;
+
+typedef struct {
+    /**   Type of subscription (i.e., primary, secondary, etc.). */
+    QL_SIM_SUBSCRIPTION_E subscription;				/**nonsupport*/
+    /**   Current state of the application. */
+    QL_SIM_APP_STATE_E app_state;
+    /**   Current personalization state and feature enabled. */
+    QL_SIM_PERSO_FEATURE_E perso_feature;			/**nonsupport*/
+    /**   Number of personalization retries. */
+    uint8_t perso_retries;				/**nonsupport*/
+    /**   Number of personalization unblock retries. */
+    uint8_t perso_unblock_retries;			/**nonsupport*/
+    /**   Current PIN 1 state. */
+    QL_SIM_PIN_STATE_E pin1_state;			/**nonsupport*/
+    /**   Number of PIN 1 retries. */
+    uint8_t pin1_num_retries;
+    /**   Number of PUK 1 retries. */
+    uint8_t puk1_num_retries;
+    /**   Current PIN 2 state. */
+    QL_SIM_PIN_STATE_E pin2_state;			/**nonsupport*/
+    /**   Number of PIN 2 retries. */
+    uint8_t pin2_num_retries; 
+    /**   Number of PUK 2 retries. */
+    uint8_t puk2_num_retries;
+}ql_sim_app_info_t;  /* Type */
+
+typedef struct
+{
+    QL_SIM_CARD_STATE_E state;
+    QL_SIM_CARD_TYPE_E type;
+    ql_sim_app_info_t app_3gpp;     /**<   Stores 3GPP application information. */
+    ql_sim_app_info_t app_3gpp2;    /**<   Stores 3GPP2 application information. */
+    ql_sim_app_info_t app_isim;     /**<   Stores ISIM application information. */
+} ql_sim_card_info_t;
+
+typedef struct {
+    uint32_t path_len;          /**< Must be set to the number of elements in the path. */
+    char path[QL_SIM_PATH_MAX]; /**< File path in ASCII characters. */
+    /** Offset is only required for write transparent file access where data length is indicated.*/
+    uint16_t offset; 
+    /** Index of records involved in file access. A record index of 0 indicates transparent file access.*/
+    uint8_t record_idx;
+
+    /* == filled by caller when writing file == */
+    uint32_t data_len;  /**< When reading file, it's the length of file data been read.
+                             When writing file, it's the length of file data to be written. */
+    uint8_t data[QL_SIM_DATA_MAX];
+} ql_sim_file_t;  /* Type */
+
+typedef enum {
+    QL_SIM_FILE_TYPE_UNKNOWN        = 0xB00, /**<  Unknown file type  */
+    QL_SIM_FILE_TYPE_TRANSPARENT    = 0xB01, /**< File structure consisting of a sequence of bytes.  */
+    QL_SIM_FILE_TYPE_CYCLIC         = 0xB02, /**< File structure consisting of a sequence of records,
+                                                  each containing the same fixed size in 
+                                                  chronological order.Once all the records have been
+                                                  used, the oldest data is overwritten.  */
+    QL_SIM_FILE_TYPE_LINEAR_FIXED   = 0xB03, /**< File structure consisting of a sequence of records, 
+                                                  each containing the same fixed size.  */
+} QL_SIM_FILE_TYPE_E;
+
+
+typedef struct {
+    /* == filled by caller == */
+    uint32_t path_len;          /**< Must be set to the number of elements in the path. */
+    char path[QL_SIM_PATH_MAX]; /**< File path in ASCII characters. */
+
+    /* == filled by callee == */
+    QL_SIM_FILE_TYPE_E file_type;   /**<   File type */
+    uint16_t file_size;             /**<   Size of transparent files.*/
+    uint16_t record_size;           /**<   Size of each cyclic or linear fixed file record.*/
+    uint16_t record_count;          /**<   Number of cyclic or linear fixed file records.*/
+} ql_sim_file_info_t;  /* Type */
+
+typedef struct 
+{
+    /** User name. Null-terminated */
+    char name[QL_SIM_PHONE_BOOK_NAME_MAX];   
+    /** Phone number, a '+' can also be preappended to the number. Null-terminated. */
+    char number[QL_SIM_PHONE_BOOK_NUMBER_MAX]; 
+} ql_sim_phone_book_record_t;
+
+typedef struct
+{
+    uint32_t req_apdu_len;                      /**< Request APDU data length. */
+    uint8_t req_apdu[QL_SIM_APDU_DATA_MAX];     /**< Request APDU data. */
+
+    uint32_t resp_apdu_len;                     /**< Response APDU data length. */
+    uint8_t resp_apdu[QL_SIM_APDU_DATA_MAX];    /**< Response APDU data. */
+} ql_sim_apdu_t;
+
+typedef void (*ql_sim_card_status_cb_f)(QL_SIM_SLOT_E slot, ql_sim_card_info_t *p_info);
+
+typedef struct 
+{
+    int active_slots_len;
+    QL_SIM_PHY_SLOT_E active_slots[QL_SIM_MAX_NUM_CARDS];
+} ql_sim_active_slots_t;
+
+typedef void (*ql_sim_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Initializes SIM service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the SIM service was intialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Deinitializes SIM service.
+  @return Whether the SIM service was deintialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets the IMSI (for 3GPP) or IMSI_M (for 3GPP2) from the SIM in ASCII form.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [out] imsi Buffer to fill IMSI data.
+  @param [in] imsi_len Buffer length.
+  @return Whether the IMSI was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_imsi(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, char *imsi, int imsi_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the Integrated Circuit Card ID (ICCID) stored on the card.
+  @param [in] slot Slot to be used.
+  @param [out] iccid Buffer to fill ICCID data.
+  @param [in] iccid_len Buffer length.
+  @return Whether the ICCID was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_iccid(QL_SIM_SLOT_E slot, char *iccid, int iccid_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the device phone number stored on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [out] phone_num Buffer to fill phone number.
+  @param [in] phone_num_len Buffer length.
+  @return Whether the phone number was successfully retrieved.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_phone_num(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, 
+                          char *phone_num, int phone_num_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the preferred operators stored on the card.
+  @param [in] slot Slot to be used.
+  @param [in] list Buffer to hold operators
+  @note This function is only supported by 3GPP applications.
+  @return Whether the preferred operators were successfully retrieved.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_operators(QL_SIM_SLOT_E slot, ql_sim_operator_list_t *list);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Enables the PIN on an application.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] pin_value PIN value. NULL terminated.
+  @return Whether the PIN was successfully enabled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_enable_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Disables the PIN on an application.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] pin_value PIN value. NULL terminated.
+  @return Whether the PIN was successfully disabled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_disable_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Verifies the PIN value of an application.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] pin_value PIN value. NULL terminated.
+  @note PIN must be enabled before calling this function.
+  @return Whether the PIN was successfully verified.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_verify_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Changes the PIN value of an application.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] old_pin_value Old PIN value. NULL terminated.
+  @param [in] new_pin_value New PIN value. NULL terminated.
+  @return Whether the PIN was successfully changed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_change_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *old_pin_value, const char *new_pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Unblocks a blocked PIN using the PUK code.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] puk_value PUK value.  NULL terminated.
+  @param [in] pin_value New PIN value.  NULL terminated.
+  @note The user must pass PUK1 to unblock PIN1 or PUK2 to unblock PIN2.
+  @return Whether the PIN was successfully unblocked.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_unblock_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *puk_value, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the card info stored on a card.
+  @param [in] slot Slot to be used.
+  @param [out] p_info Pointer of ql_sim_card_info_t.
+  @return Whether the card info was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_card_info(QL_SIM_SLOT_E slot, ql_sim_card_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Reads data from a specific file on a specified application on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [inout] p_file Pointer of ql_sim_file_t.
+  @return Whether the file was successfully read.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_read_file(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, ql_sim_file_t *p_file);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Writes data to a specific file on a specified application on the card. 
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [in] p_file Pointer of ql_sim_file_t
+  @note The type of file is determined by the record number field,
+    which indicates a transparent file when zero and a record-based file otherwise.
+  @return Whether the file was successfully written.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_write_file(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, ql_sim_file_t *p_file);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the info of a specific file on a specified application on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [inout] p_info Pointer of ql_sim_file_info_t.
+  @return Whether the file info was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_file_info(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, 
+                                 ql_sim_file_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Reads phone book on a specified application on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Spplication type.
+  @param [in] pb_path Phone book path. NULL terminated.
+  @param [in] record_idx Record index to read. Starts from 1.
+  @param [out] p_record Pointer of ql_sim_phone_book_record_t.
+  @return Whether the phone book record was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_read_phone_book(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                                    const char *pb_path, uint8_t record_idx,
+                                    ql_sim_phone_book_record_t *p_record);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Writes phone book on a specified application on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [in] pb_path Phone book path. NULL terminated.
+  @param [in] record_idx Record index to write. Starts from 1.
+  @param [in] p_record Pointer of ql_sim_phone_book_record_t.
+  @note If p_record->name[0] = 0 and p_record->number[0] = 0, record will be deleted.
+  @return Whether the phone book record was successfully saved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_write_phone_book(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, 
+                                    const char *pb_path, uint8_t record_idx,
+                                    ql_sim_phone_book_record_t *p_record);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Opens a logical channel on a UICC card.
+  @param [in] slot Slot to be used.
+  @param [out] channel_id Channel opened.
+  @return Whether the logical channel was successfully opened.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_open_logical_channel(QL_SIM_SLOT_E slot, uint8_t *channel_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Closes a logical channel on a UICC card.
+  @param [in] slot Slot to be used.
+  @param [in] channel_id Channel to be closed.
+  @return Whether the logical channel was successfully closed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_close_logical_channel(QL_SIM_SLOT_E slot, uint8_t channel_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sends an APDU to the card.
+  @param [in] slot Slot to be used.
+  @param [in] channel_id Channel to be used.
+  @param [inout] p_apdu Pointer of ql_sim_apdu_t.
+  @note You must call ql_sim_open_logical_channel before sending an APDU.
+  @return Whether the APDU was successfully sent.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_send_apdu(QL_SIM_SLOT_E slot, uint8_t channel_id, ql_sim_apdu_t *p_apdu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets SIM card status callback handler
+  @param[in] cb call back handler.
+  @return Whether the card status callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_set_card_status_cb(ql_sim_card_status_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Switches slot.
+  @param [in] log_slot Logical slot to be switched.
+  @param [in] phy_slot Physical slot to be switched.
+  @return Whether the slot was successfully switched.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_switch_slot(QL_SIM_SLOT_E log_slot, QL_SIM_PHY_SLOT_E phy_slot);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets active slots.
+  @param [Out] p_active_slots Active slots.
+  @return Whether the active slots were successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_active_slots(ql_sim_active_slots_t *p_active_slots);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_set_service_error_cb(ql_sim_service_error_cb_f cb);
+
+//int ql_sim_switch_slot(QL_SIM_SLOT_E log_slot, QL_SIM_PHY_SLOT_E phy_slot);
+//int ql_sim_get_active_slots(ql_sim_active_slots_t *p_active_slots);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* __QL_SIM_H__ */
+
diff --git a/mbtk/include/ql_v2/ql_sleep_wakelock.h b/mbtk/include/ql_v2/ql_sleep_wakelock.h
new file mode 100755
index 0000000..71e58ae
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_sleep_wakelock.h
@@ -0,0 +1,33 @@
+#ifndef __QL_SLEEP_WAKELOCK_H__
+#define __QL_SLEEP_WAKELOCK_H__
+
+#include <stddef.h>
+/*
+ * create wakelock, return the file description of the wakelock
+ */
+extern int ql_slp_wakelock_create(const char *name, size_t len);
+
+/*
+ * lock the wakelock by the file description of the wakelock
+ */
+extern int ql_slp_wakelock_lock(int fd);
+
+
+/*
+ * unlock the wakelock by the file description of the wakelock
+ */
+extern int ql_slp_wakelock_unlock(int fd);
+
+/*
+ * destroy the wakelock by the file description of the wakelock
+ */
+extern int ql_slp_wakelock_destroy(int fd);
+
+/*
+ * Enable/Disable autosleep function
+ */
+extern int ql_autosleep_enable(char enable);
+
+#endif  //__QL_SLEEP_WAKELOCK_H__
+
+
diff --git a/mbtk/include/ql_v2/ql_sms.h b/mbtk/include/ql_v2/ql_sms.h
new file mode 100755
index 0000000..df12ba8
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_sms.h
@@ -0,0 +1,276 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_sms.h 
+  @brief SMS service API.
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200107   solomon.cui      Add GSM-7bit and ISO 8859-1 conversion.
+  20191225   solomon.cui      Modify fucntion description.
+  20191017   solomon.cui      Free async reponse not user data.
+  20190815   solomon.cui      Add service type for sending message.
+  20190627   solomon.cui      Support asynchronously send msg and pdu
+  20190625   solomon.cui      Convert timestamp frome hex to dec.
+  20190614   solomon.cui      Created .
+-------------------------------------------------------------------------------------------------*/
+#include <stdint.h>
+
+#define QL_SMS_MAX_SEND_MSG_LENGTH  1440    /**<  Maximum length of an sending SMS (9*160). */
+#define QL_SMS_MAX_SEND_PDU_LENGTH  255     /**<  Maximum length of an sms PDU. */
+#define QL_SMS_MAX_RECV_MSG_LENGTH  160     /**<  Maximum length of an recv SMS. */
+#define QL_SMS_MAX_ADDR_LENGTH      252     /**<  Maximum length of SCA addr. */
+
+/** The SMS message format. */
+typedef enum 
+{
+    QL_SMS_MSG_FORMAT_GSM_7BIT      = 0,
+    QL_SMS_MSG_FORMAT_BINARY_DATA   = 1,
+    QL_SMS_MSG_FORMAT_UCS2          = 2,
+} QL_SMS_MSG_FORMAT_E;
+
+/** */
+typedef enum {
+  QL_SMS_PRIMARY_SUBSCRIPTION      = 0, 
+  QL_SMS_SECONDARY_SUBSCRIPTION    = 1, 
+} QL_SMS_SUBSCRIPTION_E;
+
+
+/** The SMS message structure. */
+typedef struct 
+{
+    QL_SMS_MSG_FORMAT_E format;
+    char addr[QL_SMS_MAX_ADDR_LENGTH + 1]; /**< Source or destinamtion address. */
+    int content_size;
+    char content[QL_SMS_MAX_SEND_MSG_LENGTH];
+} ql_sms_msg_t;
+
+typedef struct 
+{
+    uint8_t year;       /**< Year. since 2000. e.g. 19 means 2019 */
+    uint8_t month;      /**< Month.*/
+    uint8_t day;        /**< Day.*/
+    uint8_t hours;      /**< Hour. 00 ~ 23 */
+    uint8_t minutes;    /**< Minutes.*/
+    uint8_t seconds;    /**< Seconds.*/
+    /** 
+     * The Time Zone indicates the difference, expressed in quarters of an hour, 
+     * between the local time and GMT. 
+     * */
+    uint8_t timezone;
+} ql_sms_timestamp_t;
+
+typedef struct
+{
+    
+    uint8_t valid;       /**< Indicate whether following is valid, 1 - valid; 0 - invalid; */
+    uint8_t total_seg;   /**< The number of long message segment*/
+    uint8_t cur_seg_num; /**< Current number.*/
+    uint8_t ref_num;     /**< reference number.*/
+} ql_sms_user_data_head_t;
+
+typedef void (*ql_sms_msg_async_cb_f)(int id, int result);
+typedef void (*ql_sms_msg_recv_cb_f)(ql_sms_msg_t *p_msg, ql_sms_timestamp_t *timestamp,
+                                             ql_sms_user_data_head_t *head);
+
+/** The SMS PDU format. */
+typedef enum
+{
+    QL_SMS_PDU_FORMAT_CDMA  = 0,
+    QL_SMS_PDU_FORMAT_GW_PP = 6,
+} QL_SMS_PDU_FORMAT_E;
+
+/** The SMS PDU structure. */
+typedef struct 
+{
+    QL_SMS_PDU_FORMAT_E format;
+    int content_size;
+    char content[QL_SMS_MAX_SEND_PDU_LENGTH];
+} ql_sms_pdu_t;
+
+
+typedef void (*ql_sms_pdu_async_cb_f)(int id, int result);
+typedef void (*ql_sms_pdu_recv_cb_f)(ql_sms_pdu_t *p_pdu);
+typedef void (*ql_sms_service_error_cb_f)(int error);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Initializes SMS service.
+  @return Whether the SMS service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes SMS service.
+  @return Whether the SMS service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets the service center address.
+  @param[in] addr service center address.
+  @param[in] len  service center address length.
+  @return Whether the service center address was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_set_service_center_addr(char *addr, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets the service center address.
+  @param[out] addr service center address.
+  @param[in] len  service center address length.
+  @return Whether the service center address was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_get_service_center_addr(char *addr, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends message synchronously.
+  @param[in] p_msg pointer to ql_sms_msg_t.
+  @return Whether the message was successfully sent synchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_send_msg(ql_sms_msg_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends message asynchronously.
+  @param[in] p_msg  pointer to ql_sms_msg_t
+  @param[out] id    id for this async operation
+  @param[in] cb     async callback
+  @return Whether the message was successfully sent asynchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_send_msg_async(ql_sms_msg_t *p_msg, int *id, ql_sms_msg_async_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets SMS message reception callback hanlder.
+  @param[in] cb message reception callback handler.
+  @return Whether the message reception callback hanlder was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_set_msg_recv_cb(ql_sms_msg_recv_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends PDU synchronously.
+  @param[in] p_pdu SMS PDU.
+  @return Whether the PDU was successfully sent synchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_send_pdu(ql_sms_pdu_t *p_pdu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends PDU asynchronously.
+  @param[in] p_pdu sms pdu.
+  @param[out] id id for this async operation.
+  @param[in] cb async callback.
+  @return Whether the PDU was successfully sent asynchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_send_pdu_async(ql_sms_pdu_t *p_pdu, int *id, ql_sms_pdu_async_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets SMS PDU reception callback hanlder.
+  @param[in] cb PDU reception callback handler.
+  @return Whether the PDU reception callback hanlder was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_set_pdu_recv_cb(ql_sms_pdu_recv_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_set_service_error_cb(ql_sms_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Binds the current control point to a specific subscription.
+  @param[in] sub  Subscription type.
+  @return Whether the subscription was successfully bound.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_bind_subscription(QL_SMS_SUBSCRIPTION_E sub);
+
+
diff --git a/mbtk/include/ql_v2/ql_test_utils.h b/mbtk/include/ql_v2/ql_test_utils.h
new file mode 100755
index 0000000..b62663e
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_test_utils.h
@@ -0,0 +1,129 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file test_utils.h 
+  @brief Test related interface definition
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20190508   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __TEST_UTILS_H__
+#define  __TEST_UTILS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+typedef void (*item_handler_f)(void);
+
+#define T_ARRAY_SIZE(items) (sizeof(items)/sizeof(items[0]))
+
+typedef struct
+{
+    const char *name;
+    item_handler_f handle;
+} t_item_t;
+
+typedef struct
+{
+    const char *name;
+    int item_len;
+    t_item_t *item_list;
+} t_module_t;
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a int value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int(int *val);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a uint32 value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_hex(uint32_t *val);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a char value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_char(int *val);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a string value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_string(char *str_buf, int str_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a list of int values from stdin 
+  @param[out] val, Return read datas
+  @param[out&in] val, Input buffer length, output the number of read
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int_list(int *dat_buf, int *dat_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a list of float values from stdin 
+  @param[out] val, Return read datas
+  @param[out&in] val, Input buffer length, output the number of read
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_float_list(float *dat_buf, int *dat_len);
+
+
+#ifdef __cplusplus
+} 
+#endif
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_type.h b/mbtk/include/ql_v2/ql_type.h
new file mode 100755
index 0000000..704f2bb
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_type.h
@@ -0,0 +1,197 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_type.h 
+  @brief This is the public header file which defines data type 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20181024   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_TYPE_H__
+#define __QL_TYPE_H__
+#include <stdint.h>
+
+typedef int ql_err_t ;
+
+#define QL_DEVICE_NAME_MAX_LEN          32
+
+#define QL_EID_BASE      1000
+#define QL_EID_EXTEND    10000
+
+
+#define QL_ERR_OK                       0                   /* Success */
+#define QL_ERR_FAILED                   (-(QL_EID_BASE+1))  /* Failed */
+#define QL_ERR_INTERNAL                 (-(QL_EID_BASE+2))  /* Internal error */
+#define QL_ERR_UNKNOWN                  (-(QL_EID_BASE+3))  /* Unknown error */
+#define QL_ERR_GENERIC                  (-(QL_EID_BASE+4))  /* General error */
+#define QL_ERR_DISABLED                 (-(QL_EID_BASE+5))  /* Disabled */
+#define QL_ERR_UNSUPPORTED              (-(QL_EID_BASE+6))  /* Unspported */
+#define QL_ERR_OP_UNSUPPORTED           (-(QL_EID_BASE+7))  /* Operation is not supported */
+#define QL_ERR_INTERNAL_EXTENDED        (-(QL_EID_BASE+8))  /* Extended internal error */
+#define QL_ERR_BUNDLING_UNSPPORTED      (-(QL_EID_BASE+9))  /* Bundling is not supported */
+#define QL_ERR_INVALID_ARG              (-(QL_EID_BASE+10))  /* Invalid argument */
+#define QL_ERR_INVALID_INDEX            (-(QL_EID_BASE+11))  /* Invalid index */
+#define QL_ERR_INVALID_REQUEST          (-(QL_EID_BASE+12))  /* Invalid request */ 
+#define QL_ERR_INVALID_STATE            (-(QL_EID_BASE+13))  /* Invalid state */ 
+#define QL_ERR_INVALID_ID               (-(QL_EID_BASE+14))  /* Invalid ID */
+#define QL_ERR_INVALID_MSG_ID           (-(QL_EID_BASE+15))  /* Invalid message id */
+#define QL_ERR_INVALID_HANDLE           (-(QL_EID_BASE+16))  /* Invalid handle */
+#define QL_ERR_INVALID_PROFILE          (-(QL_EID_BASE+17))  /* Invalid profile */
+#define QL_ERR_INVALID_PINID            (-(QL_EID_BASE+18))  /* Invalid PIN ID */
+#define QL_ERR_INVALID_CALL_ID          (-(QL_EID_BASE+19))  /* Invalid call id */
+#define QL_ERR_INVALID_TX_ID            (-(QL_EID_BASE+20))  /* Invalid Tx ID */
+#define QL_ERR_INVALID_DATA_FORMAT      (-(QL_EID_BASE+21))  /* Invalid data format */
+#define QL_ERR_INVALID_MSG_FORMAT       (-(QL_EID_BASE+22))  /* Invalid message format */ 
+#define QL_ERR_INVALID_TRANSITION       (-(QL_EID_BASE+23))  /* Invalid transition */
+#define QL_ERR_INVALID_IP_FAMILY        (-(QL_EID_BASE+24))  /* Invalid ip family */
+#define QL_ERR_INVALID_OPERATION        (-(QL_EID_BASE+25))  /* Invalid operation */
+#define QL_ERR_INVALID_CMD              (-(QL_EID_BASE+26))  /* Invalid command */
+#define QL_ERR_INVALID_TYPE             (-(QL_EID_BASE+27))  /* Invalid type */
+#define QL_ERR_DENIED                   (-(QL_EID_BASE+28))  /* Operation or access was denied */
+#define QL_ERR_RESTRICTED               (-(QL_EID_BASE+29))  /* Resouce is restricted */
+#define QL_ERR_NO_MEM                   (-(QL_EID_BASE+30))  /* Memory is not enough */
+#define QL_ERR_MEM                      (-(QL_EID_BASE+31))  /* Memory error */
+#define QL_ERR_BUF_OVERFLOW             (-(QL_EID_BASE+32))  /* BUffer overflow */
+#define QL_ERR_TIMEOUT                  (-(QL_EID_BASE+33))  /* Timeout */
+#define QL_ERR_NOT_INIT                 (-(QL_EID_BASE+34))  /* Not initialized */
+#define QL_ERR_ABORTED                  (-(QL_EID_BASE+35))  /* Action was aborted */
+#define QL_ERR_NETWORK_ABORTED          (-(QL_EID_BASE+36))  /* Network was aborted */
+#define QL_ERR_RESOURCE_EXHAUSTED       (-(QL_EID_BASE+37))  /* Resource have been exhausted */
+#define QL_ERR_RESOUCE_IN_USE           (-(QL_EID_BASE+38))  /* Resouce in use */
+#define QL_ERR_RESOUCE_NOT_ENOUGH       (-(QL_EID_BASE+39))  /* Insufficient resources */
+#define QL_ERR_UNABORTABLE_TRANSACTION  (-(QL_EID_BASE+40))  /* Unabortable transaction */
+#define QL_ERR_INCORRECT_PIN            (-(QL_EID_BASE+41))  /* Incorrect PIN */
+#define QL_ERR_NO_NETWORK_FOUND         (-(QL_EID_BASE+42))  /* No network found */
+#define QL_ERR_CALL_FAILED              (-(QL_EID_BASE+43))  /* Call failed */
+#define QL_ERR_OUT_OF_CALL              (-(QL_EID_BASE+44))  /* Out of call */
+#define QL_ERR_NOT_PROVISIONED          (-(QL_EID_BASE+45))  /* Not provisioned */
+#define QL_ERR_MISSING_ARG              (-(QL_EID_BASE+46))  /* Missing argument */
+#define QL_ERR_ARG_TOO_LONG             (-(QL_EID_BASE+47))  /* Argument is too long */
+#define QL_ERR_DEVICE_NOT_READY         (-(QL_EID_BASE+48))  /* Device is not ready */
+#define QL_ERR_OP_DEVICE_UNSUPPORTED    (-(QL_EID_BASE+49))  /* OP device is not supported */
+#define QL_ERR_DEVICE_NO_MEM            (-(QL_EID_BASE+50))  /* Device memory is not enough */
+#define QL_ERR_DEVICE_MEM               (-(QL_EID_BASE+51))  /* Device memory error */
+#define QL_ERR_DEVICE_IN_USE            (-(QL_EID_BASE+52))  /* Device in use */
+#define QL_ERR_OP_NETWORK_UNSUPPORTED   (-(QL_EID_BASE+53))  /* OP network is not supported */
+#define QL_ERR_NO_EFFECT                (-(QL_EID_BASE+54))  /* No effect */
+#define QL_ERR_AUTH_FAILED              (-(QL_EID_BASE+55))  /* Authentication failed */
+#define QL_ERR_AUTH_LOCK                (-(QL_EID_BASE+56))  /* Authentication lock error */
+#define QL_ERR_PIN_BLOCKED              (-(QL_EID_BASE+57))  /* PIN is blocked */
+#define QL_ERR_PIN_PERM_BLOCKED         (-(QL_EID_BASE+58))  /* PIN is permanently blocked */
+#define QL_ERR_SIM_NOT_INIT             (-(QL_EID_BASE+59))  /* SIM is not initialized */
+#define QL_ERR_SIM_NOT_FOUND            (-(QL_EID_BASE+60))  /* SIM was not found */
+#define QL_ERR_REQUESTED_NUM_UNSUPPORTED  (-(QL_EID_BASE+61))  /* Requested number is not supported */
+#define QL_ERR_INTERFACE_NOT_FOUND        (-(QL_EID_BASE+62))  /* Interface was not found */
+#define QL_ERR_FILE_NOT_FOUND            (-(QL_EID_BASE+63))   /* File was not found */
+#define QL_ERR_SERVICE_NOT_FOUND         (-(QL_EID_BASE+64))   /* service was not found */
+#define QL_ERR_NO_ENTRY                  (-(QL_EID_BASE+65))   /* No entry */
+#define QL_ERR_NETWORK_NOT_READY         (-(QL_EID_BASE+66))   /* Network is not ready */
+#define QL_ERR_SERVICE_NOT_READY         (-(QL_EID_BASE+67))   /* Service is not ready */ 
+#define QL_ERR_CAUSE_CODE                (-(QL_EID_BASE+68))   /* Cause code error */
+#define QL_ERR_MSG_NOT_SENT              (-(QL_EID_BASE+69))   /* Message was not sent */
+#define QL_ERR_MSG_DELIVERY_FAILURE      (-(QL_EID_BASE+70))   /* Message delivery failure */
+#define QL_ERR_MSG_BLOCKED               (-(QL_EID_BASE+71))   /* Message was blocked */
+#define QL_ERR_ENCODING                  (-(QL_EID_BASE+72))   /* Encoding error */
+#define QL_ERR_DECODING                  (-(QL_EID_BASE+73))   /* Decoding error */
+#define QL_ERR_SESSION_INVALID_TYPE      (-(QL_EID_BASE+74))   /* Invalid session type */
+#define QL_ERR_SESSION_INACTIVE          (-(QL_EID_BASE+75))   /* Session is inactive */
+#define QL_ERR_SESSION_INVALID           (-(QL_EID_BASE+76))   /* Session is invalid */
+#define QL_ERR_SESSION_OWNERSHIP         (-(QL_EID_BASE+77))   /* Session ownership error */
+#define QL_ERR_SMSC_ADDR                 (-(QL_EID_BASE+78))   /* Short message service center address error */
+#define QL_ERR_INFO_UNAVAILABLE          (-(QL_EID_BASE+79))   /* Information is not available */
+#define QL_ERR_SEGMENT_TOO_LONG          (-(QL_EID_BASE+80))   /* Segment is too long */
+#define QL_ERR_SEGMENT_ORDER             (-(QL_EID_BASE+81))   /* Segment order error */
+#define QL_ERR_MISMATCH                  (-(QL_EID_BASE+82))   /* Something mismatch */ 
+#define QL_ERR_ACK_NOT_SENT              (-(QL_EID_BASE+83))   /* Acknowledgement was not sent */
+#define QL_ERR_INTERNAL_TIMEOUT          (-(QL_EID_BASE+84))   /* Internal timeout */
+#define QL_ERR_FDN_RESTRICT              (-(QL_EID_BASE+85))   /* Fixed dialing number restrict error */
+#define QL_ERR_NO_RADIO                  (-(QL_EID_BASE+86))   /* No radio */
+#define QL_ERR_INVALID_PB_TYPE           (-(QL_EID_BASE+87))   /* Invalid phonebook type */
+#define QL_ERR_PB_NOT_READY              (-(QL_EID_BASE+88))   /* Phonebook not ready */
+#define QL_ERR_PB_ACCESS_RESTRICTED      (-(QL_EID_BASE+89))   /* Phonebook access is restricted */
+#define QL_ERR_SUPS_FAILURE_CAUSE        (-(QL_EID_BASE+90))   /* SUPS failure cause */
+#define QL_ERR_NV_NO_FILE                (-(QL_EID_BASE+91))   /* NV file not exist */
+#define QL_ERR_NV_FS_NOT_SUPPORTED       (-(QL_EID_BASE+92))   /* NV file system not supported */
+#define QL_ERR_NV_BAD_SIZE               (-(QL_EID_BASE+93))   /* NV bad buffer size */
+#define QL_ERR_NV_BAD_BUF                (-(QL_EID_BASE+94))   /* NV buffer is NULL*/
+#define QL_ERR_TARGET_EXIST              (-(QL_EID_BASE+95))   /* Target exists */
+#define QL_ERR_TARGET_NOT_EXIST          (-(QL_EID_BASE+96))   /* Target does not exist */
+#define QL_ERR_NO_PERMISSION             (-(QL_EID_BASE+97))   /* No permission */
+#define QL_ERR_MODEM_OFFLINE             (-(QL_EID_BASE+98))   /* Modem subsystem is offline */
+#define QL_ERR_SERVICE_ABORT             (-(QL_EID_BASE+99))   /* Service abort */
+#define QL_ERR_CHANNEL_OUT_OF_RANGE      (-(QL_EID_BASE+100))  /* Sim logical channel out of range */
+#define QL_ERR_APDU_FORMAT               (-(QL_EID_BASE+101))  /* Sim apdu format error */
+#define QL_ERR_INVALID_PIN_TYPE          (-(QL_EID_BASE+102))  /* Sim invalid pin type  */
+
+#define QL_ERR_RIL_RADIO_NOT_AVAILABLE          (-(QL_EID_BASE+1001))  /* If radio did not start or is resetting */
+#define QL_ERR_RIL_GENERIC_FAILURE              (-(QL_EID_BASE+1002))  
+#define QL_ERR_RIL_PASSWORD_INCORRECT           (-(QL_EID_BASE+1003))  /* for PIN/PIN2 methods only! */
+#define QL_ERR_RIL_SIM_PIN2                     (-(QL_EID_BASE+1004))  /* Operation requires SIM PIN2 to be entered */
+#define QL_ERR_RIL_SIM_PUK2                     (-(QL_EID_BASE+1005))  /* Operation requires SIM PUK2 to be entered */
+#define QL_ERR_RIL_REQUEST_NOT_SUPPORTED        (-(QL_EID_BASE+1006))  
+#define QL_ERR_RIL_CANCELLED                    (-(QL_EID_BASE+1007))  
+#define QL_ERR_RIL_OP_NOT_ALLOWED_DURING_VOICE_CALL      (-(QL_EID_BASE+1008))  /* data ops are not allowed during voice call on a Class C GPRS device */
+#define QL_ERR_RIL_OP_NOT_ALLOWED_BEFORE_REG_TO_NW       (-(QL_EID_BASE+1009))  /* data ops are not allowed before device registers in network */
+#define QL_ERR_RIL_SMS_SEND_FAIL_RETRY          (-(QL_EID_BASE+1010))  /* fail to send sms and need retry */
+#define QL_ERR_RIL_SIM_ABSENT                   (-(QL_EID_BASE+1011))  /* fail to set the location where CDMA subscription
+                                                                           shall be retrieved because of SIM or RUIM card absent */
+#define QL_ERR_RIL_SUBSCRIPTION_NOT_AVAILABLE   (-(QL_EID_BASE+1012))  /* fail to find CDMA subscription from specified location */
+#define QL_ERR_RIL_MODE_NOT_SUPPORTED           (-(QL_EID_BASE+1013))  /* HW does not support preferred network type */
+#define QL_ERR_RIL_FDN_CHECK_FAILURE            (-(QL_EID_BASE+1014))  /* command failed because recipient is not on FDN list */
+#define QL_ERR_RIL_ILLEGAL_SIM_OR_ME            (-(QL_EID_BASE+1015))  /* network selection failed due to illegal SIM or ME */
+#define QL_ERR_RIL_MISSING_RESOURCE             (-(QL_EID_BASE+1016))  /* no logical channel available */
+#define QL_ERR_RIL_NO_SUCH_ELEMENT              (-(QL_EID_BASE+1017))  /* application not found on SIM */
+#define QL_ERR_RIL_DIAL_MODIFIED_TO_USSD        (-(QL_EID_BASE+1018))  /* DIAL request modified to USSD */
+#define QL_ERR_RIL_DIAL_MODIFIED_TO_SS          (-(QL_EID_BASE+1019))  /* DIAL request modified to SS */
+#define QL_ERR_RIL_DIAL_MODIFIED_TO_DIAL        (-(QL_EID_BASE+1020))  /* DIAL request modified to DIAL with different data */
+#define QL_ERR_RIL_USSD_MODIFIED_TO_DIAL        (-(QL_EID_BASE+1021))  /* USSD request modified to DIAL */
+#define QL_ERR_RIL_USSD_MODIFIED_TO_SS          (-(QL_EID_BASE+1022))  /* USSD request modified to SS */
+#define QL_ERR_RIL_USSD_MODIFIED_TO_USSD        (-(QL_EID_BASE+1023))  /* USSD request modified to different USSD request */
+#define QL_ERR_RIL_SS_MODIFIED_TO_DIAL          (-(QL_EID_BASE+1024))  /* SS request modified to DIAL */
+#define QL_ERR_RIL_SS_MODIFIED_TO_USSD          (-(QL_EID_BASE+1025))  /* SS request modified to USSD */
+#define QL_ERR_RIL_SUBSCRIPTION_NOT_SUPPORTED   (-(QL_EID_BASE+1026))  /* Subscription not supported by RIL */
+#define QL_ERR_RIL_SS_MODIFIED_TO_SS            (-(QL_EID_BASE+1027))  /* SS request modified to different SS request */
+#define QL_ERR_RIL_LCE_NOT_SUPPORTED            (-(QL_EID_BASE+1028))  /* LCE service not supported(36 in RILConstants.java) */
+#define QL_ERR_RIL_DIAL_STRING_TOO_LONG         (-(QL_EID_BASE+1029))  
+#define QL_ERR_RIL_TEXT_STRING_TOO_LONG         (-(QL_EID_BASE+1030))  
+#define QL_ERR_RIL_SIM_MEM_FULL                 (-(QL_EID_BASE+1031))  
+#define QL_ERR_RIL_CALL_BARRED                  (-(QL_EID_BASE+1032))  /* command failed because call barred */
+#define QL_ERR_RIL_EXTERNAL_APP_CAUSE_BEGIN     (-(QL_EID_BASE+1033))  
+#define QL_ERR_RIL_BT_SAP_UNDEFINED             (-(QL_EID_BASE+1034))  
+#define QL_ERR_RIL_BT_SAP_NOT_ACCESSIBLE        (-(QL_EID_BASE+1035))  
+#define QL_ERR_RIL_BT_SAP_CARD_REMOVED          (-(QL_EID_BASE+1036))  
+#define QL_ERR_RIL_BT_SAP_UIM_NOT_INSERTED      (-(QL_EID_BASE+1037))  
+#define QL_ERR_RIL_BT_SAP_ERROR_NO_REASON_DEFINED   (-(QL_EID_BASE+1038))  
+#define QL_ERR_RIL_BT_SAP_ALREADY_POWERED_OFF       (-(QL_EID_BASE+1039))  
+#define QL_ERR_RIL_BT_SAP_ALREADY_POWERED_ON        (-(QL_EID_BASE+1040))  
+#define QL_ERR_RIL_VERIFICATION_FAILED              (-(QL_EID_BASE+1041))  
+#define QL_ERR_RIL_REBOOT_REQUEST                   (-(QL_EID_BASE+1042))  
+#define QL_ERR_RIL_HOLD_FAILED_CAUSED_BY_TERMINATED (-(QL_EID_BASE+1043))  
+#define QL_ERR_RIL_POWER_ON_UIM_NOT_READY           (-(QL_EID_BASE+1044))  
+#define QL_ERR_RIL_UIM_EF_NOT_EXIST                 (-(QL_EID_BASE+1045))
+
+typedef enum
+{
+    QL_SIM_MIN = 0,
+    QL_SIM_1 = 1,
+    QL_SIM_2 = 2,
+    QL_SIM_MAX
+}QL_SIM_ID_E;
+
+#define QL_IS_SIM_VALID(sim_id) ((sim_id)>QL_SIM_MIN && (sim_id)<QL_SIM_MAX)
+
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_voice.h b/mbtk/include/ql_v2/ql_voice.h
new file mode 100755
index 0000000..0882a66
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_voice.h
@@ -0,0 +1,1069 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_voice.h 
+  @brief Voice service API. 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20210622   Rambo.shan   Added Voice DSDA API.
+  20210203   Rambo.shan   Added Voice bind API for DSDA.
+  20210104   Rambo.shan   Added DTMF event indication.
+  20200928   Rambo.shan   Added eCall set option of T3.
+  20200907   Rambo.shan   Added SETUP voice state.
+  20200622   Rambo.shan   Add eCall auto answer function
+  20191225   solomon.cui  Modify fucntion description.
+  20191111   solomon.cui  Add eCall APIs.
+  20190815   solomon.cui  Add service type for sending message.
+  20190625   solomon.cui  Created.
+-------------------------------------------------------------------------------------------------*/
+#include <stdint.h>
+
+#define QL_VOICE_MAX_PHONE_NUMBER       (82)
+#define QL_VOICE_MAX_RECORDS            (8)
+#define QL_VOICE_MAX_DTMF_LENGTH        (20)
+#define QL_VOICE_MAX_FW_DETAIL_LENGTH   (13)
+#define QL_VOICE_MAX_ECALL_MSD          (140)
+
+typedef enum 
+{
+    QL_VOICE_STATE_INCOMING = 0x0000, /**< Call is incoming. */
+    QL_VOICE_STATE_DIALING  = 0x0001, /**< Dialing state. */
+    QL_VOICE_STATE_ALERTING = 0x0002, /**< Alterting. */
+    QL_VOICE_STATE_ACTIVE   = 0x0003, /**< Call is active. */
+    QL_VOICE_STATE_HOLDING  = 0x0004, /**< Call is on hold. */
+    QL_VOICE_STATE_END      = 0x0005, /**< Call is disconnected. */
+    QL_VOICE_STATE_WAITING  = 0x0006, /**< Call is waiting. */
+    QL_VOICE_STATE_SETUP    = 0x0007, /**< MT Call is in Setup state in 3GPP. */
+} QL_VOICE_STATE_E;
+
+typedef enum
+{
+    QL_VOICE_TECH_NONE  = 0, /**< None. */
+    QL_VOICE_TECH_3GPP  = 1, /**< 3GPP. */
+    QL_VOICE_TECH_3GPP2 = 2, /**< 3GPP2. */
+} QL_VOICE_TECH_E;
+
+typedef enum
+{
+    QL_VOICE_DIR_MO = 0, /**< Mobile originated call */
+    QL_VOICE_DIR_MT = 1, /**< Mobile terminated call */
+} QL_VOICE_DIR_E;
+
+typedef enum
+{
+    VOICE_CALL_EVENT,
+    VOICE_MUTE_EVENT,
+    VOICE_DTMF_EVENT,
+    VOICE_ECALL_EVENT,
+    VOICE_ECALL_STATUS,
+} VOICE_EVENT_E;
+
+typedef enum
+{
+    QL_VOICE_END_REASON_NONE                                                    = 0, 
+    QL_VOICE_END_REASON_OFFLINE                                                 = 1, 
+    QL_VOICE_END_REASON_CDMA_LOCK                                               = 2, 
+    QL_VOICE_END_REASON_NO_SRV                                                  = 3, 
+    QL_VOICE_END_REASON_FADE                                                    = 4, 
+    QL_VOICE_END_REASON_INTERCEPT                                               = 5, 
+    QL_VOICE_END_REASON_REORDER                                                 = 6, 
+    QL_VOICE_END_REASON_REL_NORMAL                                              = 7, 
+    QL_VOICE_END_REASON_REL_SO_REJ                                              = 8, 
+    QL_VOICE_END_REASON_INCOM_CALL                                              = 9, 
+    QL_VOICE_END_REASON_ALERT_STOP                                              = 10, 
+    QL_VOICE_END_REASON_CLIENT_END                                              = 11, 
+    QL_VOICE_END_REASON_ACTIVATION                                              = 12, 
+    QL_VOICE_END_REASON_MC_ABORT                                                = 13, 
+    QL_VOICE_END_REASON_MAX_ACCESS_PROBE                                        = 14, 
+    QL_VOICE_END_REASON_PSIST_N                                                 = 15, 
+    QL_VOICE_END_REASON_UIM_NOT_PRESENT                                         = 16, 
+    QL_VOICE_END_REASON_ACC_IN_PROG                                             = 17, 
+    QL_VOICE_END_REASON_ACC_FAIL                                                = 18, 
+    QL_VOICE_END_REASON_RETRY_ORDER                                             = 19, 
+    QL_VOICE_END_REASON_CCS_NOT_SUPPORTED_BY_BS                                 = 20, 
+    QL_VOICE_END_REASON_NO_RESPONSE_FROM_BS                                     = 21, 
+    QL_VOICE_END_REASON_REJECTED_BY_BS                                          = 22, 
+    QL_VOICE_END_REASON_INCOMPATIBLE                                            = 23, 
+    QL_VOICE_END_REASON_ACCESS_BLOCK                                            = 24, 
+    QL_VOICE_END_REASON_ALREADY_IN_TC                                           = 25, 
+    QL_VOICE_END_REASON_EMERGENCY_FLASHED                                       = 26, 
+    QL_VOICE_END_REASON_USER_CALL_ORIG_DURING_GPS                               = 27, 
+    QL_VOICE_END_REASON_USER_CALL_ORIG_DURING_SMS                               = 28, 
+    QL_VOICE_END_REASON_USER_CALL_ORIG_DURING_DATA                              = 29, 
+    QL_VOICE_END_REASON_REDIR_OR_HANDOFF                                        = 30, 
+    QL_VOICE_END_REASON_ACCESS_BLOCK_ALL                                        = 31, 
+    QL_VOICE_END_REASON_OTASP_SPC_ERR                                           = 32, 
+    QL_VOICE_END_REASON_IS707B_MAX_ACC                                          = 33, 
+    QL_VOICE_END_REASON_ACC_FAIL_REJ_ORD                                        = 34, 
+    QL_VOICE_END_REASON_ACC_FAIL_RETRY_ORD                                      = 35, 
+    QL_VOICE_END_REASON_TIMEOUT_T42                                             = 36, 
+    QL_VOICE_END_REASON_TIMEOUT_T40                                             = 37, 
+    QL_VOICE_END_REASON_SRV_INIT_FAIL                                           = 38, 
+    QL_VOICE_END_REASON_T50_EXP                                                 = 39, 
+    QL_VOICE_END_REASON_T51_EXP                                                 = 40, 
+    QL_VOICE_END_REASON_RL_ACK_TIMEOUT                                          = 41, 
+    QL_VOICE_END_REASON_BAD_FL                                                  = 42, 
+    QL_VOICE_END_REASON_TRM_REQ_FAIL                                            = 43, 
+    QL_VOICE_END_REASON_TIMEOUT_T41                                             = 44, 
+    QL_VOICE_END_REASON_INCOM_REJ                                               = 45, 
+    QL_VOICE_END_REASON_SETUP_REJ                                               = 46, 
+    QL_VOICE_END_REASON_NETWORK_END                                             = 47, 
+    QL_VOICE_END_REASON_NO_FUNDS                                                = 48, 
+    QL_VOICE_END_REASON_NO_GW_SRV                                               = 49, 
+    QL_VOICE_END_REASON_NO_CDMA_SRV                                             = 50, 
+    QL_VOICE_END_REASON_NO_FULL_SRV                                             = 51, 
+    QL_VOICE_END_REASON_MAX_PS_CALLS                                            = 52, 
+    QL_VOICE_END_REASON_UNKNOWN_SUBSCRIBER                                      = 53, 
+    QL_VOICE_END_REASON_ILLEGAL_SUBSCRIBER                                      = 54, 
+    QL_VOICE_END_REASON_BEARER_SERVICE_NOT_PROVISIONED                          = 55, 
+    QL_VOICE_END_REASON_TELE_SERVICE_NOT_PROVISIONED                            = 56, 
+    QL_VOICE_END_REASON_ILLEGAL_EQUIPMENT                                       = 57, 
+    QL_VOICE_END_REASON_CALL_BARRED                                             = 58, 
+    QL_VOICE_END_REASON_ILLEGAL_SS_OPERATION                                    = 59, 
+    QL_VOICE_END_REASON_SS_ERROR_STATUS                                         = 60, 
+    QL_VOICE_END_REASON_SS_NOT_AVAILABLE                                        = 61, 
+    QL_VOICE_END_REASON_SS_SUBSCRIPTION_VIOLATION                               = 62, 
+    QL_VOICE_END_REASON_SS_INCOMPATIBILITY                                      = 63, 
+    QL_VOICE_END_REASON_FACILITY_NOT_SUPPORTED                                  = 64, 
+    QL_VOICE_END_REASON_ABSENT_SUBSCRIBER                                       = 65, 
+    QL_VOICE_END_REASON_SHORT_TERM_DENIAL                                       = 66, 
+    QL_VOICE_END_REASON_LONG_TERM_DENIAL                                        = 67, 
+    QL_VOICE_END_REASON_SYSTEM_FAILURE                                          = 68, 
+    QL_VOICE_END_REASON_DATA_MISSING                                            = 69, 
+    QL_VOICE_END_REASON_UNEXPECTED_DATA_VALUE                                   = 70, 
+    QL_VOICE_END_REASON_PWD_REGISTRATION_FAILURE                                = 71, 
+    QL_VOICE_END_REASON_NEGATIVE_PWD_CHECK                                      = 72, 
+    QL_VOICE_END_REASON_NUM_OF_PWD_ATTEMPTS_VIOLATION                           = 73, 
+    QL_VOICE_END_REASON_POSITION_METHOD_FAILURE                                 = 74, 
+    QL_VOICE_END_REASON_UNKNOWN_ALPHABET                                        = 75, 
+    QL_VOICE_END_REASON_USSD_BUSY                                               = 76, 
+    QL_VOICE_END_REASON_REJECTED_BY_USER                                        = 77, 
+    QL_VOICE_END_REASON_REJECTED_BY_NETWORK                                     = 78, 
+    QL_VOICE_END_REASON_DEFLECTION_TO_SERVED_SUBSCRIBER                         = 79, 
+    QL_VOICE_END_REASON_SPECIAL_SERVICE_CODE                                    = 80, 
+    QL_VOICE_END_REASON_INVALID_DEFLECTED_TO_NUMBER                             = 81, 
+    QL_VOICE_END_REASON_MPTY_PARTICIPANTS_EXCEEDED                              = 82, 
+    QL_VOICE_END_REASON_RESOURCES_NOT_AVAILABLE                                 = 83, 
+    QL_VOICE_END_REASON_UNASSIGNED_NUMBER                                       = 84, 
+    QL_VOICE_END_REASON_NO_ROUTE_TO_DESTINATION                                 = 85, 
+    QL_VOICE_END_REASON_CHANNEL_UNACCEPTABLE                                    = 86, 
+    QL_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING                             = 87, 
+    QL_VOICE_END_REASON_NORMAL_CALL_CLEARING                                    = 88, 
+    QL_VOICE_END_REASON_USER_BUSY                                               = 89, 
+    QL_VOICE_END_REASON_NO_USER_RESPONDING                                      = 90, 
+    QL_VOICE_END_REASON_USER_ALERTING_NO_ANSWER                                 = 91, 
+    QL_VOICE_END_REASON_CALL_REJECTED                                           = 92, 
+    QL_VOICE_END_REASON_NUMBER_CHANGED                                          = 93, 
+    QL_VOICE_END_REASON_PREEMPTION                                              = 94, 
+    QL_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER                                = 95, 
+    QL_VOICE_END_REASON_INVALID_NUMBER_FORMAT                                   = 96, 
+    QL_VOICE_END_REASON_FACILITY_REJECTED                                       = 97, 
+    QL_VOICE_END_REASON_RESP_TO_STATUS_ENQUIRY                                  = 98, 
+    QL_VOICE_END_REASON_NORMAL_UNSPECIFIED                                      = 99, 
+    QL_VOICE_END_REASON_NO_CIRCUIT_OR_CHANNEL_AVAILABLE                         = 100, 
+    QL_VOICE_END_REASON_NETWORK_OUT_OF_ORDER                                    = 101, 
+    QL_VOICE_END_REASON_TEMPORARY_FAILURE                                       = 102, 
+    QL_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION                          = 103, 
+    QL_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED                            = 104, 
+    QL_VOICE_END_REASON_REQUESTED_CIRCUIT_OR_CHANNEL_NOT_AVAILABLE              = 105, 
+    QL_VOICE_END_REASON_RESOURCES_UNAVAILABLE_OR_UNSPECIFIED                    = 106, 
+    QL_VOICE_END_REASON_QOS_UNAVAILABLE                                         = 107, 
+    QL_VOICE_END_REASON_REQUESTED_FACILITY_NOT_SUBSCRIBED                       = 108, 
+    QL_VOICE_END_REASON_INCOMING_CALLS_BARRED_WITHIN_CUG                        = 109, 
+    QL_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AUTH                              = 110, 
+    QL_VOICE_END_REASON_BEARER_CAPABILITY_UNAVAILABLE                           = 111, 
+    QL_VOICE_END_REASON_SERVICE_OPTION_NOT_AVAILABLE                            = 112, 
+    QL_VOICE_END_REASON_ACM_LIMIT_EXCEEDED                                      = 113, 
+    QL_VOICE_END_REASON_BEARER_SERVICE_NOT_IMPLEMENTED                          = 114, 
+    QL_VOICE_END_REASON_REQUESTED_FACILITY_NOT_IMPLEMENTED                      = 115, 
+    QL_VOICE_END_REASON_ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE               = 116, 
+    QL_VOICE_END_REASON_SERVICE_OR_OPTION_NOT_IMPLEMENTED                       = 117, 
+    QL_VOICE_END_REASON_INVALID_TRANSACTION_IDENTIFIER                          = 118, 
+    QL_VOICE_END_REASON_USER_NOT_MEMBER_OF_CUG                                  = 119, 
+    QL_VOICE_END_REASON_INCOMPATIBLE_DESTINATION                                = 120, 
+    QL_VOICE_END_REASON_INVALID_TRANSIT_NW_SELECTION                            = 121, 
+    QL_VOICE_END_REASON_SEMANTICALLY_INCORRECT_MESSAGE                          = 122, 
+    QL_VOICE_END_REASON_INVALID_MANDATORY_INFORMATION                           = 123, 
+    QL_VOICE_END_REASON_MESSAGE_TYPE_NON_IMPLEMENTED                            = 124, 
+    QL_VOICE_END_REASON_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE         = 125, 
+    QL_VOICE_END_REASON_INFORMATION_ELEMENT_NON_EXISTENT                        = 126, 
+    QL_VOICE_END_REASON_CONDITONAL_IE_ERROR                                     = 127, 
+    QL_VOICE_END_REASON_MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE              = 128, 
+    QL_VOICE_END_REASON_RECOVERY_ON_TIMER_EXPIRED                               = 129, 
+    QL_VOICE_END_REASON_PROTOCOL_ERROR_UNSPECIFIED                              = 130, 
+    QL_VOICE_END_REASON_INTERWORKING_UNSPECIFIED                                = 131, 
+    QL_VOICE_END_REASON_OUTGOING_CALLS_BARRED_WITHIN_CUG                        = 132, 
+    QL_VOICE_END_REASON_NO_CUG_SELECTION                                        = 133, 
+    QL_VOICE_END_REASON_UNKNOWN_CUG_INDEX                                       = 134, 
+    QL_VOICE_END_REASON_CUG_INDEX_INCOMPATIBLE                                  = 135, 
+    QL_VOICE_END_REASON_CUG_CALL_FAILURE_UNSPECIFIED                            = 136, 
+    QL_VOICE_END_REASON_CLIR_NOT_SUBSCRIBED                                     = 137, 
+    QL_VOICE_END_REASON_CCBS_POSSIBLE                                           = 138, 
+    QL_VOICE_END_REASON_CCBS_NOT_POSSIBLE                                       = 139, 
+    QL_VOICE_END_REASON_IMSI_UNKNOWN_IN_HLR                                     = 140, 
+    QL_VOICE_END_REASON_ILLEGAL_MS                                              = 141, 
+    QL_VOICE_END_REASON_IMSI_UNKNOWN_IN_VLR                                     = 142, 
+    QL_VOICE_END_REASON_IMEI_NOT_ACCEPTED                                       = 143, 
+    QL_VOICE_END_REASON_ILLEGAL_ME                                              = 144, 
+    QL_VOICE_END_REASON_PLMN_NOT_ALLOWED                                        = 145, 
+    QL_VOICE_END_REASON_LOCATION_AREA_NOT_ALLOWED                               = 146, 
+    QL_VOICE_END_REASON_ROAMING_NOT_ALLOWED_IN_THIS_LOCATION_AREA               = 147, 
+    QL_VOICE_END_REASON_NO_SUITABLE_CELLS_IN_LOCATION_AREA                      = 148, 
+    QL_VOICE_END_REASON_NETWORK_FAILURE                                         = 149, 
+    QL_VOICE_END_REASON_MAC_FAILURE                                             = 150, 
+    QL_VOICE_END_REASON_SYNCH_FAILURE                                           = 151, 
+    QL_VOICE_END_REASON_NETWORK_CONGESTION                                      = 152, 
+    QL_VOICE_END_REASON_GSM_AUTHENTICATION_UNACCEPTABLE                         = 153, 
+    QL_VOICE_END_REASON_SERVICE_NOT_SUBSCRIBED                                  = 154, 
+    QL_VOICE_END_REASON_SERVICE_TEMPORARILY_OUT_OF_ORDER                        = 155, 
+    QL_VOICE_END_REASON_CALL_CANNOT_BE_IDENTIFIED                               = 156, 
+    QL_VOICE_END_REASON_INCORRECT_SEMANTICS_IN_MESSAGE                          = 157, 
+    QL_VOICE_END_REASON_MANDATORY_INFORMATION_INVALID                           = 158, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_FAILURE                                  = 159, 
+    QL_VOICE_END_REASON_INVALID_SIM                                             = 160, 
+    QL_VOICE_END_REASON_WRONG_STATE                                             = 161, 
+    QL_VOICE_END_REASON_ACCESS_CLASS_BLOCKED                                    = 162, 
+    QL_VOICE_END_REASON_NO_RESOURCES                                            = 163, 
+    QL_VOICE_END_REASON_INVALID_USER_DATA                                       = 164, 
+    QL_VOICE_END_REASON_TIMER_T3230_EXPIRED                                     = 165, 
+    QL_VOICE_END_REASON_NO_CELL_AVAILABLE                                       = 166, 
+    QL_VOICE_END_REASON_ABORT_MSG_RECEIVED                                      = 167, 
+    QL_VOICE_END_REASON_RADIO_LINK_LOST                                         = 168, 
+    QL_VOICE_END_REASON_TIMER_T303_EXPIRED                                      = 169, 
+    QL_VOICE_END_REASON_CNM_MM_REL_PENDING                                      = 170, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RR_REL_IND                           = 171, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RR_RANDOM_ACCESS_FAILURE             = 172, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RRC_REL_IND                          = 173, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RRC_CLOSE_SESSION_IND                = 174, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RRC_OPEN_SESSION_FAILURE             = 175, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_LOW_LEVEL_FAIL                       = 176, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_LOW_LEVEL_FAIL_REDIAL_NOT_ALLOWED    = 177, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_LOW_LEVEL_IMMED_RETRY                = 178, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_ABORT_RADIO_UNAVAILABLE              = 179, 
+    QL_VOICE_END_REASON_SERVICE_OPTION_NOT_SUPPORTED                            = 180, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_TXN                     = 181, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_HO                      = 182, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_CONN_REL                = 183, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_RLF                     = 184, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_CTRL_NOT_CONN           = 185, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_SUCCESS                            = 186, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE                            = 187, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_ABORTED                    = 188, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_ACCESS_BARRED              = 189, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_CELL_RESEL                 = 190, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_CONFIG_FAILURE             = 191, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_TIMER_EXPIRED              = 192, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_LINK_FAILURE               = 193, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_NOT_CAMPED                 = 194, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_SI_FAILURE                 = 195, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_CONN_REJECT                = 196, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_NORMAL                             = 197, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_RLF                                = 198, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_CRE_FAILURE                        = 199, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_OOS_DURING_CRE                     = 200, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_ABORTED                            = 201, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_SIB_READ_ERROR                     = 202, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_ABORTED_IRAT_SUCCESS               = 203, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_RADIO_LINK_FAILURE                          = 204, 
+    QL_VOICE_END_REASON_AS_REJ_DETACH_WITH_REATTACH_LTE_NW_DETACH               = 205, 
+    QL_VOICE_END_REASON_AS_REJ_DETACH_WITH_OUT_REATTACH_LTE_NW_DETACH           = 206, 
+    QL_VOICE_END_REASON_BAD_REQ_WAIT_INVITE                                     = 207, 
+    QL_VOICE_END_REASON_BAD_REQ_WAIT_REINVITE                                   = 208, 
+    QL_VOICE_END_REASON_INVALID_REMOTE_URI                                      = 209, 
+    QL_VOICE_END_REASON_REMOTE_UNSUPP_MEDIA_TYPE                                = 210, 
+    QL_VOICE_END_REASON_PEER_NOT_REACHABLE                                      = 211, 
+    QL_VOICE_END_REASON_NETWORK_NO_RESP_TIME_OUT                                = 212, 
+    QL_VOICE_END_REASON_NETWORK_NO_RESP_HOLD_FAIL                               = 213, 
+    QL_VOICE_END_REASON_DATA_CONNECTION_LOST                                    = 214, 
+    QL_VOICE_END_REASON_UPGRADE_DOWNGRADE_REJ                                   = 215, 
+    QL_VOICE_END_REASON_SIP_403_FORBIDDEN                                       = 216, 
+    QL_VOICE_END_REASON_NO_NETWORK_RESP                                         = 217, 
+    QL_VOICE_END_REASON_UPGRADE_DOWNGRADE_FAILED                                = 218, 
+    QL_VOICE_END_REASON_UPGRADE_DOWNGRADE_CANCELLED                             = 219, 
+    QL_VOICE_END_REASON_SSAC_REJECT                                             = 220, 
+    QL_VOICE_END_REASON_THERMAL_EMERGENCY                                       = 221, 
+    QL_VOICE_END_REASON_1XCSFB_SOFT_FAILURE                                     = 222, 
+    QL_VOICE_END_REASON_1XCSFB_HARD_FAILURE                                     = 223, 
+    QL_VOICE_END_REASON_CONNECTION_EST_FAILURE                                  = 224, 
+    QL_VOICE_END_REASON_CONNECTION_FAILURE                                      = 225, 
+    QL_VOICE_END_REASON_RRC_CONN_REL_NO_MT_SETUP                                = 226, 
+    QL_VOICE_END_REASON_ESR_FAILURE                                             = 227, 
+    QL_VOICE_END_REASON_MT_CSFB_NO_RESPONSE_FROM_NW                             = 228, 
+    QL_VOICE_END_REASON_BUSY_EVERYWHERE                                         = 229, 
+    QL_VOICE_END_REASON_ANSWERED_ELSEWHERE                                      = 230, 
+    QL_VOICE_END_REASON_RLF_DURING_CC_DISCONNECT                                = 231, 
+    QL_VOICE_END_REASON_TEMP_REDIAL_ALLOWED                                     = 232, 
+    QL_VOICE_END_REASON_PERM_REDIAL_NOT_NEEDED                                  = 233, 
+    QL_VOICE_END_REASON_MERGED_TO_CONFERENCE                                    = 234, 
+    QL_VOICE_END_REASON_LOW_BATTERY                                             = 235, 
+    QL_VOICE_END_REASON_CALL_DEFLECTED                                          = 236, 
+    QL_VOICE_END_REASON_RTP_RTCP_TIMEOUT                                        = 237, 
+    QL_VOICE_END_REASON_RINGING_RINGBACK_TIMEOUT                                = 238, 
+    QL_VOICE_END_REASON_REG_RESTORATION                                         = 239, 
+    QL_VOICE_END_REASON_CODEC_ERROR                                             = 240, 
+    QL_VOICE_END_REASON_UNSUPPORTED_SDP                                         = 241, 
+    QL_VOICE_END_REASON_RTP_FAILURE                                             = 242, 
+    QL_VOICE_END_REASON_QoS_FAILURE                                             = 243, 
+    QL_VOICE_END_REASON_MULTIPLE_CHOICES                                        = 244, 
+    QL_VOICE_END_REASON_MOVED_PERMANENTLY                                       = 245, 
+    QL_VOICE_END_REASON_MOVED_TEMPORARILY                                       = 246, 
+    QL_VOICE_END_REASON_USE_PROXY                                               = 247, 
+    QL_VOICE_END_REASON_ALTERNATE_SERVICE                                       = 248, 
+    QL_VOICE_END_REASON_ALTERNATE_EMERGENCY_CALL                                = 249, 
+    QL_VOICE_END_REASON_UNAUTHORIZED                                            = 250, 
+    QL_VOICE_END_REASON_PAYMENT_REQUIRED                                        = 251, 
+    QL_VOICE_END_REASON_METHOD_NOT_ALLOWED                                      = 252, 
+    QL_VOICE_END_REASON_NOT_ACCEPTABLE                                          = 253, 
+    QL_VOICE_END_REASON_PROXY_AUTHENTICATION_REQUIRED                           = 254, 
+    QL_VOICE_END_REASON_GONE                                                    = 255, 
+    QL_VOICE_END_REASON_REQUEST_ENTITY_TOO_LARGE                                = 256, 
+    QL_VOICE_END_REASON_REQUEST_URI_TOO_LARGE                                   = 257, 
+    QL_VOICE_END_REASON_UNSUPPORTED_URI_SCHEME                                  = 258, 
+    QL_VOICE_END_REASON_BAD_EXTENSION                                           = 259, 
+    QL_VOICE_END_REASON_EXTENSION_REQUIRED                                      = 260, 
+    QL_VOICE_END_REASON_INTERVAL_TOO_BRIEF                                      = 261, 
+    QL_VOICE_END_REASON_CALL_OR_TRANS_DOES_NOT_EXIST                            = 262, 
+    QL_VOICE_END_REASON_LOOP_DETECTED                                           = 263, 
+    QL_VOICE_END_REASON_TOO_MANY_HOPS                                           = 264, 
+    QL_VOICE_END_REASON_ADDRESS_INCOMPLETE                                      = 265, 
+    QL_VOICE_END_REASON_AMBIGUOUS                                               = 266, 
+    QL_VOICE_END_REASON_REQUEST_TERMINATED                                      = 267, 
+    QL_VOICE_END_REASON_NOT_ACCEPTABLE_HERE                                     = 268, 
+    QL_VOICE_END_REASON_REQUEST_PENDING                                         = 269, 
+    QL_VOICE_END_REASON_UNDECIPHERABLE                                          = 270, 
+    QL_VOICE_END_REASON_SERVER_INTERNAL_ERROR                                   = 271, 
+    QL_VOICE_END_REASON_NOT_IMPLEMENTED                                         = 272, 
+    QL_VOICE_END_REASON_BAD_GATEWAY                                             = 273, 
+    QL_VOICE_END_REASON_SERVER_TIME_OUT                                         = 274, 
+    QL_VOICE_END_REASON_VERSION_NOT_SUPPORTED                                   = 275, 
+    QL_VOICE_END_REASON_MESSAGE_TOO_LARGE                                       = 276, 
+    QL_VOICE_END_REASON_DOES_NOT_EXIST_ANYWHERE                                 = 277, 
+    QL_VOICE_END_REASON_SESS_DESCR_NOT_ACCEPTABLE                               = 278, 
+    QL_VOICE_END_REASON_SRVCC_END_CALL                                          = 279, 
+    QL_VOICE_END_REASON_INTERNAL_ERROR                                          = 280, 
+    QL_VOICE_END_REASON_SERVER_UNAVAILABLE                                      = 281, 
+    QL_VOICE_END_REASON_PRECONDITION_FAILURE                                    = 282, 
+    QL_VOICE_END_REASON_DRVCC_IN_PROG                                           = 283, 
+    QL_VOICE_END_REASON_DRVCC_END_CALL                                          = 284, 
+    QL_VOICE_END_REASON_CS_HARD_FAILURE                                         = 285, 
+    QL_VOICE_END_REASON_CS_ACQ_FAILURE                                          = 286, 
+    QL_VOICE_END_REASON_FALLBACK_TO_CS                                          = 287, 
+    QL_VOICE_END_REASON_DEAD_BATTERY                                            = 288, 
+    QL_VOICE_END_REASON_HO_NOT_FEASIBLE                                         = 289, 
+    QL_VOICE_END_REASON_PDN_DISCONNECTED                                        = 290, 
+    QL_VOICE_END_REASON_REJECTED_ELSEWHERE                                      = 291, 
+    QL_VOICE_END_REASON_CALL_PULLED                                             = 292, 
+    QL_VOICE_END_REASON_CALL_PULL_OUT_OF_SYNC                                   = 293, 
+    QL_VOICE_END_REASON_HOLD_RESUME_FAILED                                      = 294, 
+    QL_VOICE_END_REASON_HOLD_RESUME_CANCELED                                    = 295, 
+    QL_VOICE_END_REASON_REINVITE_COLLISION                                      = 296, 
+    QL_VOICE_END_REASON_1XCSFB_MSG_INVAILD                                      = 297, 
+    QL_VOICE_END_REASON_1XCSFB_MSG_IGNORE                                       = 298, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_ACQ_FAIL                                    = 299, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_REL_ORDER                          = 300, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_REORDER                            = 301, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_INTERCEPT_ORDER                    = 302, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_NORMAL                             = 303, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_SO_REJ                             = 304, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_OTASP_SPC_ERR                      = 305, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_SRCH_TT_FAIL                             = 306, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_TCH_INIT_FAIL                            = 307, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_FAILURE_USER_CALL_END                    = 308, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_FAILURE_RETRY_EXHAUST                    = 309, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_FAILURE_CALL_REL_REG_REJ                 = 310, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_FAILURE_CALL_REL_NW_REL_ODR              = 311, 
+    QL_VOICE_END_REASON_1XCSFB_HO_FAILURE                                       = 312, 
+    QL_VOICE_END_REASON_EMM_REJ_TIMER_T3417_EXT_EXP                             = 313, 
+    QL_VOICE_END_REASON_EMM_REJ_TIMER_T3417_EXP                                 = 314, 
+    QL_VOICE_END_REASON_EMM_REJ_SERVICE_REQ_FAILURE_LTE_NW_REJECT               = 315, 
+    QL_VOICE_END_REASON_EMM_REJ_SERVICE_REQ_FAILURE_CS_DOMAIN_NOT_AVAILABLE     = 316, 
+    QL_VOICE_END_REASON_EMM_REJ                                                 = 317, 
+} QL_VOICE_END_REASON_E;
+
+typedef struct 
+{
+    uint32_t                id;
+    char                    number[QL_VOICE_MAX_PHONE_NUMBER + 1];
+    QL_VOICE_STATE_E        state;
+    QL_VOICE_TECH_E         tech;
+    QL_VOICE_DIR_E          dir;
+    QL_VOICE_END_REASON_E   end_reason;
+} ql_voice_record_t;
+
+typedef struct
+{
+    int len;    /**< length of records */
+    ql_voice_record_t records[QL_VOICE_MAX_RECORDS];
+} ql_voice_record_array_t;
+
+typedef void (*ql_voice_call_cb_f)(ql_voice_record_array_t *p_arr);
+
+typedef enum
+{
+    QL_VOICE_DTMF_EVENT_REV_BURST               = 0x00, /**< Sends a CDMA-burst DTMF \n  */
+    QL_VOICE_DTMF_EVENT_REV_START_CONT          = 0x01, /**< Starts a continuous DTMF tone \n  */
+    QL_VOICE_DTMF_EVENT_REV_STOP_CONT           = 0x02, /**< Stops a continuous DTMF tone \n  */
+    QL_VOICE_DTMF_EVENT_FWD_BURST               = 0x03, /**< Received a CDMA-burst DTMF message \n  */
+    QL_VOICE_DTMF_EVENT_FWD_START_CONT          = 0x04, /**< Received a start-continuous DTMF tone order \n  */
+    QL_VOICE_DTMF_EVENT_FWD_STOP_CONT           = 0x05, /**< Received a stop-continuous DTMF tone order \n  */
+    QL_VOICE_DTMF_EVENT_IP_INCOMING_DTMF_START  = 0x06, /**< Received an IP-start continuous DTMF message \n  */
+    QL_VOICE_DTMF_EVENT_IP_INCOMING_DTMF_STOP   = 0x07, /**< Received an IP-stop continuous DTMF message  */
+} QL_VOICE_DTMF_EVENT_E;
+
+/** voice dtmf event callback */
+typedef void (*ql_voice_dtmf_cb_f)(uint32_t id, QL_VOICE_DTMF_EVENT_E event, 
+                                        char *digits, int len); /**< len: length of digits */
+
+/** forwarding condition */
+typedef enum
+{
+    QL_VOICE__FW_COND_UNCONDITIONALLY = 0, /**<  Unconditional call forwarding. */
+    QL_VOICE__FW_COND_MOBILEBUSY      = 1, /**<  Forward when the mobile device is busy. */
+    QL_VOICE__FW_COND_NOREPLY         = 2, /**<  Forward when there is no reply. */
+    QL_VOICE__FW_COND_UNREACHABLE     = 3, /**<  Forward when the call is unreachable. */
+    QL_VOICE__FW_COND_ALLFORWARDING   = 4, /**<  All forwarding(0-3).*/
+    QL_VOICE__FW_COND_ALLCONDITIONAL  = 5, /**<  All conditional forwarding(1-3). */
+} QL_VOICE_FW_COND_E;
+
+typedef enum
+{
+    QL_VOICE_FW_TYPE_VOICE         = 0, /**<  Forwarding Voice. */
+    QL_VOICE_FW_TYPE_DATA          = 1, /**<  Forwarding Data. */
+    QL_VOICE_FW_TYPE_VOICE_DATA    = 2, /**<  Forwarding voice and data. */
+} QL_VOICE_FW_TYPE_E;
+
+/** */
+typedef enum {
+  QL_VOICE_PRIMARY_SUBSCRIPTION      = 0, 
+  QL_VOICE_SECONDARY_SUBSCRIPTION    = 1, 
+} QL_VOICE_SUBSCRIPTION_E;
+
+typedef struct 
+{
+    int enabled;
+    int len;    /**< length of details  */
+    struct {
+        QL_VOICE_FW_TYPE_E type;
+        char number[QL_VOICE_MAX_PHONE_NUMBER + 1];
+    } details[QL_VOICE_MAX_FW_DETAIL_LENGTH];
+} ql_voice_fw_status_t;
+
+typedef enum
+{
+    QL_VOICE_ECALL_TYPE_TEST        = 1, /**<  Test eCall */
+    QL_VOICE_ECALL_TYPE_EMERGENCY   = 2, /**<  Emergency eCall */
+    QL_VOICE_ECALL_TYPE_RECONFIG    = 3, /**<  Reconfig eCall */
+} QL_VOICE_ECALL_TYPE_E;
+
+typedef struct 
+{
+    uint32_t msd_len;                       /**< Length of Minimum Set of Data */
+    uint8_t msd[QL_VOICE_MAX_ECALL_MSD];    /**< Minimum Set of Data */
+    QL_VOICE_ECALL_TYPE_E type;             /**< eCall type */
+    int auto_trigger;                       /**< 0 - Manually trigger eCall
+                                                 1 - Automatically trigger eCall */
+    char test_number[QL_VOICE_MAX_PHONE_NUMBER]; /**< Test number */
+} ql_voice_ecall_info_t;
+
+/** eCall state */
+typedef enum {
+    QL_VOICE_ECALL_STATE_NONE                   = -1,
+    QL_VOICE_ECALL_STATE_INACTIVE               = 0, 
+    QL_VOICE_ECALL_STATE_ORIGINATING_CALL       = 1, 
+    QL_VOICE_ECALL_STATE_IN_CALL_TRANSMITTING   = 2, /**<  ECALL APP TRANSMITTING */
+    QL_VOICE_ECALL_STATE_WAITING_FOR_AL_ACK     = 3, 
+    QL_VOICE_ECALL_STATE_IN_CALL                = 4, 
+    QL_VOICE_ECALL_STATE_IDLE_ALLOW_MT_ECALL    = 5, 
+} QL_VOICE_ECALL_STATE_E;
+
+/** eCall mode */
+typedef enum {
+    QL_VOICE_ECALL_MODE_NORMAL  = 0, /**< eCall enabled normal mode. */
+    QL_VOICE_ECALL_MODE_ONLY    = 1, /**< eCall-only mode. */
+    QL_VOICE_ECALL_MODE_DEFAULT = 2,
+} QL_VOICE_ECALL_MODE_E;
+
+/** eCall configuration */
+typedef struct 
+{
+    uint8_t enable;                 /**<  Enable or disable ecall: 0 -- Disable; 1 -- Enable */
+    uint8_t voice_mute;             /**<  Enable or disable to mute IVS speaker in MSD
+                                          0 - Disable to mute IVS speaker automatical in MSD transmission
+                                          1 - Enable to mute IVS speaker automatical in MSD transmission */
+    QL_VOICE_ECALL_MODE_E mode;     /**<  The Ecall mode. */
+    uint8_t report_event;           /**<  Enable or disable to report ecall event info.   
+                                          0 - Disable; 
+                                          1 - Enable */
+    uint16_t start_timer;           /**<  The timer of IVS waiting for "START". T5 */
+    uint16_t hack_timer;            /**<  The timer of IVS waiting for "HACK". T6 */
+    uint16_t trans_timer;           /**<  The timer of MSD transmission. T7 */
+    uint8_t fail_redial;            /**<  The dial fail times. */
+    uint8_t drop_redial;            /**<  The ecall abnormal disconnenct redial times. */
+    uint16_t cleardown_timer;       /**<  The timer of IVS waiting for "ClearDown". T2 */
+    uint16_t init_timer;            /**<  The timer of IVS waiting for "InitIATION". T3 */
+    uint16_t nad_reg_timer;         /**<  The timer of IVS waiting for "NAD Registration". T9*/
+    uint16_t nad_dereg_timer;       /**<  The timer of IVS waiting for "NAD Deregistration". T10*/
+    uint8_t standard;               /**<  The ecall system standard.
+                                          0 - EU; 
+                                          1 - ERA_GLONASS */
+    uint16_t era_glonass_redial;    /**<  The timer of era glonass redial times.*/
+    uint16_t auto_answer;           /**<  The timer of AUTO ANSWER times.*/
+} ql_voice_ecall_config_t;
+
+/** eCall config items */
+typedef enum
+{
+    QL_VOICE_ECALL_CONFIG_ENABLE                = (1 << 0),
+    QL_VOICE_ECALL_CONFIG_VOICE_MUTE            = (1 << 1),
+    QL_VOICE_ECALL_CONFIG_MODE                  = (1 << 2),
+    QL_VOICE_ECALL_CONFIG_REPORT_EVENT          = (1 << 3),
+    QL_VOICE_ECALL_CONFIG_START_TIMER           = (1 << 4),
+    QL_VOICE_ECALL_CONFIG_HACK_TIMER            = (1 << 5),
+    QL_VOICE_ECALL_CONFIG_TRANS_TIMER           = (1 << 6),
+    QL_VOICE_ECALL_CONFIG_FAIL_REDIAL           = (1 << 7),
+    QL_VOICE_ECALL_CONFIG_DROP_REDIAL           = (1 << 8),
+    QL_VOICE_ECALL_CONFIG_CLEARDOWN_TIMER       = (1 << 9),
+    QL_VOICE_ECALL_CONFIG_INIT_TIMER            = (1 << 10),
+    QL_VOICE_ECALL_CONFIG_NAD_REG_TIMER         = (1 << 11),
+    QL_VOICE_ECALL_CONFIG_NAD_DEREG_TIMER       = (1 << 12),
+    QL_VOICE_ECALL_CONFIG_STANDARD              = (1 << 13),
+    QL_VOICE_ECALL_CONFIG_ERA_GLONASS_REDIAL    = (1 << 14),
+    QL_VOICE_ECALL_CONFIG_AUTO_ANSWER           = (1 << 15),
+} QL_VOICE_ECALL_CONFIG_E;
+
+/** eCall MSD transmission status */
+typedef enum {
+    QL_VOICE_ECALL_MSD_TRANS_STATUS_NONE      = -1, /**< NONE */
+    QL_VOICE_ECALL_MSD_TRANS_STATUS_SUCCESS   = 0,  /**< Success */
+    QL_VOICE_ECALL_MSD_TRANS_STATUS_FAILURE   = 1,  /**< Generic failure */
+} QL_VOICE_ECALL_MSD_TRANS_STATUS_E;
+
+typedef void (*ql_voice_ecall_status_cb_f)(uint32_t id, 
+                                                   QL_VOICE_ECALL_MSD_TRANS_STATUS_E status);
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_FAIL_NONE                          = 0, 
+    /**< NONE*/
+    QL_VOICE_ECALL_EVENT_FAIL_TIMEOUT                       = 1, 
+    /**<  Wait for START timeout. */
+    QL_VOICE_ECALL_EVENT_FAIL_HACK_TIMEOUT                  = 2, 
+    /**<  Wait for HACK timeout. */
+    QL_VOICE_ECALL_EVENT_FAIL_MSD_TRANS_TIMEOUT             = 3, 
+    /**<  MSD transmission timeout. */
+    QL_VOICE_ECALL_EVENT_FAIL_IVS_RESET_TIMEOUT             = 4, 
+    /**<  IVS reset. */
+    QL_VOICE_ECALL_EVENT_FAIL_CLEAR_DOWN_FALLBACK_TIMEOUT   = 5, 
+    /**<  clear down fallback timeout. */
+    QL_VOICE_ECALL_EVENT_FAIL_IVS_INITIATION_TIMEOUT        = 6, 
+    /**<  IVS initiation timeout. */
+} QL_VOICE_ECALL_EVENT_FAIL_E;
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_NONE = 0, 
+    /**< NONE*/
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_START_RECEIVED_MSD = 1,
+    /**<  IVS Link Layer receives START message and starts to send MSD */
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_NACK_RECEIVED = 2, 
+    /**<  IVS Link Layer receives NACK message. */
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_ACK_RECEIVED = 3, 
+    /**<  IVS Link Layer receives the first LACK message. */
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_TX_COMPLETED = 4, 
+    /**<  IVS MSD transmission is complete. */
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_HLACK_RECEIVED = 5, 
+    /**<  IVS Link Layer receives first HACK message. */
+} QL_VOICE_ECALL_EVENT_PROCESS_E;
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_MSDUPADTE_NONE                     = -1, 
+    /**< NONE */
+    QL_VOICE_ECALL_EVENT_MSDUPDATE_IVS_UPDATING_MSD         = 0, 
+    /**<  Indicates MSD has been updated. */
+    QL_VOICE_ECALL_EVENT_MSDUPDATE_PSAP_REQURE_UPDATE_MSD   = 1, 
+    /**<  Indicate to update MSD in 5 seconds. */
+    QL_VOICE_ECALL_EVENT_MSDUPDATE_IVS_UPDATE_MSD_TIMEOUT   = 2, 
+    /**<  Indicate timeout of updating MSD and module starts to transfer the old MSD. */
+} QL_VOICE_ECALL_EVENT_MSDUPDATE_E;
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_ESTABLISH_NONE = -1, 
+    /**< NONE */
+    QL_VOICE_ECALL_EVENT_ESTABLISH_SUCCESS = 0,
+    /**<  Establish eCall successfully. */
+    QL_VOICE_ECALL_EVENT_ESTABLISH_FAIL = 1, 
+    /**<  Establish eCall fails. */
+} QL_VOICE_ECALL_EVENT_ESTABLISH_E;
+
+typedef struct {
+    uint8_t ori_remainder_times;
+    /**< Originate fail remainder times*/
+
+    uint16_t time;
+    /**< The minimum time duration between the previous call attempt */
+} ql_voice_ecall_event_originate_fail_redial_t;  /* Type */
+
+typedef struct {
+    uint8_t drop_remainder_times;
+    /**< Dorp remainder times*/
+
+    uint16_t time;
+    /**< The minimum time duration between the previous call attempt */
+} ql_voice_ecall_event_drop_redial_t;  /* Type */
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_NONE                  = -1, 
+    /**< NONE*/
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_START_RECV_SYN        = 0, 
+    /**<  eCall start recevied synchronization. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_T9_TIMEOUT            = 1, 
+    /**<  eCall T9 TIMEOUT. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_T10_TIMEOUT           = 2,
+    /**<  eCall T10 TIMEOUT. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_IVS_ALACK_RECEIVED    = 3, 
+    /**<  IVS receives ALACK message. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_IVS_LLACK_RECEIVED    = 4, 
+    /**<  IVS receives LLACK message. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_STOPPED               = 5, 
+    /**<  IVS receives STOPPED message. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_ANSWERING_INCOMING_PSAP_ECALL = 6, 
+    /**<  IVS AUTO ANSWERING INCOMING PSAP ECALL. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_CLEARDOWN_RECEIVED    = 7, 
+    /**<  IVS receives CLEARDOWN message. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_CALLBACK_TIMEOUT      = 8, 
+    /**<  eCall CALLBACK TIMEOUT. */
+    QL_VOICE_ECALL_EVENT_IVS_NORMAL_CLEARING                = 9,
+    /**<  eCall IVS NORAML CLEATING. */
+    QL_VOICE_ECALL_EVENT_IVS_ABNORMAL_CLEARING              = 10,
+    /**<  eCall IVS ABNORAML CLEATING. */
+} QL_VOICE_ECALL_EVENT_EXTEND_STATE_E;
+
+/** eCall event */
+typedef struct
+{
+    QL_VOICE_ECALL_EVENT_FAIL_E fail;
+    /**< Event of eCall Failed.*/
+    QL_VOICE_ECALL_EVENT_PROCESS_E process;
+    /**< Event of eCall process.*/
+    QL_VOICE_ECALL_EVENT_MSDUPDATE_E msdupdate;
+    /**< Event of ecall msd update.*/
+    QL_VOICE_ECALL_EVENT_ESTABLISH_E establish;
+    /**< Event of eCall establish.*/
+    uint16_t hack_code;
+    /**< Event of eCall hack code.*/
+    ql_voice_ecall_event_originate_fail_redial_t ori_redial;
+    /**< Event of originate fail and redial.*/
+    ql_voice_ecall_event_drop_redial_t drop_redial;
+    /**< Event of drop and redial.*/
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_E extend_state;
+    /**< Event of eCall other state.*/
+} ql_voice_ecall_event_t;
+
+typedef void (*ql_voice_ecall_event_cb_f)(ql_voice_ecall_event_t *p_event);
+
+typedef void (*ql_voice_service_error_cb_f)(int error);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Initializes voice service.
+  @return Whether the voice service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes voice service.
+  @return Whether the voice service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Dials a call.
+  @param[in] num    phone number to dial.
+  @param[in] len    length of phone number, should be less than 
+                    or euqnal to QL_VOICE_MAX_PHONE_NUMBER.
+  @param[out] id    call id.
+  @return Whether a voice call was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_dial(char *num, int len, uint32_t *id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Cancels dialing with given id.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully cancelled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_cancel_dial(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  hangup all dialing.
+  @return Whether all voice call were successfully hangup.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_hangup_all(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Answers the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully answered.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_answer(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Hangs up the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_hangup(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Holds the call when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully held.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_hold(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Releases the call from hold when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully unheld.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_unhold(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets call records.
+  @param[in] p_arr  pointer to ql_voice_record_array_t.
+  @return Whether the call records were successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_get_records(ql_voice_record_array_t *p_arr);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Registers or Unregisters forwarding.
+  @param[in] reg    0 - unregister, 1 - register.
+  @param[in] cond   forwarding condition.
+  @param[in] num    phone number.
+  @param[in] len    length of phone numebr.
+  @return Whether the voice call forward was registered or unregistered successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_forwarding(int reg, QL_VOICE_FW_COND_E cond, char *num, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets forwarding status.
+  @param[in]  cond      forwarding condition.
+  @param[out] p_status  pointer to ql_voice_fw_status_t.
+  @return Whether the voice call forward status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_get_forwarding_status(QL_VOICE_FW_COND_E cond, ql_voice_fw_status_t *p_status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Enables or disables call waiting.
+  @param[in] enable 0 - disable, other - enable.
+  @return Whether the voice call waiting was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_waiting(int enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets call waiting status.
+  @param[out] enabled 0 - waiting is disabled, 1 - waiting is enabled.
+  @return Whether the voice call waiting status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_get_waiting_status(int *enabled);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Enables or disables auto answer.
+  @param[in] enable 0 - disable, other - enable.
+  @param[in] sec    wait this `sec' seconds before auto answer.
+  @return Whether the voice call autoanswer was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_autoanswer(int enable, uint32_t sec);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends a DTMF(Dual Tone Multi Frequency) character over the call ID.
+  @param[in] id call id returned from dial.
+  @param[in] c DTMF character to be sent. Valid DTMF characters are 0-9, A-D, '*', '#'.
+  @return Whether a DTMF character was successfully sent.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_send_dtmf_char(uint32_t id, char c);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets voice call callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_set_call_cb(ql_voice_call_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets voice dtmf callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call DTMF repcetion callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_set_dtmf_cb(ql_voice_dtmf_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Dials eCall.
+  @param[in] p_info eCall info.
+  @return Whether a eCall was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_dial(ql_voice_ecall_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Hangs up eCall.
+  @return Whether the eCall was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_hangup(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Updates eCall MSD.
+  @param[in] msd Minimum Set of Data.
+  @param[in] msd_len Length of Minimum Set of Data.
+  @return Whether the eCall MSD was successfully updated.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_update_msd(const uint8_t *msd, uint32_t msd_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Pushes eCall MSD.
+  @param[out] state eCall state.
+  @return Whether the eCall MSD was successfully pushed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_push_msd(QL_VOICE_ECALL_STATE_E *state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets eCall config.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_get_config(ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall config.
+  @param[in] item Items to set.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_set_config(int item, ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall event callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall event callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_set_event_cb(ql_voice_ecall_event_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall status callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall status callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_set_status_cb(ql_voice_ecall_status_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_set_service_error_cb(ql_voice_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Binds the current control point to a specific subscription.
+  @param[in] sub  Subscription type.
+  @return Whether the subscription was successfully bound.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_bind_subscription(QL_VOICE_SUBSCRIPTION_E sub);
+
diff --git a/mbtk/include/ql_v2/ql_wifi.h b/mbtk/include/ql_v2/ql_wifi.h
new file mode 100755
index 0000000..90c6424
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_wifi.h
@@ -0,0 +1,1172 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_wifi.h
+  @brief  Wi-Fi service API
+
+  @detailes
+  Quectel  series module Wi-Fi service.
+
+  @htmlonly
+  <span style="font-weight: bold">History</span>
+  @endhtmlonly
+
+  when       |   who       |    what, where, why
+  --------   |   ---       |    ----------------------------------------------------------
+  2020-04-03 |   ewen.li   |    Created .
+  2021-11-08 |   ewen.li   |    Add Wi-Fi P2P API and callback function .
+
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+#ifndef __QL_WIFI_H__
+#define __QL_WIFI_H__
+
+#include "ql_wifi_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Wi-Fi enable status callback function.
+
+  @param[in]  pre_status: The previous Wi-Fi enable status.
+  @param[in]  status: The current Wi-Fi enable status.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_enable_status_ind_cb_f)(QL_WIFI_ENABLE_STATUS_E pre_status, QL_WIFI_ENABLE_STATUS_E status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  AP mode status callback function.
+
+  @param[in]  pre_status: The previous AP mode status.
+  @param[in]  p_msg: The current AP mode status information.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_ap_status_ind_cb_f)(QL_WIFI_AP_INDEX_E index, QL_WIFI_AP_STATUS_E pre_status, ql_wifi_ap_status_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  STA mode status callback function.
+
+  @param[in]  pre_status: The previous STA mode status.
+  @param[in]  p_msg: The current STA mode status information.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_sta_status_ind_cb_f)(QL_WIFI_STA_STATUS_E pre_status, ql_wifi_sta_status_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  STA scan results callback function.
+
+  @param[in]  p_msg: The information list of external hotspots.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_sta_scan_result_ind_cb_f)(ql_wifi_sta_scan_result_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This is a callback function for status of connection between AP and STA device.
+
+  @param[in]  index: The index of AP mode.
+  @param[in]  p_msg: The status of connection between AP and STA device.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_ap_sta_connect_ind_cb_f)(QL_WIFI_AP_INDEX_E index, ql_wifi_sta_connect_status_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Wi-Fi service error callback function.
+
+  @param[in]  error: Error code.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This is a callback function for status of P2P enable.
+
+  @param[in]  pre_status: The previous P2P enable status.
+  @param[in]  status: The current P2P enable status.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_p2p_enable_status_ind_cb_f)(QL_WIFI_P2P_ENABLE_STATUS_E pre_status, QL_WIFI_P2P_ENABLE_STATUS_E status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  The found p2p device callback function.
+
+  @param[in]  p_msg: The information of p2p device 
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_p2p_dev_found_ind_cb_f)(ql_wifi_p2p_found_dev_info_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Peer p2p device requesting connection callback function.
+
+  @param[in]  p_msg: The information of peer p2p device 
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_p2p_peer_dev_req_ind_cb_f)(ql_wifi_p2p_req_peer_dev_info_t *pmsg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  P2P status callback function.
+
+  @param[in]  pre_status: The previous P2P status.
+  @param[in]  status: The current P2P status information.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_p2p_status_ind_cb_f)(QL_WIFI_P2P_STATUS_E pre_status, ql_wifi_p2p_status_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function initializes Wi-Fi service.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_SERVICE_NOT_READY: Wi-Fi service is not ready. It is recommended to try again.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+
+  @note  Before other Wi-Fi APIs are used, this function must be called to initialize the Wi-Fi service.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function deinitializes Wi-Fi service.
+
+  @retval  QL_ERR_OK: Successful execution.
+           Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the country code of wlan driver
+
+  @param[in]  country_code: The country code to be set. The country code cannot exceed 2 bytes and is not empty. For example,  CN represents China.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+
+  @note  Before calling the ql_wifi_enable(), call this function firstly to set country code,
+         If this function is not called, The country code "CN" will be used by default.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_country_code_set(const char *country_code);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the country code of wlan driver.
+
+  @param[out]  country_code_buf: The buffer for storing the current country code. The buffer size is recommended to be 3 bytes.
+  @param[in]   The length of buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_country_code_get(char *country_code_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function enables Wi-Fi function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_enable(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function disables Wi-Fi function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_disable(void);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function set bridge function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_set_bridge(char *bridge);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers Wi-Fi enable status callback function.
+
+  @param[in]  cb: The Wi-Fi enable status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_set_enable_status_ind_cb(ql_wifi_enable_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the Wi-Fi working mode.
+
+  @param[in]  mode: The Wi-Fi working mode to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_work_mode_set(QL_WIFI_WORK_MODE_E mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the current Wi-Fi working mode.
+
+  @param[out]  p_mode: The current Wi-Fi working mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_work_mode_get(QL_WIFI_WORK_MODE_E *p_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the SSID in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  ssid: The SSID to be set. It should be within 32 bytes and is not empty.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_ssid_set(QL_WIFI_AP_INDEX_E idx, const char *ssid);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the SSID in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  ssid_buf: The buffer for storing the current SSID, the buffer size is recommended to be 33 bytes.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_ssid_get(QL_WIFI_AP_INDEX_E idx, char *ssid_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the SSID hiding status in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  ssid_hidden: The SSID hiding status to be set.
+                           0: The SSID is not hidden.
+                           1: The SSID is hidden.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_ssid_hidden_set(QL_WIFI_AP_INDEX_E idx, int ssid_hidden);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the SSID hiding status in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[out]  p_ssid_hidden: The current SSID hiding status in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_ssid_hidden_get(QL_WIFI_AP_INDEX_E idx, int *p_ssid_hidden);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the working protocol mode in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  mode: The working protocol mode to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_mode_set(QL_WIFI_AP_INDEX_E idx, QL_WIFI_AP_MODE_TYPE_E mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the working protocol mode in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_mode: The current working protocol mode in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_mode_get(QL_WIFI_AP_INDEX_E idx, QL_WIFI_AP_MODE_TYPE_E *p_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the bandwidth in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  bandwidth: The bandwidth to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_bandwidth_set(QL_WIFI_AP_INDEX_E idx, QL_WIFI_BANDWIDTH_E bandwidth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the bandwidth in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_bandwidth: The current bandwidth in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_bandwidth_get(QL_WIFI_AP_INDEX_E idx, QL_WIFI_BANDWIDTH_E *p_bandwidth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the channel in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  channel: The channel to be set.
+                       0: Adaptive
+                       1/2/3/4/5/6/7/8/9/10/11/12/13/14: 2.4G channel.
+                       36/40/44/48/52/56/60/64/100/104/108/112/116/120/124/128/132/136/140/144/149/153/157/161/165: 5GHZ channel.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_channel_set(QL_WIFI_AP_INDEX_E idx, int channel);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the channel in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[out]  p_channel: The currently-used channel in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_channel_get(QL_WIFI_AP_INDEX_E idx, int *p_channel);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the maximum number of terminal connections in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  max_sta_num: The maximum number of terminal connections in AP mode to be set. Range: 1~32.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_max_sta_num_set(QL_WIFI_AP_INDEX_E idx, int max_sta_num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the maximum number of terminal connections in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[out]  p_max_sta_num: The current maximum number of terminal connections in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_max_sta_num_get(QL_WIFI_AP_INDEX_E idx, int *p_max_sta_num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the country code in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  country_code: The country code to be set. The country code cannot exceed 2 bytes and is not empty. For example,  CN represents China.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_country_code_set(QL_WIFI_AP_INDEX_E idx, const char *country_code);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the country code in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  country_code_buf: The buffer for storing the current country code. The buffer size is recommended to be 3 bytes.
+  @param[in]   The length of buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_country_code_get(QL_WIFI_AP_INDEX_E idx, char *country_code_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the AP isolation state.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  isolate: AP isolation status to be set.
+                       0: AP is not isolated.
+                       1: AP is isolated.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_isolate_set(QL_WIFI_AP_INDEX_E idx, int isolate);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the AP isolation state.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_isolate: The current AP isolation status.
+                          0: AP is not isolated.
+                          1: AP is isolated.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_isolate_get(QL_WIFI_AP_INDEX_E idx, int *p_isolate);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets MAC address access rules in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  acl_rule: MAC address access rules to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_mac_acl_rule_set(QL_WIFI_AP_INDEX_E idx, QL_WIFI_MAC_ACL_RULE_E acl_rule);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets MAC address access rules in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_acl_rule: The current MAC address access rules.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_mac_acl_rule_get(QL_WIFI_AP_INDEX_E idx, QL_WIFI_MAC_ACL_RULE_E *p_acl_rule);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function adds or deletes the specified MAC address for the current MAC address access rule.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  cmd: MAC address operation command.
+  @param[in]  macaddr: MAC address to be added or deleted., The format of MAC address 
+                       must be %02X:%02X:%02X:%02X:%02X:%02X, For example: 1A:2B:3C:4D:56:78.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_acl_mac_set(QL_WIFI_AP_INDEX_E idx, QL_WIFI_ACL_MAC_CMD_E cmd, const char *macaddr);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets all MAC addresses in the current MAC address access rule.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_mac_list: MAC address list.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_acl_mac_get(QL_WIFI_AP_INDEX_E idx, ql_wifi_acl_mac_list_t *p_mac_list);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the authentication in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  p_auth: The authentication information to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_auth_set(QL_WIFI_AP_INDEX_E idx, ql_wifi_ap_auth_t *p_auth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the authentication information in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_auth: The current authentication information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_auth_get(QL_WIFI_AP_INDEX_E idx, ql_wifi_ap_auth_t *p_auth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the AP mode status callback function.
+
+  @param[in]  cb: The AP mode status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_set_status_ind_cb(ql_wifi_ap_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function starts the AP function.
+
+  @param[in]  index: The index of AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_start(QL_WIFI_AP_INDEX_E index);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function stops the AP function.
+
+  @param[in]  index: The index of AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_stop(QL_WIFI_AP_INDEX_E index);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the AP mode status information.
+
+  @param[in]   index: The index of AP mode.
+  @param[out]  p_sta: The current AP mode status information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_get_status(QL_WIFI_AP_INDEX_E index, ql_wifi_ap_status_t *p_sta);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the SSID in STA mode.
+
+  @param[in]  ssid: The SSID to be set. The SSID cannot exceed 32 bytes and is not empty.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_ssid_set(const char *ssid);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the SSID in STA mode.
+
+  @param[out]  ssid_buf: The buffer for storing the current SSID.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_ssid_get(char *ssid_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the authentication in STA mode.
+
+  @param[in]  p_auth: The authentication information to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_auth_set(ql_wifi_sta_auth_t *p_auth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the authentication information in STA mode.
+
+  @param[out]  p_auth: The current authentication information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_auth_get(ql_wifi_sta_auth_t *p_auth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the STA mode status callback function.
+
+  @param[in]  cb: The STA mode status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_set_status_ind_cb(ql_wifi_sta_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function starts the STA function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_start(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function stops the STA function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_stop(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the STA mode status information.
+
+  @param[out]  p_sta: The current STA mode status information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_get_status(ql_wifi_sta_status_t *p_sta);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function scans for external hotspots in STA mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_start_scan(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the scan result callback function.
+
+  @param[in]  cb: The scan result callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_set_scan_result_ind_cb(ql_wifi_sta_scan_result_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the callback function for status of connection between AP and STA device.
+
+  @param[in]  cb: The callback function for status of connection between AP and STA device.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_set_ap_sta_connect_ind_cb(ql_wifi_ap_sta_connect_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the Wi-Fi service error callback function.
+
+  @param[in]  cb: Wi-Fi service error callback function, executed only when the Wi-Fi service exits abnormally.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_set_service_error_cb(ql_wifi_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the P2P device name.
+
+  @param[in]  dev_name: The device name to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_name_set(const char *dev_name);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the P2P device name.
+
+  @param[out]  dev_name_buf: The buffer for storing the current device name.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_name_get(char *dev_name_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the P2P device type.
+
+  @param[in]  dev_type: The device type to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_type_set(const char *dev_type);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the P2P device type.
+
+  @param[out]  dev_type_buf: The buffer for storing the current device type.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_type_get(char *dev_type_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the operating class and operating channel in P2P mode.
+
+  @param[in]  oper_class:   The operating class to be set.
+  @param[in]  oper_channel: The operating channel to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+
+  @note  The operating class and operating channel can determine the center frequency,
+         The following are the corresponding values.
+     --------------------------------------------------------------------------------------------
+     |  oper_class  |       oper_channel        |          frequency          | channel spacing |
+     |-------------------------------------------------------------------------------------------
+     |      81      |           1-13            |   2407 + 5 * oper_channel   |      25MHz      |
+     |      82      |            14             |   2414 + 5 * oper_channel   |      25MHz      |
+     |      115     |        36,40,44,48        |   5000 + 5 * oper_channel   |      20MHz      |
+     |      116     |           36,44           |   5000 + 5 * oper_channel   |      40MHz      |
+     |      117     |           40,48           |   5000 + 5 * oper_channel   |      40MHz      |
+     |      124     |     149,153,157,161       |   5000 + 5 * oper_channel   |      20MHz      |
+     |      125     |    149,153,157,161,165    |   5000 + 5 * oper_channel   |      20MHz      |
+     |      126     |          149,157          |   5000 + 5 * oper_channel   |      40MHz      |
+     |      127     |          153,161          |   5000 + 5 * oper_channel   |      40MHz      |
+     --------------------------------------------------------------------------------------------
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_oper_class_channel_set(int oper_class, int oper_channel);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the operating class and operating channel in P2P mode.
+
+  @param[out]  p_oper_class:   The currently-used operating class in p2p mode.
+  @param[out]  p_oper_channel: The currently-used operating channel in p2p mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_oper_class_channel_get(int *p_oper_class, int *p_oper_channel);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the suffix of ssid.
+
+  @param[in]  ssid_postfix: The suffix of ssid to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_ssid_postfix_set(const char *ssid_postfix);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the suffix of ssid.
+
+  @param[out]  ssid_postfix_buf: The buffer for storing the current suffix of ssid.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_ssid_postfix_get(char *ssid_postfix_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the P2P enable status callback function.
+
+  @param[in]  cb: P2P enable status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_set_enable_status_ind_cb(ql_wifi_p2p_enable_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function enables P2P function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_enable(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function disables P2P function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_disable(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the found p2p device callback function.
+
+  @param[in]  cb: The found p2p device callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_set_dev_found_ind_cb(ql_wifi_p2p_dev_found_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function start finding P2P device.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_find_start(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function stop finding P2P device.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_find_stop(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets P2P mode status information.
+
+  @param[out]  p_status: The current P2P mode status information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_get_status(ql_wifi_p2p_status_t *p_status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the P2P status callback function.
+
+  @param[in]  cb: The P2P status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_set_status_ind_cb(ql_wifi_p2p_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers peer p2p device requesting connection callback function.
+
+  @param[in]  cb: Peer p2p device requesting connection callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_set_peer_dev_req_ind_cb(ql_wifi_p2p_peer_dev_req_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function establishes a P2P connection.
+
+  @param[in]  macaddr: The MAC address of peer P2P device.
+  @param[in]  wps_method: key words: "pbc", "pin" and pin_code, The pin_code is a string that 
+                          dynamically generated random from peer display.
+  @param[in]  go_intent: Degree of desire to be GO, range: 0-15.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_connect(const char *macaddr, const char *method, int go_intent);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function disconnects a P2P connection
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_disconnect(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_wifi_common.h b/mbtk/include/ql_v2/ql_wifi_common.h
new file mode 100755
index 0000000..1a67e60
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_wifi_common.h
@@ -0,0 +1,435 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_wifi_common.h
+  @brief  Wi-Fi common data struct
+
+  @detailes
+  Quectel series module Wi-Fi service.
+
+  @htmlonly
+  <span style="font-weight: bold">History</span>
+  @endhtmlonly
+
+  when       |   who       |    what, where, why
+  --------   |   ---       |    ----------------------------------------------------------
+  2020-04-03 |   ewen.li   |    Created .
+  2021-11-08 |   ewen.li   |    Add Wi-Fi P2P data structure .
+
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+#ifndef __QL_WIFI_COMMON_H__
+#define __QL_WIFI_COMMON_H__
+
+#include "ql_net_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define QL_WIFI_MAX_STA_NUM        (32)   /**< Maximum number of external STA device that can be connected in AP mode */
+#define QL_WIFI_MAX_ACL_MAC_CNT    (32)   /**< Maximum number of MAC address that can be set by access rule */
+#define QL_WIFI_MAX_SCAN_INFO_CNT  (60)   /**< Maximum number of AP information that can be scanned in STA mode */
+#define QL_WIFI_MAX_LONG_MSG_LEN_V01 4096
+#define IS_VALID_QL_WIFI_SSID_HIDDEN(hidden) ((0 == hidden) || (1 == hidden))
+#define IS_VALID_QL_WIFI_ISOLATE(isolate) ((0 == isolate) || (1 == isolate))
+#define IS_VALID_QL_WIFI_MAX_STA_NUM(max_sta) ((1 <= max_sta) && (QL_WIFI_MAX_STA_NUM >= max_sta))
+
+typedef enum QL_WIFI_WORK_MODE_ENUM
+{
+    QL_WIFI_WORK_MODE_MIN = -1,
+    QL_WIFI_WORK_MODE_STA = 0,       /**< STA mode */
+    QL_WIFI_WORK_MODE_AP0,           /**< Single AP mode */
+    QL_WIFI_WORK_MODE_MAX
+} QL_WIFI_WORK_MODE_E;
+#define IS_VALID_QL_WIFI_WORK_MODE(mode) ((mode>QL_WIFI_WORK_MODE_MIN) && (mode<QL_WIFI_WORK_MODE_MAX))
+
+typedef enum QL_WIFI_INDEX_ENUM
+{
+    QL_WIFI_AP_INDEX_MIN = -1,
+    QL_WIFI_AP_INDEX_AP0 = 0,   /**< Index of hotspot 0 */
+    QL_WIFI_AP_INDEX_MAX
+} QL_WIFI_AP_INDEX_E;
+#define IS_VALID_QL_WIFI_INDEX(idx) ((idx>QL_WIFI_AP_INDEX_MIN) && (idx<QL_WIFI_AP_INDEX_MAX))
+
+typedef enum
+{
+    QL_WIFI_SUB_REASON_NONE = 0,
+    QL_WIFI_SUB_REASON_WRONG_KEY = 1,
+    QL_WIFI_SUB_REASON_AUTH_FAILED = 2,
+    QL_WIFI_SUB_REASON_NO_PSK_AVAILABLE = 3,
+    QL_WIFI_SUB_REASON_CONN_FAILED = 4,
+
+    QL_WIFI_SUB_REASON_P2P_GRP_REM_SILENT = 5,
+    QL_WIFI_SUB_REASON_P2P_GRP_REM_FORMATION_FAILED = 6,
+    QL_WIFI_SUB_REASON_P2P_GRP_REM_REQUESTED = 7,
+    QL_WIFI_SUB_REASON_P2P_GRP_REM_IDLE_TIMEOUT= 8,
+    QL_WIFI_SUB_REASON_P2P_GRP_REM_UNAVAILABLE = 9,
+    QL_WIFI_SUB_REASON_P2P_GRP_REM_GO_ENDING_SESSION = 10,
+    QL_WIFI_SUB_REASON_P2P_GRP_REM_PSK_FAILURE = 11,
+    QL_WIFI_SUB_REASON_P2P_GRP_REM_FREQ_CONFLICT = 12,
+    QL_WIFI_SUB_REASON_P2P_GRP_REM_GO_LEAVE_CHANNEL = 13,
+
+    QL_WIFI_SUB_REASON_P2P_FAIL_BASE = 15,
+    QL_WIFI_SUB_REASON_P2P_FAIL_INFO_CURRENTLY_UNAVAILABLE = 16,
+    QL_WIFI_SUB_REASON_P2P_FAIL_INCOMPATIBLE_PARAMS = 17,
+    QL_WIFI_SUB_REASON_P2P_FAIL_LIMIT_REACHED = 18,
+    QL_WIFI_SUB_REASON_P2P_FAIL_INVALID_PARAMS = 19,
+    QL_WIFI_SUB_REASON_P2P_FAIL_UNABLE_TO_ACCOMMODATE = 20,
+    QL_WIFI_SUB_REASON_P2P_FAIL_PREV_PROTOCOL_ERROR = 21,
+    QL_WIFI_SUB_REASON_P2P_FAIL_NO_COMMON_CHANNELS = 22,
+    QL_WIFI_SUB_REASON_P2P_FAIL_UNKNOWN_GROUP = 23,
+    QL_WIFI_SUB_REASON_P2P_FAIL_BOTH_GO_INTENT_15 = 24,
+    QL_WIFI_SUB_REASON_P2P_FAIL_INCOMPATIBLE_PROV_METHOD = 25,
+    QL_WIFI_SUB_REASON_P2P_FAIL_REJECTED_BY_USER = 26,
+    QL_WIFI_SUB_REASON_P2P_FAIL_TIMEOUT = 27,
+
+    QL_WIFI_SUB_REASON_UNKNOW
+} QL_WIFI_SUB_REASON_CODE_E;
+
+typedef enum
+{
+    /**< Reason codes (IEEE Std 802.11-2016, 9.4.1.7, Table 9-45) */
+    QL_WIFI_REASON_SUCCEED = 0,
+    QL_WIFI_REASON_UNSPECIFIED = 1,
+    QL_WIFI_REASON_PREV_AUTH_NOT_VALID = 2,
+    QL_WIFI_REASON_DEAUTH_LEAVING = 3,
+    QL_WIFI_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
+    QL_WIFI_REASON_DISASSOC_AP_BUSY = 5,
+    QL_WIFI_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
+    QL_WIFI_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
+    QL_WIFI_REASON_DISASSOC_STA_HAS_LEFT = 8,
+    QL_WIFI_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
+    QL_WIFI_REASON_PWR_CAPABILITY_NOT_VALID = 10,
+    QL_WIFI_REASON_SUPPORTED_CHANNEL_NOT_VALID = 11,
+    QL_WIFI_REASON_BSS_TRANSITION_DISASSOC = 12,
+    QL_WIFI_REASON_INVALID_IE = 13,
+    QL_WIFI_REASON_MICHAEL_MIC_FAILURE = 14,
+    QL_WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
+    QL_WIFI_REASON_GROUP_KEY_UPDATE_TIMEOUT = 16,
+    QL_WIFI_REASON_IE_IN_4WAY_DIFFERS = 17,
+    QL_WIFI_REASON_GROUP_CIPHER_NOT_VALID = 18,
+    QL_WIFI_REASON_PAIRWISE_CIPHER_NOT_VALID = 19,
+    QL_WIFI_REASON_AKMP_NOT_VALID = 20,
+    QL_WIFI_REASON_UNSUPPORTED_RSN_IE_VERSION = 21,
+    QL_WIFI_REASON_INVALID_RSN_IE_CAPAB = 22,
+    QL_WIFI_REASON_IEEE_802_1X_AUTH_FAILED = 23,
+    QL_WIFI_REASON_CIPHER_SUITE_REJECTED = 24,
+    QL_WIFI_REASON_TDLS_TEARDOWN_UNREACHABLE = 25,
+    QL_WIFI_REASON_TDLS_TEARDOWN_UNSPECIFIED = 26,
+    QL_WIFI_REASON_SSP_REQUESTED_DISASSOC = 27,
+    QL_WIFI_REASON_NO_SSP_ROAMING_AGREEMENT = 28,
+    QL_WIFI_REASON_BAD_CIPHER_OR_AKM = 29,
+    QL_WIFI_REASON_NOT_AUTHORIZED_THIS_LOCATION = 30,
+    QL_WIFI_REASON_SERVICE_CHANGE_PRECLUDES_TS = 31,
+    QL_WIFI_REASON_UNSPECIFIED_QOS_REASON = 32,
+    QL_WIFI_REASON_NOT_ENOUGH_BANDWIDTH = 33,
+    QL_WIFI_REASON_DISASSOC_LOW_ACK = 34,
+    QL_WIFI_REASON_EXCEEDED_TXOP = 35,
+    QL_WIFI_REASON_STA_LEAVING = 36,
+    QL_WIFI_REASON_END_TS_BA_DLS = 37,
+    QL_WIFI_REASON_UNKNOWN_TS_BA = 38,
+    QL_WIFI_REASON_TIMEOUT = 39,
+    QL_WIFI_REASON_PEERKEY_MISMATCH = 45,
+    QL_WIFI_REASON_AUTHORIZED_ACCESS_LIMIT_REACHED = 46,
+    QL_WIFI_REASON_EXTERNAL_SERVICE_REQUIREMENTS = 47,
+    QL_WIFI_REASON_INVALID_FT_ACTION_FRAME_COUNT = 48,
+    QL_WIFI_REASON_INVALID_PMKID = 49,
+    QL_WIFI_REASON_INVALID_MDE = 50,
+    QL_WIFI_REASON_INVALID_FTE = 51,
+    QL_WIFI_REASON_MESH_PEERING_CANCELLED = 52,
+    QL_WIFI_REASON_MESH_MAX_PEERS = 53,
+    QL_WIFI_REASON_MESH_CONFIG_POLICY_VIOLATION = 54,
+    QL_WIFI_REASON_MESH_CLOSE_RCVD = 55,
+    QL_WIFI_REASON_MESH_MAX_RETRIES = 56,
+    QL_WIFI_REASON_MESH_CONFIRM_TIMEOUT = 57,
+    QL_WIFI_REASON_MESH_INVALID_GTK = 58,
+    QL_WIFI_REASON_MESH_INCONSISTENT_PARAMS = 59,
+    QL_WIFI_REASON_MESH_INVALID_SECURITY_CAP = 60,
+    QL_WIFI_REASON_MESH_PATH_ERROR_NO_PROXY_INFO = 61,
+    QL_WIFI_REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO = 62,
+    QL_WIFI_REASON_MESH_PATH_ERROR_DEST_UNREACHABLE = 63,
+    QL_WIFI_REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS = 64,
+    QL_WIFI_REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ = 65,
+    QL_WIFI_REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED = 66,
+
+    /**< Reason codes (Quectel extentions) */
+    QL_WIFI_REASON_SSID_NOT_FOUND = 10000,
+    QL_WIFI_REASON_P2P_GO_NEG_FAILURE = 10001,
+    QL_WIFI_REASON_P2P_GROUP_REMOVED = 10002
+} QL_WIFI_REASON_CODE_E;
+
+typedef enum QL_WIFI_AP_MODE_TYPE_ENUM
+{
+    QL_WIFI_AP_MODE_MIN = -1,
+    QL_WIFI_AP_MODE_80211B = 0,   /**< IEEE 802.11b (2.4 GHz) */
+    QL_WIFI_AP_MODE_80211BG,      /**< IEEE 802.11bg (2.4 GHz) */
+    QL_WIFI_AP_MODE_80211BGN,     /**< IEEE 802.11bgn (2.4 GHz) */
+    QL_WIFI_AP_MODE_80211AX_2G,   /**< IEEE 802.11ax (2.4 GHz) */
+    QL_WIFI_AP_MODE_MAX
+} QL_WIFI_AP_MODE_TYPE_E;
+#define IS_VALID_QL_WIFI_AP_MODE(mode) ((mode > QL_WIFI_AP_MODE_MIN) && (mode < QL_WIFI_AP_MODE_MAX))
+
+typedef enum QL_WIFI_BANDWIDTH_ENUM
+{
+    QL_WIFI_BANDWIDTH_MIN = -1,
+    QL_WIFI_BANDWIDTH_20MHZ = 0,   /**< 20MHZ */
+    QL_WIFI_BANDWIDTH_40MHZ,       /**< 40MHZ */
+    QL_WIFI_BANDWIDTH_80MHZ,       /**< 80MHZ */
+    QL_WIFI_BANDWIDTH_160MHZ,      /**< 160MHZ */
+    QL_WIFI_BANDWIDTH_MAX
+} QL_WIFI_BANDWIDTH_E;
+#define IS_VALID_QL_WIFI_BANDWIDTH(bandwidth) ((bandwidth > QL_WIFI_BANDWIDTH_MIN) && (bandwidth < QL_WIFI_BANDWIDTH_MAX))
+
+typedef enum QL_WIFI_AUTH_ENUM
+{
+    QL_WIFI_AUTH_MIN = -1,
+    QL_WIFI_AUTH_OPEN = 0,                /**< OPEN */
+    QL_WIFI_AUTH_WEP,                     /**< WEP */
+    QL_WIFI_AUTH_WPA_PSK,                 /**< WPA Personal */
+    QL_WIFI_AUTH_WPA2_PSK,                /**< WPA2 Personal */
+    QL_WIFI_AUTH_WPA3_PSK,                /**< WPA3 Personal */
+    QL_WIFI_AUTH_WPA_WPA2_PSK_BOTH,       /**< WPA&WPA2 Personal */
+    QL_WIFI_AUTH_WPA2_WPA3_PSK_BOTH,      /**< WPA2&WPA3 Personal */
+    QL_WIFI_AUTH_WPA_WPA2_WPA3_PSK_ALL,   /**< WPA&WPA2&WPA3 Personal */
+    QL_WIFI_AUTH_MAX
+} QL_WIFI_AUTH_E;
+#define IS_VALID_QL_WIFI_AUTH(auth) ((auth > QL_WIFI_AUTH_MIN) && (auth < QL_WIFI_AUTH_MAX))
+
+typedef enum QL_WIFI_AUTH_WPA_PSK_ENUM
+{
+    QL_WIFI_AUTH_WPA_PAIRWISE_MIN = -1,
+    QL_WIFI_AUTH_WPA_PAIRWISE_AUTO = 0,   /**< TKIP and AES */
+    QL_WIFI_AUTH_WPA_PAIRWISE_TKIP,       /**< TKIP */
+    QL_WIFI_AUTH_WPA_PAIRWISE_AES,        /**< AES */
+    QL_WIFI_AUTH_WPA_PAIRWISE_MAX
+} QL_WIFI_AUTH_WPA_PSK_E;
+#define IS_VALID_QL_WIFI_AUTH_WPA_PSK(pairwise) ((pairwise > QL_WIFI_AUTH_WPA_PAIRWISE_MIN) && (pairwise < QL_WIFI_AUTH_WPA_PAIRWISE_MAX))
+
+typedef enum QL_WIFI_STATUS_ENUM
+{
+    QL_WIFI_STATUS_DISABLED = 0,   /**< Wi-Fi is disabled */
+    QL_WIFI_STATUS_ENABLED,        /**< Wi-Fi is enabled */
+    QL_WIFI_STATUS_ERROR           /**< An error occurs in enabling Wi-Fi */
+} QL_WIFI_ENABLE_STATUS_E;
+
+typedef enum QL_WIFI_MAC_RULE_ENUM
+{
+    QL_WIFI_MAC_ACL_RULE_MIN = -1,
+    QL_WIFI_MAC_ACL_RULE_NONE = 0,   /**< No rules */
+    QL_WIFI_MAC_ACL_RULE_BLACK,      /**< Blacklist */
+    QL_WIFI_MAC_ACL_RULE_WHITE,      /**< Whitelist */
+    QL_WIFI_MAC_ACL_RULE_MAX
+} QL_WIFI_MAC_ACL_RULE_E;
+#define IS_VALID_QL_WIFI_ACL_RULE(acl_rule) ((acl_rule > QL_WIFI_MAC_ACL_RULE_MIN) && (acl_rule < QL_WIFI_MAC_ACL_RULE_MAX))
+
+typedef enum QL_WIFI_STA_STATUS_ENUM
+{
+    QL_WIFI_STA_STATUS_NONE,           /**< The corresponding Wi-Fi working mode is not set */
+    QL_WIFI_STA_STATUS_IDLE,           /**< The corresponding Wi-Fi working mode is set, but the STA function is not enabled */
+    QL_WIFI_STA_STATUS_CONNECTING,     /**< Connecting to AP */
+    QL_WIFI_STA_STATUS_ASSOCIATED,     /**< Connected to AP, but no IP address is assigned */
+    QL_WIFI_STA_STATUS_CONNECTED,      /**< Connected to the AP and an IP address is assigned */
+    QL_WIFI_STA_STATUS_DISCONNECTED,   /**< Disconnected from AP */
+    QL_WIFI_STA_STATUS_ERROR           /**< Error status */
+} QL_WIFI_STA_STATUS_E;
+
+typedef enum QL_WIFI_AP_STATUS_ENUM
+{
+    QL_WIFI_AP_STATUS_NONE,        /**< The corresponding Wi-Fi working mode is not set */
+    QL_WIFI_AP_STATUS_IDLE,        /**< The corresponding Wi-Fi working mode is set, but the AP function is not enabled */
+    QL_WIFI_AP_STATUS_ENABLING,    /**< This status indication is not currently supported */
+    QL_WIFI_AP_STATUS_ENABLED,     /**< After the AP function is successfully enabled, this status indication will be activated */
+    QL_WIFI_AP_STATUS_DISABLING,   /**< This status indication is not currently supported */
+    QL_WIFI_AP_STATUS_ERROR        /**< Error status */
+} QL_WIFI_AP_STATUS_E;
+
+typedef struct ql_wifi_ind_ap_status_struct
+{
+    QL_WIFI_AP_STATUS_E status;   /**< The status of AP mode */
+    char ifname[32];              /**< Linux network interface name, such as wlan0, wlan1, etc */
+    char bssid[18];               /**< BSSID, basic service set identifier */
+}ql_wifi_ap_status_t;
+
+typedef struct {
+
+  /* Mandatory */
+  int32_t msg_id;
+
+  /* Mandatory */
+  int32_t result;
+
+  /* Mandatory */
+  uint32_t msg_data_len;  /**< Must be set to # of elements in msg_data */
+  uint8_t msg_data[4096];
+}ql_ipc_wifi_rsp_msg_v01;  /* Message */
+
+/**  Message;  */
+typedef struct {
+
+  /* Mandatory */
+  int32_t msg_id;
+
+  /* Mandatory */
+  uint32_t msg_data_len;  /**< Must be set to # of elements in msg_data */
+  uint8_t msg_data[];
+}ql_ipc_wifi_req_msg_v01;  /* Message */
+typedef struct ql_wifi_sta_status_struct
+{
+    QL_WIFI_STA_STATUS_E status;   /**< The status of STA mode */
+    char ifname[32];               /**< Linux network interface name, such as wlan0, wlan1, etc */
+    char ap_bssid[18];             /**< BSSID, basic service set identifier */
+    int rssi;                      /**< The signal strength when the STA device is connected to the hotspot. Unit: dBm. -9999 indicates the invalid value */
+    uint8_t has_addr;              /**< Whether it is an IPv4 address or not */
+    ql_net_addr_t addr;            /**< IPv4 address. ql_net_addr_t is defined in the header file ql_net_common.h */
+    uint8_t has_addr6;             /**< Whether it is an IPv6 address or not */
+    ql_net_addr6_t addr6;          /**< IPv6 address. ql_net_addr6_t is defined in the header file ql_net_common.h */
+    QL_WIFI_REASON_CODE_E reason_code;           /**< STA error reason code */
+    QL_WIFI_SUB_REASON_CODE_E sub_reason_code;   /**< STA error sub-reason code */
+} ql_wifi_sta_status_t;
+
+typedef struct
+{
+    int is_connected;   /**< Connection status. 1 means connected; 0 means disconnected */
+    char macaddr[18];   /**< MAC address of STA device */
+}ql_wifi_sta_connect_status_t;
+
+typedef struct ql_wifi_sta_scan_info_struct
+{
+    char bssid[18];   /**< BSSID, basic service set identifier */
+    char essid[33];   /**< ESSID, extended service set identifier */
+    int signal;       /**< Signal strength. Unit: dBm */
+    int frequency;    /**< The current operating frequency. Unit: Hz */
+    QL_WIFI_AUTH_E auth;
+} ql_wifi_sta_scan_info_t;
+
+typedef struct ql_wifi_sta_scan_list_struct
+{
+    int cnt;  /**< Number of external hotspots scanned */
+    ql_wifi_sta_scan_info_t info[QL_WIFI_MAX_SCAN_INFO_CNT];   /**< Information of scanned external hotspots */
+}ql_wifi_sta_scan_list_t;
+
+typedef struct ql_wifi_sta_scan_result_struct
+{
+    int scan_is_busy;/**< Whether scan is busy, 1 means busy, 0 means idle */
+    ql_wifi_sta_scan_list_t scan_list; /**< The list of scan result */
+}ql_wifi_sta_scan_result_t;
+
+typedef struct
+{
+    QL_WIFI_AUTH_E auth;   /**< Authentication type */
+    union
+    {
+        /**< wep authentication information */
+        struct
+        {
+            int default_index;    /**< WEP configuration index */
+            char passwd[4][64];   /**< WEP password */
+        } wep;
+
+        /**< wpa_psk authentication information */
+        struct
+        {
+            QL_WIFI_AUTH_WPA_PSK_E pairwise;   /**< Encryption type */
+            char passwd[64];                   /**< WPA_PSK password */
+            int group_rekey;                   /**< Group key update period */
+        } wpa_psk;
+    }info;
+} ql_wifi_ap_auth_t;
+
+typedef struct
+{
+    QL_WIFI_AUTH_E auth;   /**< Authentication type */
+    union
+    {
+        /**< wep authentication information */
+        struct
+        {
+            char passwd[64];   /**< WEP password */
+        } wep;
+
+        /**< wpa_psk authentication information */
+        struct
+        {
+            QL_WIFI_AUTH_WPA_PSK_E pairwise;   /**< Encryption type */
+            char passwd[64];                   /**< WPA_PSK password */
+        } wpa_psk;
+    }info;
+} ql_wifi_sta_auth_t;
+
+typedef struct
+{
+    char macaddr[18];   /**< MAC address. The format is: %02X:%02X:%02X:%02X:%02X:%02X. For example: 2F:3F:4F:5F:6F:7F */
+}ql_wifi_mac_addr_t;
+
+typedef struct
+{
+    int cnt;   /**< Number of MAC addresses, the maximum value is 32 */
+    ql_wifi_mac_addr_t addr[QL_WIFI_MAX_ACL_MAC_CNT];   /**< MAC address list */
+}ql_wifi_acl_mac_list_t;
+
+typedef enum
+{
+    QL_WIFI_ACL_MAC_CMD_DEL = 0,   /**< Delete the MAC address */
+    QL_WIFI_ACL_MAC_CMD_ADD        /**< Add the MAC address */
+}QL_WIFI_ACL_MAC_CMD_E;
+
+typedef enum
+{
+    QL_WIFI_P2P_ROLE_NONE = 0,  /**< No role */
+    QL_WIFI_P2P_ROLE_CLI,       /**< client role */
+    QL_WIFI_P2P_ROLE_GO         /**< group owner role */
+}QL_WIFI_P2P_ROLE_E;
+
+typedef enum
+{
+    QL_WIFI_P2P_EN_STATUS_DISABLED = 0,   /**< Wi-Fi P2P is disabled */
+    QL_WIFI_P2P_EN_STATUS_ENABLED,        /**< Wi-Fi P2P is enabled */
+    QL_WIFI_P2P_EN_STATUS_ERROR           /**< An error occurs in enabling Wi-Fi P2P */
+}QL_WIFI_P2P_ENABLE_STATUS_E;
+
+typedef enum
+{
+    QL_WIFI_P2P_STATUS_IDLE = 0,        /**< Initial status */
+    QL_WIFI_P2P_STATUS_CONNECTING,      /**< P2P is connecting peer p2p device, including p2p role negotiation */
+    QL_WIFI_P2P_STATUS_ASSOCIATED,      /**< P2P client connected with peer P2P device   but no IP address is assigned */
+    QL_WIFI_P2P_STATUS_CONNECTED,       /**< P2P GO or client connected with peer P2P device, and an IP address is assigned */
+    QL_WIFI_P2P_STATUS_DISCONNECTED,    /**< P2P disconnected */
+    QL_WIFI_P2P_STATUS_ERROR,           /**< Error status */
+}QL_WIFI_P2P_STATUS_E;
+
+typedef struct
+{
+    int is_found;           /**< Found or Lost, 1 means P2P deivce found; 0 means P2P device lost */
+    char macaddr[18];       /**< MAC address of P2P device */
+    char dev_type[32];      /**< Type of P2P device */
+    char dev_name[32];      /**< Name of P2P device */
+}ql_wifi_p2p_found_dev_info_t;
+
+typedef struct
+{
+    char macaddr[18];   /**< MAC address of peer P2P device */
+}ql_wifi_p2p_req_peer_dev_info_t;
+
+typedef struct
+{
+    QL_WIFI_P2P_STATUS_E status;   /**< The status of P2P */
+    QL_WIFI_P2P_ROLE_E role;       /**< The role of P2P */
+    int freq;                      /**< The frequency of P2P */
+    char ssid[33];                 /**< The ssid of GO */
+    char passwd[64];               /**< The passwd of ssid */
+    char pin_code[9];              /**< Dynamically generated random from local display */
+    char ifname[32];               /**< Linux network interface name, such as p2p0 */
+    uint8_t has_addr;              /**< Whether it is an IPv4 address or not */
+    ql_net_addr_t addr;            /**< IPv4 address. ql_net_addr_t is defined in the header file ql_net_common.h */
+    uint8_t has_addr6;             /**< Whether it is an IPv6 address or not */
+    ql_net_addr6_t addr6;          /**< IPv6 address. ql_net_addr6_t is defined in the header file ql_net_common.h */
+    QL_WIFI_REASON_CODE_E reason_code;            /**< reason code */
+    QL_WIFI_SUB_REASON_CODE_E sub_reason_code;    /**< sub-reason code */
+} ql_wifi_p2p_status_t;
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/mbtk/include/ql_v2/ql_wifi_internal.h b/mbtk/include/ql_v2/ql_wifi_internal.h
new file mode 100755
index 0000000..6a58fac
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_wifi_internal.h
@@ -0,0 +1,312 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_wifi_internal.h
+  @brief WIFI internal define
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when         who            what, where, why
+  --------     ---            -------------------------------------------uint8_t---------------
+  2020-11-09   tyler.kuang    Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_WIFI_INTERNAL_H__
+#define __QL_WIFI_INTERNAL_H__
+#include <stdint.h>
+#include "ql_wifi_common.h"
+
+#define QL_WIFI_SRV_READY_FLAG "/tmp/ql_wifi_service_ready.flag"
+typedef struct
+{
+    int msg_id;
+    int msg_req_size;
+    int msg_rsp_size;
+} ql_wifi_msg_t;
+
+typedef enum
+{
+    QL_WIFI_REQ_MSG_ID_IM = 0,
+    QL_WIFI_REQ_MSG_ID_SET_ENABLE,
+    QL_WIFI_REQ_MSG_ID_GET_STATUS,
+    QL_WIFI_REQ_MSG_ID_SET_CFG,
+    QL_WIFI_REQ_MSG_ID_GET_CFG,
+    QL_WIFI_REQ_MSG_ID_SET_AP_CFG,
+    QL_WIFI_REQ_MSG_ID_GET_AP_CFG,
+    QL_WIFI_REQ_MSG_ID_START_AP,
+    QL_WIFI_REQ_MSG_ID_GET_AP_STATUS,
+    QL_WIFI_REQ_MSG_ID_SET_STA_CFG,
+    QL_WIFI_REQ_MSG_ID_GET_STA_CFG,
+    QL_WIFI_REQ_MSG_ID_START_STA,
+    QL_WIFI_REQ_MSG_ID_GET_STA_STATUS,
+    QL_WIFI_REQ_MSG_ID_STA_START_SCAN,
+    QL_WIFI_REQ_MSG_ID_P2P_SET_CFG,
+    QL_WIFI_REQ_MSG_ID_P2P_GET_CFG,
+    QL_WIFI_REQ_MSG_ID_P2P_ENABLE,
+    QL_WIFI_REQ_MSG_ID_P2P_DEV_FIND,
+    QL_WIFI_REQ_MSG_ID_P2P_CONNECT,
+    QL_WIFI_REQ_MSG_ID_P2P_DISCONNECT,
+    QL_WIFI_REQ_MSG_ID_P2P_GET_STATUS,
+    QL_WIFI_REQ_MSG_ID_EVENT_REG,
+    QL_WIFI_IND_MSG_ID_WIFI_STATUS,
+    QL_WIFI_IND_MSG_ID_WIFI_AP_STATUS,
+    QL_WIFI_IND_MSG_ID_WIFI_STA_STATUS,
+    QL_WIFI_IND_MSG_ID_WIFI_STA_SCAN_RESULT,
+    QL_WIFI_IND_MSG_ID_WIFI_AP_STA_CONNECT,
+    QL_WIFI_IND_MSG_ID_WIFI_P2P_ENABLE_STATUS,
+    QL_WIFI_IND_MSG_ID_WIFI_P2P_DEV_FOUND,
+    QL_WIFI_IND_MSG_ID_WIFI_P2P_PEER_DEV_REQ,
+    QL_WIFI_IND_MSG_ID_WIFI_P2P_STATUS
+} QL_WIFI_REQ_MSG_ID_E;
+
+typedef struct {
+  uint8_t is_enable;
+}ql_wifi_req_msg_set_wifi_enable_t;
+
+typedef struct {
+  QL_WIFI_ENABLE_STATUS_E status;
+}ql_wifi_rsp_msg_get_wifi_status_t;
+
+typedef struct {
+    uint8_t work_mode_valid;
+    QL_WIFI_WORK_MODE_E work_mode;
+    uint8_t country_code_valid;
+    uint8_t bridge_code_valid;
+    char country_code[3];
+    char bridge[50];
+} ql_wifi_req_msg_set_wifi_cfg_t;
+
+typedef struct {
+    QL_WIFI_WORK_MODE_E work_mode;
+    char country_code[3];
+} ql_wifi_rsp_msg_get_wifi_cfg_t;
+
+typedef struct{
+    QL_WIFI_AP_INDEX_E idx;
+    uint8_t ssid_valid;
+    char ssid[33];
+    uint8_t mode_valid;
+    QL_WIFI_AP_MODE_TYPE_E mode;
+    uint8_t auth_valid;
+    ql_wifi_ap_auth_t auth;
+    uint8_t channel_valid;
+    uint16_t channel;
+    uint8_t bandwidth_valid;
+    QL_WIFI_BANDWIDTH_E bandwidth;
+    uint8_t max_sta_valid;
+    uint8_t max_sta;
+    uint8_t isolate_valid;
+    uint8_t isolate;
+    uint8_t ssid_hidden_valid;
+    uint8_t ssid_hidden;
+    uint8_t country_code_valid;
+    char country_code[3];
+    uint8_t acl_rule_valid;
+    QL_WIFI_MAC_ACL_RULE_E acl_rule;
+    uint8_t acl_mac_valid;
+    QL_WIFI_ACL_MAC_CMD_E cmd;
+    char macaddr[18];
+} ql_wifi_req_msg_set_wifi_ap_cfg_t;
+
+typedef struct
+{
+    QL_WIFI_AP_INDEX_E idx;
+} ql_wifi_req_msg_get_wifi_ap_cfg_t;
+
+typedef struct{
+    QL_WIFI_AP_INDEX_E idx;
+    char ssid[33];
+    char country_code[3];
+    QL_WIFI_AP_MODE_TYPE_E mode;
+    ql_wifi_ap_auth_t auth;
+    uint16_t channel;
+    QL_WIFI_BANDWIDTH_E bandwidth;
+    uint8_t max_sta;
+    uint8_t isolate;
+    uint8_t ssid_hidden;
+    QL_WIFI_MAC_ACL_RULE_E acl_rule;
+    ql_wifi_acl_mac_list_t mac_list;
+} ql_wifi_rsp_msg_get_wifi_ap_cfg_t;
+
+typedef struct {
+    QL_WIFI_AP_INDEX_E idx;
+    uint8_t is_start;
+}ql_wifi_req_msg_start_wifi_ap_t;
+
+typedef struct {
+    QL_WIFI_AP_INDEX_E idx;
+}ql_wifi_req_msg_get_wifi_ap_status_t;
+
+typedef struct {
+    ql_wifi_ap_status_t status;
+}ql_wifi_rsp_msg_get_wifi_ap_status_t;
+
+typedef struct {
+    uint8_t ssid_valid;
+    char ssid[33];
+    uint8_t auth_valid;
+    ql_wifi_ap_auth_t auth;
+} ql_wifi_req_msg_set_wifi_sta_cfg_t;
+
+typedef struct {
+    char ssid[33];
+    ql_wifi_sta_auth_t auth;
+} ql_wifi_rsp_msg_get_wifi_sta_cfg_t;
+
+typedef struct {
+    uint8_t is_start;
+} ql_wifi_req_msg_start_wifi_sta_t;
+
+typedef struct {
+    ql_wifi_sta_status_t status;
+} ql_wifi_rsp_msg_get_wifi_sta_status_t;
+
+typedef struct {
+    uint8_t is_enable;
+}ql_wifi_req_msg_p2p_enable_t;
+
+typedef struct{
+    uint8_t dev_name_valid;
+    char dev_name[32];
+    uint8_t dev_type_valid;
+    char dev_type[32];
+    uint8_t oper_class_channel_valid;
+    int oper_class;
+    int oper_channel;
+    uint8_t ssid_postfix_valid;
+    char ssid_postfix[32];
+} ql_wifi_req_msg_p2p_set_cfg_t;
+
+typedef struct{
+    char dev_name[32];
+    char dev_type[32];
+    char ssid_postfix[32];
+    int oper_class;
+    int oper_channel;
+} ql_wifi_req_msg_p2p_get_cfg_t;
+
+typedef struct {
+    uint8_t is_find;
+}ql_wifi_req_msg_p2p_dev_find_t;
+
+typedef struct {
+    char macaddr[18];
+    char method[9];
+    int go_intent;
+}ql_wifi_req_msg_p2p_connect_t;
+
+typedef struct {
+    ql_wifi_p2p_status_t status;
+} ql_wifi_rsp_msg_p2p_get_status_t;
+
+typedef struct {
+    uint8_t wifi_valid;
+    uint8_t wifi;
+    uint8_t wifi_ap_valid;
+    uint8_t wifi_ap;
+    uint8_t wifi_sta_valid;
+    uint8_t wifi_sta;
+    uint8_t wifi_sta_scan_vaild;
+    uint8_t wifi_sta_scan;
+    uint8_t wifi_ap_sta_connect_valid;
+    uint8_t wifi_ap_sta_connect;
+    uint8_t wifi_p2p_enable_status_valid;
+    uint8_t wifi_p2p_enable_status;
+    uint8_t wifi_p2p_dev_found_valid;
+    uint8_t wifi_p2p_dev_found;
+    uint8_t wifi_p2p_peer_dev_req_valid;
+    uint8_t wifi_p2p_peer_dev_req;
+    uint8_t wifi_p2p_status_valid;
+    uint8_t wifi_p2p_status;
+}ql_wifi_req_msg_event_reg_t;
+
+typedef struct {
+    QL_WIFI_ENABLE_STATUS_E pre_status;
+    QL_WIFI_ENABLE_STATUS_E status;
+} ql_wifi_ind_msg_wifi_status_t;
+
+typedef struct {
+    QL_WIFI_AP_INDEX_E index;
+    QL_WIFI_AP_STATUS_E pre_status;
+    ql_wifi_ap_status_t status;
+} ql_wifi_ind_msg_wifi_ap_status_t;
+
+typedef struct {
+    QL_WIFI_STA_STATUS_E pre_status;
+    ql_wifi_sta_status_t status;
+} ql_wifi_ind_msg_wifi_sta_status_t;
+
+typedef struct {
+    ql_wifi_sta_scan_result_t scan_result;
+} ql_wifi_ind_msg_wifi_sta_scan_result_t;
+
+typedef struct {
+    QL_WIFI_AP_INDEX_E index;
+    ql_wifi_sta_connect_status_t conn_status;
+}ql_wifi_ind_msg_wifi_ap_sta_connect_status_t;
+
+typedef struct {
+    QL_WIFI_P2P_ENABLE_STATUS_E pre_status;
+    QL_WIFI_P2P_ENABLE_STATUS_E status;
+} ql_wifi_ind_msg_wifi_p2p_enable_status_t;
+
+typedef struct {
+    ql_wifi_p2p_found_dev_info_t dev_info;
+}ql_wifi_ind_msg_wifi_p2p_dev_found_t;
+
+typedef struct {
+    ql_wifi_p2p_req_peer_dev_info_t dev_info;
+}ql_wifi_ind_msg_wifi_p2p_peer_dev_req_t;
+
+typedef struct {
+    QL_WIFI_P2P_STATUS_E pre_status;
+    ql_wifi_p2p_status_t status;
+}ql_wifi_ind_msg_wifi_p2p_status_t;
+
+
+static ql_wifi_msg_t ql_wifi_msgs[] =
+{
+    {QL_WIFI_REQ_MSG_ID_SET_ENABLE,     sizeof(ql_wifi_req_msg_set_wifi_enable_t),     0},
+    {QL_WIFI_REQ_MSG_ID_GET_STATUS,     0,                                             sizeof(ql_wifi_rsp_msg_get_wifi_status_t)},
+    {QL_WIFI_REQ_MSG_ID_SET_CFG,        sizeof(ql_wifi_req_msg_set_wifi_cfg_t),        0},
+    {QL_WIFI_REQ_MSG_ID_GET_CFG,        0,                                             sizeof(ql_wifi_rsp_msg_get_wifi_cfg_t)},
+    {QL_WIFI_REQ_MSG_ID_SET_AP_CFG,     sizeof(ql_wifi_req_msg_set_wifi_ap_cfg_t),     0},
+    {QL_WIFI_REQ_MSG_ID_GET_AP_CFG,     sizeof(ql_wifi_req_msg_get_wifi_ap_cfg_t),     sizeof(ql_wifi_rsp_msg_get_wifi_ap_cfg_t)},
+    {QL_WIFI_REQ_MSG_ID_START_AP,       sizeof(ql_wifi_req_msg_start_wifi_ap_t),       0},
+    {QL_WIFI_REQ_MSG_ID_GET_AP_STATUS,  sizeof(ql_wifi_req_msg_get_wifi_ap_status_t),  sizeof(ql_wifi_rsp_msg_get_wifi_ap_status_t)},
+    {QL_WIFI_REQ_MSG_ID_SET_STA_CFG,    sizeof(ql_wifi_req_msg_set_wifi_sta_cfg_t),    0},
+    {QL_WIFI_REQ_MSG_ID_GET_STA_CFG,    0,                                             sizeof(ql_wifi_rsp_msg_get_wifi_sta_cfg_t)},
+    {QL_WIFI_REQ_MSG_ID_START_STA,      sizeof(ql_wifi_req_msg_start_wifi_sta_t),       0},
+    {QL_WIFI_REQ_MSG_ID_GET_STA_STATUS, 0,                                             sizeof(ql_wifi_rsp_msg_get_wifi_sta_status_t)},
+    {QL_WIFI_REQ_MSG_ID_STA_START_SCAN, 0,                                               0},
+    {QL_WIFI_REQ_MSG_ID_P2P_SET_CFG,    sizeof(ql_wifi_req_msg_p2p_set_cfg_t),           0},
+    {QL_WIFI_REQ_MSG_ID_P2P_GET_CFG,    0,                                             sizeof(ql_wifi_req_msg_p2p_get_cfg_t)},
+    {QL_WIFI_REQ_MSG_ID_P2P_ENABLE,          sizeof(ql_wifi_req_msg_p2p_enable_t),            0},
+    {QL_WIFI_REQ_MSG_ID_P2P_DEV_FIND,        sizeof(ql_wifi_req_msg_p2p_dev_find_t),          0},
+    {QL_WIFI_REQ_MSG_ID_P2P_CONNECT,    sizeof(ql_wifi_req_msg_p2p_connect_t),           0},
+    {QL_WIFI_REQ_MSG_ID_P2P_DISCONNECT, 0,                                               0},
+    {QL_WIFI_REQ_MSG_ID_P2P_GET_STATUS, 0,                                               sizeof(ql_wifi_rsp_msg_p2p_get_status_t)},
+    {QL_WIFI_REQ_MSG_ID_EVENT_REG,        sizeof(ql_wifi_req_msg_event_reg_t),           0},
+    {QL_WIFI_IND_MSG_ID_WIFI_STATUS,      sizeof(ql_wifi_ind_msg_wifi_status_t),         0},
+    {QL_WIFI_IND_MSG_ID_WIFI_AP_STATUS,   sizeof(ql_wifi_ind_msg_wifi_ap_status_t),      0},
+    {QL_WIFI_IND_MSG_ID_WIFI_STA_STATUS,  sizeof(ql_wifi_ind_msg_wifi_sta_status_t),     0},
+    {QL_WIFI_IND_MSG_ID_WIFI_STA_SCAN_RESULT,  sizeof(ql_wifi_ind_msg_wifi_sta_scan_result_t),     0},
+    {QL_WIFI_IND_MSG_ID_WIFI_AP_STA_CONNECT,   sizeof(ql_wifi_ind_msg_wifi_ap_sta_connect_status_t),      0},
+    {QL_WIFI_IND_MSG_ID_WIFI_P2P_ENABLE_STATUS, sizeof(ql_wifi_ind_msg_wifi_p2p_enable_status_t),     0},
+    {QL_WIFI_IND_MSG_ID_WIFI_P2P_DEV_FOUND,     sizeof(ql_wifi_ind_msg_wifi_p2p_dev_found_t),         0},
+    {QL_WIFI_IND_MSG_ID_WIFI_P2P_PEER_DEV_REQ,  sizeof(ql_wifi_ind_msg_wifi_p2p_peer_dev_req_t),      0},
+    {QL_WIFI_IND_MSG_ID_WIFI_P2P_STATUS,        sizeof(ql_wifi_ind_msg_wifi_p2p_status_t),            0}
+};
+
+
+#endif
+
diff --git a/mbtk/liblynq_lib_rilv2/Makefile b/mbtk/liblynq_lib_rilv2/Makefile
new file mode 100755
index 0000000..7ceee11
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/Makefile
@@ -0,0 +1,51 @@
+BUILD_ROOT = $(shell pwd)/..
+include $(BUILD_ROOT)/Make.defines
+
+LOCAL_PATH=$(BUILD_ROOT)/liblynq_lib_rilv2
+
+INC_DIR += \
+		-I$(LOCAL_PATH)
+	
+LIB_DIR +=
+
+LIBS += -lmbtk_lib -lrilutil -lprop2uci -lmtel -laudio-apu -lcutils -ltinyalsa -lacm -llog -ljson-c -lblobmsg_json
+
+CFLAGS += -shared -Wl,-shared,-Bsymbolic
+
+DEFINE +=
+
+MY_FILES_PATH:=$(LOCAL_PATH)
+#ifeq ($(CONFIG_MBTK_QL_SUPPORT),y)
+#MY_FILES_PATH += $(LOCAL_PATH)/ql
+#endif
+
+#ifeq ($(CONFIG_MBTK_PLATFORM),linux)
+#MY_FILES_PATH += $(LOCAL_PATH)/platform/linux
+#endif
+
+MY_FILES_SUFFIX:=%.c %.cpp
+My_All_Files := $(foreach src_path,$(MY_FILES_PATH), $(shell find "$(src_path)" -type f))
+MY_SRC_LIST  := $(filter $(MY_FILES_SUFFIX),$(My_All_Files))
+MY_SRC_LIST  := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%)
+LOCAL_SRC_FILES += $(MY_SRC_LIST)
+$(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES))
+OBJS = $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(LOCAL_SRC_FILES)))
+$(info OBJS = $(OBJS))
+
+dtarget := $(OUT_DIR)/lib/liblynq_lib.so
+
+all: $(dtarget)
+
+$(dtarget): $(OBJS)
+	$(CC) $(CFLAGS) $(LIB_DIR) $(LIBS) $(OBJS) -o $@
+	cp $@ $(BUILD_ROOT)/rootfs/lib
+
+%.o:%.c
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+%.o:%.cpp
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+clean:
+	rm -f $(OBJS) $(dtarget)
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_adc.c b/mbtk/liblynq_lib_rilv2/lynq_adc.c
new file mode 100755
index 0000000..3c203e7
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_adc.c
@@ -0,0 +1,32 @@
+#include "lynq-adc.h"
+#include "mbtk_type.h"
+#include "mbtk_adc.h"
+#include "mbtk_log.h"
+
+int qser_adc_show(ADC_CHANNEL_E qadc)
+{
+    UNUSED(qadc);
+
+    mbtk_adc_enum adc = MBTK_ADC0;
+    switch(qadc) {
+        case QADC_NONE:
+        {
+            return 0;
+        }
+        case ADC0:
+            adc = MBTK_ADC0;
+            break;
+        case ADC1:
+            adc = MBTK_ADC1;
+            break;
+        case ADC2:
+            adc = MBTK_ADC2;
+            break;
+        default:
+            LOGE("Unsupport adc : %d", qadc);
+            return -1;
+    }
+
+    return mbtk_adc_get(ADC_DEVICE_AUX, adc);
+}
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_alarm.c b/mbtk/liblynq_lib_rilv2/lynq_alarm.c
new file mode 100755
index 0000000..355279b
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_alarm.c
@@ -0,0 +1,107 @@
+#include <math.h>
+#include <stdlib.h>
+
+#include "mbtk_alarm.h"
+#include "lynq_alarm.h"
+#include "mbtk_str.h"
+#include "lynq-qser-autosuspend.h"
+#include "mbtk_utils.h"
+
+
+
+bool rtc_flag = FALSE;
+int lynq_rtc_service_init(void)
+{
+    int ret = 0;
+    if(!rtc_flag)
+    {
+        rtc_flag = TRUE;
+        ret = 1;
+    }
+    else
+    {
+        ret = -1;
+    }
+    return ret;
+}
+
+int lynq_rtc_service_deinit(void)
+{
+    int ret = 0;
+    if(rtc_flag)
+    {
+        rtc_flag = FALSE;
+        ret = 0;
+    }
+    else{
+        ret = -1;
+    }
+
+    return ret;
+}
+
+void mbtk_info_callback_func1(const void* data, int data_len)
+{
+    mbtk_system("echo 456 > /data/test1.txt");
+    return;
+}
+
+
+int lynq_set_wakealarm(unsigned long time_sec,int src_id,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify )
+{
+    UNUSED(time_sec);
+    if(time_sec < 1 || time_sec > pow(2, 28)) {
+        return -1;
+    }
+
+    if(!rtc_flag)
+    {
+        return -1;
+    }
+
+    qser_suspend_timer_set(time_sec, mbtk_info_callback_func1);
+
+    return 0;
+
+}
+
+//int lynq_set_poweralarm(unsigned long time_sec)
+int lynq_set_poweralarm(unsigned long time_sec,int src_id)
+{
+    UNUSED(time_sec);
+    if(time_sec < 1 || time_sec > pow(2, 28)) {
+        return -1;
+    }
+    char buf[50] ={0};
+    sprintf(buf, "rtcwake -d rtc0 -s %ld -m on &", time_sec);
+    mbtk_system(buf);
+
+    return 0;
+}
+
+// min:1 max:2^28
+ssize_t wakealarm(char *buffer,int src_id,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify )
+{
+    UNUSED(buffer);
+    if(str_empty(buffer)) {
+        return -1;
+    }
+    return lynq_set_wakealarm(atol(buffer), src_id, rtc_id, wakealarm_notify);
+}
+
+// min:1 max:2^28
+ssize_t poweralarm(char *buffer,int src_id)
+{
+    UNUSED(buffer);
+    if(str_empty(buffer)) {
+        return -1;
+    }
+    return lynq_set_poweralarm(atol(buffer), 0);
+}
+
+ssize_t cancel_wakealarm(int src_id, int rtc_id)
+{
+    return -1;
+}
+
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_audio.c b/mbtk/liblynq_lib_rilv2/lynq_audio.c
new file mode 100755
index 0000000..259661e
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_audio.c
@@ -0,0 +1,271 @@
+#include "lynq-qser-audio.h"
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+#include "mbtk_audio2.h"
+
+#define AUDIO_DEV_PLAY "device1"
+#define AUDIO_DEV_RECORDER "device2"
+#define AUDIO_HDL_DEFAULT 0
+
+static _cb_onPlayer play_cb = NULL;
+static int play_hdl = -1;
+
+static _cb_onPlayer recv_cb = NULL;
+static int recv_hdl = -1;
+
+int qser_AudPlayer_Open(char* device, _cb_onPlayer cb_fun)
+{
+    UNUSED(device);
+    UNUSED(cb_fun);
+    if(device == NULL || strcmp(device, AUDIO_DEV_PLAY)) {
+        LOGE("device must be %s for play.", AUDIO_DEV_PLAY);
+        return -1;
+    }
+
+    if(mbtk_audio_wav_init()) {
+        LOGE("mbtk_audio_wav_init() fail.");
+        return -1;
+    }
+
+    play_cb = cb_fun;
+
+    return 0;
+}
+
+int qser_AudPlayer_PlayFrmFile(int hdl, const char *fd, int offset)
+{
+    UNUSED(hdl);
+    UNUSED(fd);
+    UNUSED(offset);
+    if(play_hdl >= 0) {
+        LOGE("Play busy.");
+        if(play_cb) {
+            play_cb(-1);
+        }
+        return -1;
+    }
+
+    if(mbtk_audio_wav_play_start(fd)) {
+        LOGE("mbtk_audio_wav_play_start() fail.");
+        if(play_cb) {
+            play_cb(-2);
+        }
+        return -1;
+    }
+
+    play_hdl = hdl;
+
+    if(play_cb) {
+        play_cb(0);
+    }
+
+    return 0;
+}
+
+int qser_AudPlayer_PlayPcmBuf(const unsigned char *pcm_data, int data_size, int period_size,
+                                int period_count, int num_channels, int sample_rate, int ownerid)
+{
+
+    if(play_hdl >= 0) {
+        LOGE("Play busy.");
+        if(play_cb) {
+            play_cb(-1);
+        }
+        return -1;
+    }
+
+    if(mbtk_audio_wav_stream_play_start(pcm_data, data_size, sample_rate, num_channels)) {
+        LOGE("mbtk_audio_wav_stream_play_start() fail.");
+        if(play_cb) {
+            play_cb(-2);
+        }
+        return -1;
+    }
+
+    play_hdl = AUDIO_HDL_DEFAULT;
+    if(play_cb) {
+        play_cb(0);
+    }
+    return 0;
+}
+
+int qser_AudPlayer_Pause(int hdl)
+{
+    UNUSED(hdl);
+    if((play_hdl != AUDIO_HDL_DEFAULT && hdl != play_hdl) || play_hdl < 0) {
+        LOGE("Play busy or hdl error.");
+        return -1;
+    }
+
+    if(mbtk_audio_wav_play_pause()) {
+        LOGE("mbtk_audio_wav_play_pause() fail.");
+        return -1;
+    }
+
+    return 0;
+}
+
+int qser_AudPlayer_Resume(int hdl)
+{
+    UNUSED(hdl);
+    if((play_hdl != AUDIO_HDL_DEFAULT && hdl != play_hdl) || play_hdl < 0) {
+        LOGE("Play busy or hdl error.");
+        return -1;
+    }
+
+    if(mbtk_audio_wav_play_resume()) {
+        LOGE("mbtk_audio_wav_play_resume() fail.");
+        return -1;
+    }
+
+    return 0;
+}
+
+void qser_AudPlayer_Stop(int hdl)
+{
+    UNUSED(hdl);
+    if((play_hdl != AUDIO_HDL_DEFAULT && hdl != play_hdl) || play_hdl < 0) {
+        LOGE("Play busy or hdl error.");
+        return;
+    }
+
+    if(mbtk_audio_wav_play_stop()) {
+        LOGE("mbtk_audio_wav_play_stop() fail.");
+        return;
+    }
+
+    play_hdl = -1;
+}
+
+
+void qser_AudPlayer_Close(int hdl)
+{
+    UNUSED(hdl);
+
+    if(play_hdl >= 0) {
+        qser_AudPlayer_Stop(hdl);
+    }
+
+    if(mbtk_audio_wav_deinit()) {
+        LOGE("mbtk_audio_wav_deinit() fail.");
+        return;
+    }
+
+    play_cb = NULL;
+}
+
+int qser_AudRecorder_Open(char* device, _cb_onPlayer cb_fun)
+{
+    UNUSED(device);
+    UNUSED(cb_fun);
+    if(device == NULL || strcmp(device, AUDIO_DEV_RECORDER)) {
+        LOGE("device must be %s for recv.", AUDIO_DEV_RECORDER);
+        return -1;
+    }
+
+    if(mbtk_audio_wav_init()) {
+        LOGE("mbtk_audio_wav_init() fail.");
+        return -1;
+    }
+
+    recv_cb = cb_fun;
+
+    return 0;
+}
+
+int qser_AudRecorder_StartRecord(int hdl, const char *fd, int offset)
+{
+    UNUSED(hdl);
+    UNUSED(fd);
+    UNUSED(offset);
+    if(recv_hdl >= 0) {
+        LOGE("Recv busy.");
+        if(recv_cb) {
+            recv_cb(-1);
+        }
+        return -1;
+    }
+
+    if(mbtk_audio_wav_recorder_start(fd, MBTK_AUDIO_SAMPLE_RATE_8000)) {
+        LOGE("mbtk_audio_wav_recorder_start() fail.");
+        if(recv_cb) {
+            recv_cb(-2);
+        }
+        return -1;
+    }
+
+    recv_hdl = hdl;
+    if(recv_cb) {
+        recv_cb(0);
+    }
+    return 0;
+}
+
+int qser_AudRecorder_StartRecord_Custom(char *file, int period_size, int period_count,
+            int num_channels, int sample_rate)
+{
+    return qser_AudRecorder_StartRecord(0, file, 0);
+}
+
+int qser_AudRecorder_Pause(void)
+{
+    if(recv_hdl < 0) {
+        LOGE("Recv busy or hdl error.");
+        return -1;
+    }
+
+    if(mbtk_audio_wav_recorder_pause()) {
+        LOGE("mbtk_audio_wav_recorder_pause() fail.");
+        return -1;
+    }
+    return 0;
+}
+
+int qser_AudRecorder_Resume(void)
+{
+    if(recv_hdl < 0) {
+        LOGE("Recv busy or hdl error.");
+        return -1;
+    }
+
+    if(mbtk_audio_wav_recorder_resume()) {
+        LOGE("mbtk_audio_wav_recorder_resume() fail.");
+        return -1;
+    }
+    return 0;
+}
+
+void qser_AudRecorder_Stop(void)
+{
+    if(recv_hdl < 0) {
+        LOGE("Recv busy or hdl error.");
+        return;
+    }
+
+    if(mbtk_audio_wav_recorder_stop()) {
+        LOGE("mbtk_audio_wav_recorder_stop() fail.");
+        return;
+    }
+
+    recv_hdl = -1;
+}
+
+void qser_AudRecorder_Close(void)
+{
+    if(recv_hdl >= 0) {
+        qser_AudRecorder_Stop();
+    }
+
+    if(mbtk_audio_wav_deinit()) {
+        LOGE("mbtk_audio_wav_deinit() fail.");
+        return;
+    }
+
+    recv_cb = NULL;
+}
+
+void qser_Audio_Deinit(void)
+{
+    // Do nothing...
+}
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_chip_id.c b/mbtk/liblynq_lib_rilv2/lynq_chip_id.c
new file mode 100755
index 0000000..34e60c1
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_chip_id.c
@@ -0,0 +1,69 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include <time.h>
+#include "mbtk_ril_api.h"
+static mbtk_ril_handle* info_handle = NULL;
+
+int lynq_get_time_sec(char *time_t)
+{
+    struct timeval tv;
+    gettimeofday(&tv,NULL);
+    sprintf(time_t, "%lld", tv.tv_sec);
+    return 0;
+}
+
+int lynq_imet_get(char *imei_t)
+{
+    info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+
+    int err;
+    err = mbtk_imei_get(info_handle, imei_t);
+    if(err) {
+    //    printf("Error : %d\n", err);
+        return -1;
+    } else {
+   //     printf("IMEI : %s\n", imei_t);
+    }
+    return 0;
+}
+
+
+int lynq_get_chip_id(char *chip_id)
+{
+    char time[50]={0};
+    char imei[50]={0};
+    int ret = 0;
+
+    lynq_get_time_sec(time);
+    ret = lynq_imet_get(imei);
+
+    if(info_handle != NULL)
+    {
+        int ret_ril = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if (ret_ril == MBTK_RIL_ERR_SUCCESS)
+            LOGI("deinit info_handle is succuess");
+        else
+            LOGE("deinit info_handle is error(%d)",ret_ril);
+    }
+
+    if(!ret)
+    {
+        sprintf(chip_id,"%s%s",imei, time);
+//        printf("%s\n",chip_id );
+    }
+    else{
+        return -1;
+    }
+
+    return 0;
+}
+
+
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_data_call.c b/mbtk/liblynq_lib_rilv2/lynq_data_call.c
new file mode 100755
index 0000000..94bf008
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_data_call.c
@@ -0,0 +1,892 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file lynq_data_call.c 
+  @brief data call service API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241202    yq.wang      Created.
+-------------------------------------------------------------------------------------------------*/
+
+#include <pthread.h>
+#include <cutils/properties.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+//#include <sys/scoket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "lynq_qser_data.h"
+#include "mbtk_type.h"
+#include "mbtk_ril_api.h"
+
+/*define*/
+#define QSER_DATA_CALL_FUNC __func__
+
+#define QSER_LOGE LOGE
+#define QSER_LOGD LOGD
+
+#define QSER_DEFAULT_APN_TYPE "iot_default"
+
+/*define*/
+
+/*enum*/
+typedef enum {
+	QSER_RESULT_SUCCESS = 0,
+    QSER_RESULT_FAIL,
+    QSER_RESULT_SERVER_NO_INIT,
+    QSER_RESULT_INVALID_PARAMS,
+}qser_result_e;
+
+/*enum*/
+
+/*struct*/
+typedef struct {
+    mbtk_ril_handle* handle;
+    qser_data_call_evt_cb_t net_status_cb;
+}qser_data_call_handle_s;
+
+/*struct*/
+
+/*----------------------------------------------DATA CALL FUNCTION-------------------------------------*/
+static qser_data_call_handle_s* qser_data_call_handle_get(void)
+{
+    static qser_data_call_handle_s data_call_handle = {0};
+    
+    return &data_call_handle;
+}
+
+static int qser_apn_convert_to_qser_s(qser_apn_info_s *qser_apn, mbtk_apn_info_t *mbtk_apn)
+{
+    if(qser_apn == NULL || mbtk_apn == NULL)
+    {
+        QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+
+    int length = 0;
+    memset(qser_apn, 0x0, sizeof(qser_apn_info_s));
+    qser_apn->profile_idx = (unsigned char)(mbtk_apn->cid - 1);
+    //get ip type
+    if(mbtk_apn->ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
+    {
+        qser_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4V6;
+    }
+    else if(mbtk_apn->ip_type == MBTK_IP_TYPE_IP) // IPV4
+    {
+        qser_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4;
+    }
+    else if(mbtk_apn->ip_type == MBTK_IP_TYPE_IPV6) // IPV6
+    {
+        qser_apn->pdp_type = QSER_APN_PDP_TYPE_IPV6;
+    }
+    else
+    {
+        qser_apn->pdp_type = QSER_APN_PDP_TYPE_PPP;
+    }
+
+    //get apn proto
+    qser_apn->auth_proto = (qser_apn_auth_proto_e)mbtk_apn->auth;
+    
+    //get apn name
+    length = strlen((char *)mbtk_apn->apn);
+    if( length <= 0 || length > QSER_APN_NAME_SIZE)
+    {
+        QSER_LOGE("[%s] apn_nmea length fault.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        memcpy(qser_apn->apn_name, mbtk_apn->apn, length);
+    }
+
+    //get apn user
+    length = strlen((char *)mbtk_apn->user);
+    if(length < 0 || length > QSER_APN_USERNAME_SIZE)
+    {
+        QSER_LOGE("[%s] user length fault.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        memcpy(qser_apn->username, mbtk_apn->user, length);
+    }
+
+    //get apn password
+    length = strlen((char *)mbtk_apn->pass);
+    if(length < 0 || length > QSER_APN_PASSWORD_SIZE)
+    {
+        QSER_LOGE("[%s] pass length fault.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        memcpy(qser_apn->password, mbtk_apn->pass, length);
+    }
+
+    //get apn type
+    length = strlen((char *)mbtk_apn->type);
+    if(length < 0 || length > QSER_APN_TYPE_SIZE)
+    {
+        QSER_LOGE("[%s] type length fault.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        memcpy(qser_apn->apn_type, mbtk_apn->type, length);
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+static int qser_apn_convert_to_mbtk_s(mbtk_ril_cid_enum cid, mbtk_apn_info_t *mbtk_apn, qser_apn_info_s *qser_apn)
+{
+    if(mbtk_apn == NULL || qser_apn == NULL)
+    {
+        QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(strlen(qser_apn->apn_name) > QSER_APN_NAME_SIZE || strlen(qser_apn->username) > QSER_APN_USERNAME_SIZE
+               || strlen(qser_apn->password) > QSER_APN_PASSWORD_SIZE  || strlen(qser_apn->apn_type) > QSER_APN_TYPE_SIZE)
+    {
+        QSER_LOGE("[%s] apn length out of range.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_INVALID_PARAMS;
+    }
+
+    memset(mbtk_apn, 0x0, sizeof(mbtk_apn_info_t));
+    mbtk_apn->cid = cid;
+    
+    if(qser_apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
+    {
+        mbtk_apn->ip_type = MBTK_IP_TYPE_IP;
+    }
+    else if(qser_apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
+    {
+        mbtk_apn->ip_type = MBTK_IP_TYPE_IPV6;
+    }
+    else if(qser_apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
+    {
+        mbtk_apn->ip_type = MBTK_IP_TYPE_IPV4V6;
+    }
+    else if(qser_apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
+    {
+        mbtk_apn->ip_type = MBTK_IP_TYPE_PPP;
+    }
+    else
+    {
+        QSER_LOGE("[%s] pdp_type error.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+
+    //no support PAP_CHAP
+    if(qser_apn->auth_proto >= QSER_APN_AUTH_PROTO_DEFAULT && qser_apn->auth_proto < QSER_APN_AUTH_PROTO_PAP_CHAP)
+    {
+        mbtk_apn->auth = (mbtk_apn_auth_type_enum)qser_apn->auth_proto;
+    }
+    else
+    {
+        QSER_LOGE("[%s] auth_proto error.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+    
+    mbtk_apn->auto_save = true;
+    mbtk_apn->auto_boot_call = false;
+
+    if(strlen(qser_apn->apn_type))
+    {
+        if(memcmp(qser_apn->apn_type, QSER_DEFAULT_APN_TYPE, strlen(QSER_DEFAULT_APN_TYPE)) == 0)
+        {
+            mbtk_apn->def_route = true;
+            mbtk_apn->as_dns = true;
+        }
+        memcpy(mbtk_apn->type, qser_apn->apn_type, strlen(qser_apn->apn_type));
+    }
+    else
+    {
+        mbtk_apn->def_route = false;
+        mbtk_apn->as_dns = false;
+    }
+    
+    if(strlen(qser_apn->apn_name))
+    {
+        memcpy(mbtk_apn->apn, qser_apn->apn_name, strlen(qser_apn->apn_name));
+    }
+    else
+    {
+        QSER_LOGE("[%s] apn is empty.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(strlen(qser_apn->username))
+    {
+        memcpy(mbtk_apn->user, qser_apn->username, strlen(qser_apn->username));
+    }
+    if(strlen(qser_apn->password))
+    {
+        memcpy(mbtk_apn->pass, qser_apn->password, strlen(qser_apn->password));
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+static void qser_netcard_state_init(qser_data_call_state_s *state)
+{
+    if(state != NULL)
+    {
+        state->profile_idx = 0;
+        memset(state->name, 0x0, 16);
+        state->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
+        state->state = QSER_DATA_CALL_DISCONNECTED;
+        state->err = QSER_DATA_CALL_ERROR_NONE;
+        inet_aton("0.0.0.0", &(state->v4.ip));
+        inet_aton("0.0.0.0", &(state->v4.gateway));
+        inet_aton("0.0.0.0", &(state->v4.pri_dns));
+        inet_aton("0.0.0.0", &(state->v4.sec_dns));
+        inet_pton(AF_INET6, "::", &(state->v6.ip));
+        inet_pton(AF_INET6, "::", &(state->v6.gateway));
+        inet_pton(AF_INET6, "::", &(state->v6.pri_dns));
+        inet_pton(AF_INET6, "::", &(state->v6.sec_dns));
+    }
+}
+
+static void qser_pdp_state_change_cb(const void* data, int data_len)
+{
+    if(data == NULL || data_len != sizeof(mbtk_ril_pdp_state_info_t))
+    {
+        QSER_LOGE("[%s] cb data fault.", QSER_DATA_CALL_FUNC);
+        return;
+    }
+    
+    mbtk_ril_pdp_state_info_t pdp_data;
+    qser_data_call_state_s state = {0};
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle)
+    {
+        QSER_LOGE("[%s] qser_data_call_handle_get() fail.", QSER_DATA_CALL_FUNC);
+        return;
+    }
+
+    
+    memset(&pdp_data, 0x0, sizeof(mbtk_ril_pdp_state_info_t));
+    memcpy(&pdp_data, data, sizeof(mbtk_ril_pdp_state_info_t));
+    QSER_LOGD("[%s] cid - %d, act - %d, auto_change - %d, reason - %d", QSER_DATA_CALL_FUNC, pdp_data.cid, pdp_data.action,
+            pdp_data.auto_change, pdp_data.reason);
+    
+    qser_netcard_state_init(&state);
+    state.profile_idx = (char)(pdp_data.cid - 1);
+    snprintf(state.name, 16, "ccinet%d", state.profile_idx);
+    if(pdp_data.action)
+    {
+        state.state = QSER_DATA_CALL_CONNECTED;
+    }
+    else
+    {
+        state.state = QSER_DATA_CALL_DISCONNECTED;
+    }
+
+    if(pdp_data.ip_info_valid)
+    {
+        if(pdp_data.ip_info.ipv4.valid)
+        {
+            state.ip_family = QSER_DATA_CALL_TYPE_IPV4;
+            state.v4.ip.s_addr = pdp_data.ip_info.ipv4.IPAddr;
+            state.v4.pri_dns.s_addr = pdp_data.ip_info.ipv4.PrimaryDNS;
+            state.v4.sec_dns.s_addr = pdp_data.ip_info.ipv4.SecondaryDNS;
+        }
+
+        if(pdp_data.ip_info.ipv6.valid)
+        {
+            state.ip_family = QSER_DATA_CALL_TYPE_IPV6;
+            memcpy(&(state.v6.ip), &(pdp_data.ip_info.ipv6.IPV6Addr), sizeof(pdp_data.ip_info.ipv6.IPV6Addr));
+            memcpy(&(state.v6.pri_dns), &(pdp_data.ip_info.ipv6.PrimaryDNS), sizeof(pdp_data.ip_info.ipv6.PrimaryDNS));
+            memcpy(&(state.v6.sec_dns), &(pdp_data.ip_info.ipv6.SecondaryDNS), sizeof(pdp_data.ip_info.ipv6.SecondaryDNS));
+        }
+
+        if(pdp_data.ip_info.ipv4.valid && pdp_data.ip_info.ipv6.valid)
+        {
+            state.ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
+        }
+    }
+
+    if(data_call_handle->net_status_cb)
+    {
+        data_call_handle->net_status_cb(&state);
+    }
+}
+
+static void* qser_data_call_async_thread(void* arg)
+{
+    QSER_LOGD("[%s] entry func.", QSER_DATA_CALL_FUNC);
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;
+
+    qser_data_call_state_s state = {0};
+    qser_data_call_s qser_data_backup = {0};
+    qser_data_call_info_s info = {0};
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    qser_netcard_state_init(&state);
+    if(arg != NULL)
+    {
+        memcpy(&qser_data_backup, (qser_data_call_s *)arg, sizeof(qser_data_call_s));
+    }
+    else
+    {
+        QSER_LOGD("[%s] arg is NULL.", QSER_DATA_CALL_FUNC);
+        state.err = QSER_DATA_CALL_ERROR_UNKNOWN;
+        if(data_call_handle->net_status_cb)
+        {
+            data_call_handle->net_status_cb(&state);
+        }
+        return NULL;
+    }
+
+    state.profile_idx = qser_data_backup.profile_idx;
+    snprintf(state.name, 16, "ccinet%d", qser_data_backup.profile_idx);
+    state.ip_family = qser_data_backup.ip_family;
+    
+    ret = qser_data_call_start(&qser_data_backup, &err);
+    if(ret != MBTK_RIL_ERR_SUCCESS)
+    {
+        QSER_LOGE("[%s] qser_data_call_start() fail.", QSER_DATA_CALL_FUNC);
+        state.err = err;
+    }
+    else
+    {
+        state.state = QSER_DATA_CALL_CONNECTED;
+        ret = qser_data_call_info_get(qser_data_backup.profile_idx, qser_data_backup.ip_family, &info, &err);
+        if(ret != MBTK_RIL_ERR_SUCCESS)
+        {
+            QSER_LOGE("[%s] qser_data_call_info_get() fail.", QSER_DATA_CALL_FUNC);
+            state.err = err;
+        }
+        else
+        {
+            memcpy(&(state.v4), &(info.v4.addr), sizeof(struct v4_address_status));
+            memcpy(&(state.v6), &(info.v6.addr), sizeof(struct v6_address_status));
+        }
+    }
+  
+    if(data_call_handle->net_status_cb)
+    {
+        data_call_handle->net_status_cb(&state);
+    }
+    return NULL;
+}
+
+/*----------------------------------------------DATA CALL FUNCTION-------------------------------------*/
+
+/*----------------------------------------------DATA CALL API------------------------------------------*/
+int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
+{
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle)
+    {
+        QSER_LOGE("[%s] qser_data_call_handle_get() fail.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(NULL == data_call_handle->handle)
+    {
+        data_call_handle->handle = mbtk_ril_open(MBTK_AT_PORT_DATA);
+        if(NULL == data_call_handle->handle)
+        {
+            QSER_LOGE("[%s] mbtk_ril_open() fail.", QSER_DATA_CALL_FUNC);
+            return QSER_RESULT_FAIL;
+        }
+
+        ret = mbtk_pdp_state_change_cb_reg(qser_pdp_state_change_cb);
+        if(ret != MBTK_RIL_ERR_SUCCESS)
+        {
+            QSER_LOGE("[%s] mbtk_pdp_state_change_cb_reg() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
+            goto error_1;
+        }
+
+        data_call_handle->net_status_cb = evt_cb;
+    }
+    
+    QSER_LOGD("[%s] data call init success.", QSER_DATA_CALL_FUNC);
+    
+    return QSER_RESULT_SUCCESS;
+error_1:
+    if(data_call_handle->handle)
+    {
+        ret = mbtk_ril_close(MBTK_AT_PORT_DATA);
+        data_call_handle->handle = NULL;
+    }
+
+    return QSER_RESULT_FAIL;
+}
+
+void qser_data_call_destroy(void)
+{
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        return;
+    }
+
+    data_call_handle->net_status_cb = NULL;
+
+    ret = mbtk_ril_close(MBTK_AT_PORT_DATA);
+    if(ret != MBTK_RIL_ERR_SUCCESS && ret != MBTK_RIL_ERR_PORT_NOT_CLOSE)
+    {
+        QSER_LOGE("[%s] mbtk_ril_close() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
+        return;
+    }
+    data_call_handle->handle = NULL;
+}
+
+int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
+{
+    if(data_call == NULL || err == NULL)
+    {
+        QSER_LOGE("[%s] data_call or err is NULL.", QSER_DATA_CALL_FUNC);
+        if(err != NULL)
+        {
+            *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        }
+        return QSER_RESULT_FAIL;
+    }
+    
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    int retry_interval[] = {5, 10};
+    mbtk_ip_info_t ip_info;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        *err = QSER_DATA_CALL_ERROR_NO_INIT;
+        return QSER_RESULT_SERVER_NO_INIT;
+    }
+
+    memset(&ip_info, 0x0, sizeof(mbtk_ip_info_t));
+    ret = mbtk_data_call_start(data_call_handle->handle, (mbtk_ril_cid_enum)(data_call->profile_idx + 1),
+                                MBTK_DATA_CALL_ITEM_STATE_NON, MBTK_DATA_CALL_ITEM_STATE_NON, MBTK_DATA_CALL_ITEM_STATE_NON,
+                                retry_interval, 2, 0, &ip_info);
+    if(ret != MBTK_RIL_ERR_SUCCESS)
+    {
+        QSER_LOGE("[%s] mbtk_data_call_start() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
+        *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        *err = QSER_DATA_CALL_ERROR_NONE;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
+{
+    if(data_call == NULL || err == NULL)
+    {
+        QSER_LOGE("[%s] data_call or err is NULL.", QSER_DATA_CALL_FUNC);
+        if(err != NULL)
+        {
+            *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        }
+        return QSER_RESULT_FAIL;
+    }
+
+    pthread_attr_t thread_attr;
+    pthread_t data_call_thread_id;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        *err = QSER_DATA_CALL_ERROR_NO_INIT;
+        return QSER_RESULT_SERVER_NO_INIT;
+    }
+
+    pthread_attr_init(&thread_attr);
+    if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
+    {
+        QSER_LOGE("[%s] pthread_attr_setdetachstate() fail.", QSER_DATA_CALL_FUNC);
+        *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pthread_create(&data_call_thread_id, &thread_attr, qser_data_call_async_thread, (void *) data_call))
+    {
+        QSER_LOGE("[%s] pthread_create() fail.", QSER_DATA_CALL_FUNC);
+        *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+        return QSER_RESULT_FAIL;
+    }
+    pthread_attr_destroy(&thread_attr);
+    
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
+{
+    UNUSED(ip_family);
+ 
+    if(err == NULL)
+    {
+        QSER_LOGE("[%s] err is NULL.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        *err = QSER_DATA_CALL_ERROR_NO_INIT;
+        return QSER_RESULT_SERVER_NO_INIT;
+    }
+
+    ret = mbtk_data_call_stop(data_call_handle->handle, (mbtk_ril_cid_enum)(profile_idx + 1), 15);
+    if(ret != MBTK_RIL_ERR_SUCCESS)
+    {
+        QSER_LOGE("[%s] mbtk_data_call_stop() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
+        *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        *err = QSER_DATA_CALL_ERROR_NONE;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
+        qser_data_call_info_s *info, qser_data_call_error_e *err)
+{
+    UNUSED(ip_family);
+
+    if(info == NULL || err == NULL)
+    {
+        QSER_LOGE("[%s] info or err is NULL.", QSER_DATA_CALL_FUNC);
+        if(err != NULL)
+        {
+            *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        }
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    mbtk_ip_info_t ip_info;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        *err = QSER_DATA_CALL_ERROR_NO_INIT;
+        return QSER_RESULT_SERVER_NO_INIT;
+    }
+
+#ifdef QSER_TEST
+    char v4_buff[32] = {0};
+    char v6_buff[128] = {0};
+#endif
+    memset(&ip_info, 0x0, sizeof(mbtk_ip_info_t));
+    memset(info, 0x0, sizeof(qser_data_call_info_s));
+    ret = mbtk_data_call_state_get(data_call_handle->handle, (mbtk_ril_cid_enum)(profile_idx + 1), &ip_info);
+    if(ret != MBTK_RIL_ERR_SUCCESS)
+    {
+        QSER_LOGE("[%s] mbtk_data_call_state_get fail.[%d]", QSER_DATA_CALL_FUNC, ret);
+        *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        info->profile_idx = profile_idx;
+        if(ip_info.ipv4.valid)
+        {
+            info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
+            info->v4.state = QSER_DATA_CALL_CONNECTED;
+            sprintf(info->v4.name, "ccinet%d", profile_idx);
+            info->v4.addr.ip.s_addr = ip_info.ipv4.IPAddr;
+            info->v4.addr.pri_dns.s_addr = ip_info.ipv4.PrimaryDNS;
+            info->v4.addr.sec_dns.s_addr = ip_info.ipv4.SecondaryDNS;
+            info->v4.reconnect = true;
+
+#ifdef QSER_TEST
+            //LOGE("[qser_data] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
+            if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
+                LOGE("[qser_data] IP error.");
+            } else {
+                LOGE("[qser_data] IP : %s", v4_buff);
+            }
+            if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
+                LOGE("[qser_data] PrimaryDNS error.");
+            } else {
+                LOGE("[qser_data] PrimaryDNS : %s", v4_buff);
+            }
+            if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
+                LOGE("[qser_data] SecondaryDNS error.");
+            } else {
+                LOGE("[qser_data] SecondaryDNS : %s", v4_buff);
+            }
+#endif
+        }
+
+        if(ip_info.ipv6.valid)
+        {
+            info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
+            info->v6.state = QSER_DATA_CALL_CONNECTED;
+            sprintf(info->v6.name, "ccinet%d", profile_idx);
+            memcpy(&(info->v6.addr.ip), &(ip_info.ipv6.IPV6Addr), sizeof(ip_info.ipv6.IPV6Addr));
+            memcpy(&(info->v6.addr.pri_dns), &(ip_info.ipv6.PrimaryDNS), sizeof(ip_info.ipv6.PrimaryDNS));
+            memcpy(&(info->v6.addr.sec_dns), &(ip_info.ipv6.SecondaryDNS), sizeof(ip_info.ipv6.SecondaryDNS));
+            info->v6.reconnect = true;
+            
+#ifdef QSER_TEST
+			if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
+            {
+				LOGE("[qser_data] IP error.");
+			} else {
+				LOGE("[qser_data] IP : %s", v6_buff);
+			}
+			if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
+            {
+				LOGE("[qser_data] PrimaryDNS error.");
+			} else {
+				LOGE("[qser_data] PrimaryDNS : %s", v6_buff);
+			}
+			if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
+            {
+				LOGE("[qser_data] SecondaryDNS error.");
+			} else {
+				LOGE("[qser_data] SecondaryDNS : %s", v6_buff);
+            }
+#endif
+        }
+        
+        if(ip_info.ipv4.valid && ip_info.ipv6.valid)
+        {
+            info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
+        }
+    }
+    
+    *err = QSER_DATA_CALL_ERROR_NONE;
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_set(qser_apn_info_s *apn)
+{
+    if(apn == NULL)
+    {
+        QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    mbtk_apn_info_t apninfo;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_SERVER_NO_INIT;
+    }
+
+    if(qser_apn_convert_to_mbtk_s((mbtk_ril_cid_enum)(apn->profile_idx + 1), &apninfo, apn) != QSER_RESULT_SUCCESS)
+    {
+        QSER_LOGE("[%s] qser_apn_convert_to_mbtk_s() fail.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+
+    ret = mbtk_apn_set(data_call_handle->handle, &apninfo);
+    if(ret != MBTK_RIL_ERR_SUCCESS)
+    {
+        QSER_LOGE("[%s] mbtk_apn_set() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
+{    
+    if(apn == NULL)
+    {
+        QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+
+    int i = 0;
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    mbtk_apn_info_array_t apninfo;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_SERVER_NO_INIT;
+    }
+
+    memset(&apninfo, 0x0, sizeof(mbtk_apn_info_array_t));
+    ret = mbtk_apn_get(data_call_handle->handle, &apninfo);
+    if(ret != MBTK_RIL_ERR_SUCCESS)
+    {
+        QSER_LOGE("[%s] mbtk_apn_get() fail. [%d]", QSER_DATA_CALL_FUNC, ret);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        for(i = 0; i < apninfo.num; i++)
+        {
+            if(apninfo.apns[i].cid == (mbtk_ril_cid_enum)(profile_idx + 1))
+            {
+                QSER_LOGD("[%s] find idx[%d].", QSER_DATA_CALL_FUNC, profile_idx);
+                break;
+            }
+        }
+
+        if(i == apninfo.num)
+        {
+            QSER_LOGE("[%s] not find idx, max num[%d].", QSER_DATA_CALL_FUNC, apninfo.num);
+            return QSER_RESULT_FAIL;
+        }
+
+        if(qser_apn_convert_to_qser_s(apn, &(apninfo.apns[i])) != QSER_RESULT_SUCCESS)
+        {
+            QSER_LOGE("[%s] qser_apn_convert_to_qser_s() fail.", QSER_DATA_CALL_FUNC);
+            return QSER_RESULT_FAIL;
+        }
+    }
+    
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
+{  
+    if(apn == NULL || profile_idx == NULL)
+    {
+        QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    mbtk_apn_info_t apninfo;
+    qser_apn_info_s qser_info;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_SERVER_NO_INIT;
+    }
+
+    memset(&qser_info, 0x0, sizeof(qser_apn_info_s));
+    qser_info.profile_idx = MBTK_RIL_CID_NUL;
+    qser_info.pdp_type = apn->pdp_type;
+    qser_info.auth_proto = apn->auth_proto;
+    memcpy(qser_info.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
+    memcpy(qser_info.username, apn->username, QSER_APN_USERNAME_SIZE);
+    memcpy(qser_info.password, apn->password, QSER_APN_PASSWORD_SIZE);
+    memcpy(qser_info.apn_type, apn->apn_type, QSER_APN_TYPE_SIZE);
+    if(qser_apn_convert_to_mbtk_s(MBTK_RIL_CID_NUL, &apninfo, &qser_info) != QSER_RESULT_SUCCESS)
+    {
+        QSER_LOGE("[%s] apn_convert_to_mbtk_s() fail.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+
+    ret = mbtk_apn_set(data_call_handle->handle, &apninfo);
+    if(ret != MBTK_RIL_ERR_SUCCESS)
+    {
+        QSER_LOGE("[%s] mbtk_apn_set() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
+        return QSER_RESULT_FAIL;
+    }
+    
+    *profile_idx = (unsigned char)(apninfo.cid - 1);
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_del(unsigned char profile_idx)
+{
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    mbtk_apn_info_t apninfo;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_SERVER_NO_INIT;
+    }
+
+    memset(&apninfo, 0x0, sizeof(mbtk_apn_info_t));
+    apninfo.cid = (mbtk_ril_cid_enum)(profile_idx + 1);
+    apninfo.auto_save = true;
+    ret = mbtk_apn_set(data_call_handle->handle, &(apninfo));
+    if(ret != MBTK_RIL_ERR_SUCCESS)
+    {
+        QSER_LOGE("[%s] mbtk_apn_set fail.[%d]", QSER_DATA_CALL_FUNC, ret);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_get_list(qser_apn_info_list_s *apn_list)
+{  
+    if(apn_list == NULL)
+    {
+        QSER_LOGE("[%s] apn_list param is NULL.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_FAIL;
+    }
+
+    int i = 0;
+    mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
+    mbtk_apn_info_array_t apninfo;
+    qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
+    if(NULL == data_call_handle || NULL == data_call_handle->handle)
+    {
+        QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
+        return QSER_RESULT_SERVER_NO_INIT;
+    }
+
+    memset(&apninfo, 0x0, sizeof(mbtk_apn_info_array_t));
+    ret = mbtk_apn_get(data_call_handle->handle, &apninfo);
+    if(ret != MBTK_RIL_ERR_SUCCESS && ret != MBTK_RIL_ERR_CME)
+    {
+        QSER_LOGE("[%s] mbtk_apn_get() fail. [%d]", QSER_DATA_CALL_FUNC, ret);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        if(apninfo.num > 0 && apninfo.num <= QSER_APN_MAX_LIST)
+        {
+            apn_list->cnt = 0;
+            for(i = 0; i < apninfo.num; i++)
+            {
+                if(qser_apn_convert_to_qser_s(&apn_list->apn[apn_list->cnt], &(apninfo.apns[i])) != QSER_RESULT_SUCCESS)
+                {
+                    QSER_LOGE("[%s] qser_apn_convert_to_qser_s() fail.", QSER_DATA_CALL_FUNC);
+                    return QSER_RESULT_FAIL;
+                }
+                apn_list->cnt++;
+            }
+        }
+        else if(apninfo.num > QSER_APN_MAX_LIST)
+        {
+            QSER_LOGE("[%s] apn_num overlong.", QSER_DATA_CALL_FUNC);
+            return QSER_RESULT_FAIL;
+        }
+        else
+        {
+            apn_list->cnt = 0;
+        }
+    }
+    
+    return QSER_RESULT_SUCCESS;
+}
+/*----------------------------------------------DATA CALL API------------------------------------------*/
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_fota.c b/mbtk/liblynq_lib_rilv2/lynq_fota.c
new file mode 100755
index 0000000..9b12656
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_fota.c
@@ -0,0 +1,113 @@
+#include "lynq-qser-fota.h"
+#include "mbtk_type.h"
+#include "mbtk_fota.h"
+#include "mbtk_log.h"
+
+
+char addr_buf[128]={0};
+int segment_size =0;
+
+
+int Process_flag = 0;
+
+
+int fota_cb(int status, int percent)
+{
+    LOGE("%d: percent: %d%%\n", percent/10, percent);
+    Process_flag = percent/10;
+    return 0;
+}
+
+int lynq_read_process(void)
+{
+    return Process_flag;
+}
+
+int lynq_rock_main(int first_run)
+{
+    UNUSED(first_run);
+    LOGE("%s, %d", __FUNCTION__, __LINE__);
+    int ret = 0;
+
+    LOGE("addr_buf:%s, segment_size:%d\n", addr_buf, segment_size);
+    ret = mbtk_fota_init(fota_cb);
+    if(strncmp(addr_buf, "http", 4) == 0)
+    {
+    
+        ret = mbtk_fota_fw_write_by_url(addr_buf, segment_size,10, 600);
+    }
+    else
+    {
+        ret =mbtk_fota_fw_write(addr_buf, segment_size);
+    }
+
+    if(ret)
+    {
+        LOGE("lynq_rock_main fail\n");
+        return -1;
+    }
+
+    mbtk_fota_done1(1);
+
+
+    return 0;
+}
+
+int lynq_fota_set_addr_value(char *value,int size)
+{
+    UNUSED(value);
+    UNUSED(size);
+    LOGE("%s, %d", __FUNCTION__, __LINE__);
+
+    if(value == NULL)
+    {
+        return -1;
+    }
+
+    memset(addr_buf, 0, sizeof(addr_buf));
+    memcpy(addr_buf, value, strlen(value));
+    segment_size = size;
+
+    LOGE("addr_buf:%s, value:%s\n", addr_buf, value);
+    LOGE("segment_size:%d, size:%d\n", segment_size, size);
+
+    return 0;
+}
+
+int lynq_fota_nrestart(void)
+{
+    LOGE("%s, %d", __FUNCTION__, __LINE__);
+    int ret = 0;
+
+    LOGE("addr_buf:%s", addr_buf);
+    ret = mbtk_fota_init(fota_cb);
+    if(strncmp(addr_buf, "http", 4) == 0)
+    {
+        ret = mbtk_fota_fw_write_by_url(addr_buf, segment_size,10, 600);
+    }
+    else
+    {
+        ret =mbtk_fota_fw_write(addr_buf, segment_size);
+    }
+
+    if(ret)
+    {
+        LOGE("lynq_fota_nrestart fail\n");
+        return -1;
+    }
+
+    return 0;
+}
+
+int lynq_get_upgrade_status(void)
+{
+    LOGE("%s, %d", __FUNCTION__, __LINE__);
+
+    return mbtk_fota_status();
+}
+
+int lynq_get_reboot_upgrade_status(void)
+{
+    return mbtk_fota_get_asr_reboot_cnt_flag();
+}
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_gnss.c b/mbtk/liblynq_lib_rilv2/lynq_gnss.c
new file mode 100755
index 0000000..37b3074
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_gnss.c
@@ -0,0 +1,519 @@
+#include <time.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lynq_gnss.h"
+
+#define QSER_RESULT_SUCCESS 0
+#define QSER_RESULT_FAIL -1
+#define QSER_GNSS_TIMEOUT 5
+#define QSER_AGNSS_DOWNLOAD_TIMEPUT 60
+#define QSER_AGNSS_INJECT_TIMEOUT 20
+
+/**********************************VARIABLE***********************************/
+static bool inited = FALSE;
+static uint32_t qser_h_gnss = 0x5F6F7F8F;
+gnss_handler_func_t qser_gnss_callback = NULL;
+static time_t qser_gnss_time = 0;
+qser_agps_info qser_agps_info_save = {0};
+gnss_async_func_t qser_gnss_async_callback = NULL;
+
+extern long timezone;
+/**********************************VARIABLE***********************************/
+
+/**********************************FUNC***********************************/
+static void qser_gnss_async_set_cb(gnss_async_func_t cb)
+{
+    qser_gnss_async_callback = cb;
+}
+
+static gnss_async_func_t qser_gnss_async_get_cb(void)
+{
+    return qser_gnss_async_callback;
+}
+
+
+static time_t qser_get_timestamp(char *time)
+{
+    char tmp_char[4] = {0};
+    struct tm* tmp_time = (struct tm*)malloc(sizeof(struct tm));
+
+    memset(tmp_time, 0, sizeof(struct tm));
+    memset(tmp_char, 0, sizeof(tmp_char));
+    memcpy(tmp_char, &time[4], 2);
+    tmp_time->tm_sec = atoi(tmp_char);
+    memcpy(tmp_char, &time[2], 2);
+    tmp_time->tm_min = atoi(tmp_char);
+    memcpy(tmp_char, &time[0], 2);
+    tmp_time->tm_hour = atoi(tmp_char);
+    memcpy(tmp_char, &time[6], 2);
+    tmp_time->tm_mday = atoi(tmp_char);
+    memcpy(tmp_char, &time[8], 2);
+    tmp_time->tm_mon = atoi(tmp_char) - 1;
+    memcpy(tmp_char, &time[10], 2);
+    tmp_time->tm_year = 100 + atoi(tmp_char);
+
+    time_t _t = mktime(tmp_time);//按当地时区解析tmp_time
+    //gnss_log("timestamp: %ld\n",_t);
+    tzset();   // 自动设置本地时区
+    _t = _t - timezone;
+    //gnss_log("timestamp: %ld\n",_t);
+
+    free(tmp_time);
+    return _t;
+}
+
+static time_t qser_get_gnss_time_sec(const void *data, int data_len)
+{
+    int i = 0, num = 0;
+    const char *nmea = (const char *)data;
+    char time[15] = {0};
+    char *check_state = NULL;
+
+    //$GNRMC,024142.000,A,3039.364421,N,10403.417935,E,0.051,0.00,030124,,E,A*00
+    check_state = strstr(nmea, "RMC");
+    if(check_state != NULL)
+    {
+        for(i = 0; i < data_len; i++)
+        {
+            if(check_state[i] == ',')
+            {
+                num++;
+                i++;
+                if(num == 1)//get time
+                {
+                    if(check_state[i] >= '0' && check_state[i] <= '9')
+                    {
+                        memcpy(time, check_state + i, 6);
+                        //LOGE("[qser_gnss] %s.", time);
+                    }
+                    else
+                    {
+                        qser_gnss_time = 0;
+                        return qser_gnss_time;
+                    }
+                }
+                else if(num == 9)//get date
+                {
+                    if(check_state[i] >= '0' && check_state[i] <= '9')
+                    {
+                        memcpy(time + 6, check_state + i, 6);
+                        //LOGE("[qser_gnss] %s.", time);
+                        break;
+                    }
+                    else
+                    {
+                        qser_gnss_time = 0;
+                        return qser_gnss_time;
+                    }
+                }
+                else if(num > 9)
+                {
+                    qser_gnss_time = 0;
+                    return qser_gnss_time;
+                }
+            }
+        }
+
+        qser_gnss_time = qser_get_timestamp(time);
+    }
+
+    return qser_gnss_time;
+}
+
+static void* gnss_async_thread(void* arg)
+{
+    qser_gnss_error_e state = QSER_GNSS_ERROR_SUCCESS;
+    gnss_async_func_t cb = qser_gnss_async_get_cb();
+    int ret = qser_Gnss_Start(qser_h_gnss);
+    if(ret != QSER_RESULT_SUCCESS)
+    {
+        LOGE("[qser_gnss] gnss_async_thread() fail.");
+        state = QSER_GNSS_ERROR_FAIL;
+    }
+
+    if(cb != NULL)
+    {
+        cb(state);
+    }
+    return NULL;
+}
+
+static void gnss_callback(uint32 ind_type, const void* data, uint32 data_len)
+{
+    if(data == NULL || data_len <= 0)
+    {
+        LOGE("[qser_gnss] data is NULL.");
+        return;
+    }
+
+    if(qser_gnss_callback == NULL)
+    {
+        //LOGE("[qser_gnss] qser_gnss_callback is NULL.");
+        return;
+    }
+
+    if(ind_type == MBTK_GNSS_IND_LOCATION) {
+        if(data_len != sizeof(mbtk_gnss_location_info_t))
+		{
+			LOGE("[qser_gnss] data size error");
+			return;
+		}
+		mbtk_gnss_location_info_t *locl_info = (mbtk_gnss_location_info_t *)data;
+        mopen_location_info_t qser_locl_info;
+        memset(&qser_locl_info, 0x0, sizeof(mopen_location_info_t));
+        qser_locl_info.latitude  = locl_info->latitude;
+        qser_locl_info.longitude = locl_info->longitude;
+        qser_locl_info.altitude  = locl_info->altitude;
+        qser_locl_info.speed     = locl_info->speed;
+        qser_locl_info.bearing   = locl_info->bearing;
+        qser_locl_info.timestamp = locl_info->timestamp;
+        qser_gnss_callback(NULL, E_MT_LOC_MSG_ID_LOCATION_INFO, (void *)(&qser_locl_info), NULL);
+    } else if(ind_type == MBTK_GNSS_IND_NMEA) {
+        mopen_gnss_nmea_info_t qser_nmea = {0};
+        memset(&qser_nmea, 0x0, sizeof(mopen_gnss_nmea_info_t));
+        qser_nmea.length = data_len;
+        memcpy(qser_nmea.nmea, (char *)data, data_len);
+        qser_nmea.timestamp = qser_get_gnss_time_sec(data, data_len);
+        qser_gnss_callback(NULL, E_MT_LOC_MSG_ID_NMEA_INFO, (void *)(&qser_nmea), NULL);
+    } else {
+        printf("Unknown IND : %d\n", ind_type);
+    }
+}
+
+
+/**********************************FUNC***********************************/
+
+/**********************************API***********************************/
+int qser_Gnss_Init (uint32_t *h_gnss)
+{
+    //UNUSED(h_gnss);
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+
+    if(!inited)
+    {
+        ret = mbtk_gnss_init(gnss_callback);
+        if(ret == GNSS_ERR_OK)
+        {
+            ret = mbtk_gnss_ind_set(MBTK_GNSS_IND_NMEA, QSER_GNSS_TIMEOUT);
+            if(ret == GNSS_ERR_OK)
+            {
+                inited = TRUE;
+            }
+            else
+            {
+                LOGE("[qser_gnss] init mbtk_gnss_ind_set() fail.ret = [%d]", ret);
+                return QSER_RESULT_FAIL;
+            }
+        }
+        else
+        {
+            LOGE("[qser_gnss] mbtk_gnss_init() fail.ret = [%d]", ret);
+            return QSER_RESULT_FAIL;
+        }
+    }
+    *h_gnss = qser_h_gnss;
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_Deinit (uint32_t h_gnss)
+{
+    //UNUSED(h_gnss);
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+
+    if(inited)
+    {
+        ret = mbtk_gnss_deinit();
+        if(ret == GNSS_ERR_OK)
+        {
+            inited = FALSE;
+        }
+        else
+        {
+            LOGE("[qser_gnss] mbtk_gnss_init() fail.ret = [%d]", ret);
+            return QSER_RESULT_FAIL;
+        }
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_AddRxIndMsgHandler (gnss_handler_func_t handler_ptr,uint32_t h_gnss)
+{
+    //UNUSED(handler_ptr);
+    //UNUSED(h_gnss);
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(handler_ptr == NULL)
+    {
+        LOGE("[qser_gnss] handler_ptr is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    qser_gnss_callback = handler_ptr;
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Set_Indications (uint32_t h_gnss,e_msg_id_t type)
+{
+    //UNUSED(h_gnss);
+    //UNUSED(type);
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_OK;
+    if(type == E_MT_LOC_MSG_ID_LOCATION_INFO)
+    {
+        ret = mbtk_gnss_ind_set(MBTK_GNSS_IND_LOCATION, QSER_GNSS_TIMEOUT);
+    }
+    else if(type == E_MT_LOC_MSG_ID_NMEA_INFO)
+    {
+        ret = mbtk_gnss_ind_set(MBTK_GNSS_IND_NMEA, QSER_GNSS_TIMEOUT);
+    }
+    else
+    {
+        LOGE("[qser_gnss] type is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_ind_set() fail.ret = [%d]", ret);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_Set_Async_Callback(gnss_async_func_t cb)
+{
+    qser_gnss_async_set_cb(cb);
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_Start (uint32_t h_gnss)
+{
+    //UNUSED(h_gnss);
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+
+    ret = mbtk_gnss_open(255, QSER_GNSS_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_open is error.ret = [%d]", ret);
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_Start_Async(uint32_t h_gnss)
+{
+    //UNUSED(h_gnss);
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    pthread_attr_t thread_attr;
+    pthread_t gnss_thread_id;
+    pthread_attr_init(&thread_attr);
+    if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
+    {
+        LOGE("[qser_gnss] pthread_attr_setdetachstate() fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
+    if(pthread_create(&gnss_thread_id, &thread_attr, gnss_async_thread, NULL))
+    {
+        LOGE("[qser_gnss] pthread_create() fail.");
+        return QSER_RESULT_FAIL;
+    }
+    pthread_attr_destroy(&thread_attr);
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_Stop (uint32_t h_gnss)
+{
+    //UNUSED(h_gnss);
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    ret = mbtk_gnss_close(QSER_GNSS_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_close is error.ret = [%d]", ret);
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info)
+{
+    //UNUSED(h_gnss);
+    UNUSED(time_info);
+
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags)
+{
+    //UNUSED(h_gnss);
+    //UNUSED(flags);
+
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_Server_Configuration(char *host, char *id, char *password)
+{
+    //UNUSED(host);
+    //UNUSED(id);
+    //UNUSED(password);
+
+    if(!inited)
+    {
+        LOGE("[qser_gnss] api not init.");
+        return QSER_RESULT_FAIL;
+    }
+
+    memset(qser_agps_info_save.host, 0x0, QSER_LEN_MAX);
+    if(host != NULL && strlen(host) > 0 && strlen(host) < QSER_LEN_MAX)
+    {
+        memcpy(qser_agps_info_save.host, host, strlen(host));
+    }
+
+    memset(qser_agps_info_save.id, 0x0, QSER_LEN_MAX);
+    if(id != NULL && strlen(id) > 0 && strlen(id) < QSER_LEN_MAX)
+    {
+        memcpy(qser_agps_info_save.id, id, strlen(id));
+    }
+
+    memset(qser_agps_info_save.passwd, 0x0, QSER_LEN_MAX);
+    if(password != NULL && strlen(password) > 0 && strlen(password) < QSER_LEN_MAX)
+    {
+        memcpy(qser_agps_info_save.passwd, password, strlen(password));
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    char write_buff[512] = {0};
+//    int write_length = 0;
+    snprintf(write_buff, 512, "$AGPSCFG,%s,%s,%s", strlen(qser_agps_info_save.host) > 0 ? qser_agps_info_save.host : "NULL",
+                                                        strlen(qser_agps_info_save.id) > 0 ? qser_agps_info_save.id : "NULL",
+                                                        strlen(qser_agps_info_save.passwd) > 0 ? qser_agps_info_save.passwd : "NULL");
+    ret = mbtk_gnss_setting(write_buff, QSER_GNSS_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_download_tle()
+{
+    if(!inited)
+    {
+        LOGE("[qser_gnss] api not init.");
+        return QSER_RESULT_FAIL;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    ret = mbtk_gnss_eph_download(QSER_AGNSS_DOWNLOAD_TIMEPUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_eph_download fail.ret = [%d]", ret);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_injectEphemeris(uint32_t h_gnss)
+{
+    //UNUSED(h_gnss);
+
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    ret = mbtk_gnss_eph_inject(QSER_AGNSS_INJECT_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_eph_inject fail.ret = [%d]", ret);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency)
+{
+    //UNUSED(h_gnss);
+    //UNUSED(frequency);
+
+    if(h_gnss != qser_h_gnss)
+    {
+        LOGE("[qser_gnss] h_gnss is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(frequency != 1 && frequency != 2 && frequency != 5)
+    {
+        LOGE("[qser_gnss] frequency out of range.");
+        return QSER_RESULT_FAIL;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    char param_buf[32] = {0};
+//    int  length = 0;
+    snprintf(param_buf, 32, "$FREQCFG,%d", frequency);
+    ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+/**********************************API***********************************/
+
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_gpio.c b/mbtk/liblynq_lib_rilv2/lynq_gpio.c
new file mode 100755
index 0000000..ae6ee19
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_gpio.c
@@ -0,0 +1,337 @@
+#include "mbtk_type.h"
+#include "lynq-gpio.h"
+#include "unistd.h"
+#include "fcntl.h"
+#include "mbtk_log.h"
+
+#include <errno.h>
+static int gpio_export(int gpio)
+{
+//    int index=0;
+    int file=-1;
+    int result =-1;
+    char pin_index_buffer[5]= {0};
+
+    char buffer[50];
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    if(access(buffer , F_OK) == 0)
+    {
+        LOGD("%d has export.", gpio);
+        return 0;
+    }
+
+    file = open("/sys/class/gpio/export",O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio export file fail.");
+        return -1;
+    }
+
+    memset(pin_index_buffer,0,5);
+    sprintf(pin_index_buffer,"%d", gpio);
+    result = write(file,pin_index_buffer,strlen(pin_index_buffer));
+    if(result < 0)
+    {
+        LOGE("Gpio[%d] export fail. err = %d", gpio, errno);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+static int gpio_unexport(int gpio)
+{
+//    int index=0;
+    int file=-1;
+    int result =-1;
+    char pin_index_buffer[5]= {0};
+    char buffer[50];
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    if(access(buffer , F_OK) == -1)
+    {
+        LOGD("%d not export.", gpio);
+        return 0;
+    }
+
+    file = open("/sys/class/gpio/unexport",O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio unexport file fail.");
+        return -1;
+    }
+
+    memset(pin_index_buffer,0,5);
+    sprintf(pin_index_buffer,"%d", gpio);
+    result=write(file,pin_index_buffer,strlen(pin_index_buffer));
+    if(result < 0)
+    {
+        close(file);
+        LOGE("Gpio[%d] unexport fail.", gpio);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+#if 0
+static int gpio_direct_get(int gpio, char *value, int value_size)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    file = open(buffer, O_RDONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio[%d] direct fail.", gpio);
+        return -1;
+    }
+
+    memset(value, 0x0, value_size);
+    result = read(file,value,value_size);
+    if(result <= 0)
+    {
+        LOGE("Get gpio[%d] direct fail.", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+#endif
+
+static int gpio_direct_set(int gpio, char *value)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    file = open(buffer, O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio[%d] direct fail.", gpio);
+        return -1;
+    }
+
+    result = write(file,value,strlen(value));
+    if(result != strlen(value))
+    {
+        LOGE("Set gpio[%d] direct fail.", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+static int gpio_value_get(int gpio)
+{
+    char buffer[50];
+    int fd =-1;
+
+    memset(buffer, 0, sizeof(buffer));
+    sprintf(buffer, "/sys/class/gpio/gpio%d/value", gpio);
+    fd = open(buffer, O_RDONLY);
+    if(fd == -1)
+    {
+        LOGE("Open gpio[%d] fail.", gpio);
+        return -1;
+    }
+
+    memset(buffer, 0, sizeof(buffer));
+    if(read(fd, buffer, sizeof(buffer)) <= 0)
+    {
+        LOGE("Get gpio[%d] value fail", gpio);
+        close(fd);
+        return -1;
+    }
+
+    close(fd);
+    return atoi(buffer);
+}
+
+static int gpio_value_set(int gpio, int value)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
+    file = open(buffer,O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio[%d] value fail.", gpio);
+        return -1;
+    }
+    if(value == 0) {
+        result = write(file,"0",1);
+    } else {
+        result = write(file,"1",1);
+    }
+    if(result != 1)
+    {
+        LOGE("Set gpio[%d] value fail err =%d.", gpio, errno);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+
+int lynq_gpio_init(int gpio, int direction, int value, int pullsel)
+{
+    //UNUSED(gpio);
+    //UNUSED(direction);
+    //UNUSED(value);
+    UNUSED(pullsel);
+
+    if (direction != 1 && direction != 0)
+    {
+        LOGE("[lynq_gpio_init] direction fail.");
+        return -1;
+    }
+
+    if (value != 1 && value != 0)
+    {
+        LOGE("[lynq_gpio_init] value fail.");
+        return -1;
+    }
+
+    if(gpio_export(gpio))
+    {
+        LOGE("[lynq_gpio_init]gpio_export fail.");
+        return -1;
+    }
+
+    if(gpio_direct_set(gpio, direction == 0 ? "in" : "out"))
+    {
+        LOGE("[lynq_gpio_init]gpio_direct_set fail.");
+        return -1;
+    }
+
+    if(direction == 1 && (gpio_value_set(gpio, value) != 0))
+    {
+        LOGE("[lynq_gpio_init]gpio_value_set fail.");
+        return -1;
+    }
+
+
+    return 0;
+}
+
+int lynq_gpio_deinit(int gpio)
+{
+    UNUSED(gpio);
+
+    if(gpio_unexport(gpio))
+    {
+        LOGE("[lynq_gpio_deinit]gpio_unexport fail.");
+        return -1;
+    }
+
+    return 0;
+}
+
+int lynq_gpio_direction_set(int gpio, int direction)
+{
+    //UNUSED(gpio);
+    //UNUSED(direction);
+
+    if(gpio_direct_set(gpio, direction == 0 ? "in" : "out"))
+    {
+        LOGE("[lynq_gpio_direction_set]gpio_direct_set fail.");
+        return -1;
+    }
+
+    return 0;
+}
+
+
+int lynq_gpio_value_set(int gpio, int value)
+{
+    //UNUSED(gpio);
+    //UNUSED(value);
+
+    if(gpio_value_set(gpio, value))
+    {
+        LOGE("[lynq_gpio_value_set]gpio_value_set fail.");
+        return -1;
+    }
+
+    return 0;
+}
+
+int lynq_gpio_value_get(int gpio)
+{
+    //UNUSED(gpio);
+    int ret = -1;
+
+    ret = gpio_value_get(gpio);
+    if (ret == -1)
+    {
+        LOGE("[lynq_gpio_value_get]gpio_value_get fail.");
+        return -1;
+    }
+
+    return ret;
+}
+
+int lynq_gpio_pullsel_set(int gpio, int pullsel)
+{
+    //UNUSED(gpio);
+    //UNUSED(pullsel);
+    int ret = -1;
+    int value_t;
+
+    if (pullsel == 1)
+        value_t = 0;
+    else if (pullsel == 2)
+        value_t = 1;
+    else
+    {
+        LOGE("[lynq_gpio_pullsel_set] value_t fail.");
+        return -1;
+    }
+
+    ret = gpio_value_set(gpio, value_t);
+    if(ret == -1)
+    {
+        LOGE("[lynq_gpio_pullsel_set]gpio_value_set() fail.");
+        return -1;
+    }
+
+    return ret;
+}
+
+
+int lynq_gpio_pullsel_get(int gpio)
+{
+    //UNUSED(gpio);
+    int ret = -1;
+
+    ret = gpio_value_get(gpio);
+    if (ret == -1)
+    {
+        LOGE("[lynq_gpio_pullsel_get]gpio_value_get() fail.");
+        return -1;
+    }
+
+    return ret + 1;
+}
+
+
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_irq.c b/mbtk/liblynq_lib_rilv2/lynq_irq.c
new file mode 100755
index 0000000..4e42e07
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_irq.c
@@ -0,0 +1,475 @@
+#include "lynq-irq.h"
+#include "mbtk_type.h"
+#include "mbtk_info_api.h"
+#include "mbtk_log.h"
+
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+
+// #define _GNU_SOURCE
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <poll.h>
+
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/sysmacros.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+
+struct libirq_info {
+	unsigned int 	line;
+	unsigned int 	type;
+	int 			wake;
+	int				fd;
+	irq_handler 	handler;
+	unsigned int 	used;
+};
+
+struct libirq_context {
+	unsigned int		inited;
+	int					fd;
+	pthread_t 			th;
+	struct libirq_info	info[SC_LIBIRQ_MAX];
+};
+static struct libirq_context irq_ctx = {0};
+
+#define irq_init()			irq_ctx.inited
+#define line_used(l)		irq_ctx.info[l].used
+#define irq_fd(l)			irq_ctx.info[l].fd
+#define libirq_fd()			irq_ctx.fd
+
+static void *libirq_loop(void *arg)
+{
+	unsigned int int_status = 0;
+	int fd = libirq_fd();
+	int ret = 0;
+	int i;
+
+	while(1) {
+	    ret = ioctl(fd, SC_IRQ_GET_STATUS, &int_status);
+		if (ret < 0) {
+			LOGE("libirq_loop get status failed:%d", ret);
+		} else {
+/*			printf("libirq_loop get status :0x%x\n", int_status); */
+		}
+
+		for (i=0; i<SC_LIBIRQ_MAX; i++) {
+			if ((int_status & (1<<i)) && line_used(i) && irq_ctx.info[i].handler) {
+				irq_ctx.info[i].handler();
+
+			    ret = ioctl(fd, SC_IRQ_CLEAR_STATUS, 0);
+				if (ret < 0) {
+					LOGE("libirq_loop clear status failed:%d", ret);
+				}
+			}
+		}
+	}
+
+	return NULL;
+}
+
+static int libirq_init_thread(void)
+{
+	int ret = 0;
+	pthread_attr_t attribute;
+
+    pthread_attr_init(&attribute);
+    pthread_attr_setstacksize(&attribute, 32*1024);
+
+	ret = pthread_create(&irq_ctx.th, &attribute, libirq_loop, NULL);
+	if(ret) {
+		return ret;
+	}
+
+	return 0;
+}
+
+/*
+ *  Add a handler for an interrupt line.
+ *
+ *  line      		:  The interrupt line
+ *  handler         :  Function to be called when the IRQ occurs.
+ *  trig_type		:  rising edge or fallling edge
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_install(unsigned int line, irq_handler handler, int trig_type)
+{
+	int fd;
+	struct libirq_info *info;
+	char *usr_name;
+	int ret = 0;
+
+	if ((line >= SC_LIBIRQ_MAX) || (handler == NULL) || (trig_type >= SC_LIBIRQ_TYPE_MAX))
+		return -EINVAL;
+
+	if (line_used(line))
+		return -EEXIST;
+
+	ret = asprintf(&usr_name, "%s%d", SC_IRQ_DEV, line);
+	if (ret < 0) {
+		return -ENOMEM;
+	}
+
+	fd = open(usr_name, O_RDWR);
+	if(fd < 0) {
+		free(usr_name);
+		return -ENODEV;
+	}
+	irq_fd(line) = fd;
+	free(usr_name);
+	info = &irq_ctx.info[line];
+	info->line = line;
+	info->type = trig_type;
+	info->handler = handler;
+
+    if (ioctl(fd, SC_IRQ_INSTALL, trig_type) < 0) {
+        return -EPERM;
+    }
+
+	line_used(line) = 1;
+
+	if (!irq_init()) {
+		ret = libirq_init_thread();
+		if (ret) {
+			LOGE("libirq_init_thread, err:%d", ret);
+			return ret;
+		}
+
+		libirq_fd() = fd;
+		irq_init() = 1;
+	}
+
+	return 0;
+}
+
+/*
+ *  free an interrupt allocated with sc_irq_install.
+ *
+ *  line      		:  The interrupt line
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_uninstall(unsigned int line)
+{
+	int fd;
+
+	if (line >= SC_LIBIRQ_MAX)
+		return -EINVAL;
+
+	if (!line_used(line))
+		return -ENODEV;
+
+    if (ioctl(irq_fd(line), SC_IRQ_UNINSTALL, 0) < 0) {
+        return -EPERM;
+    }
+
+	fd = libirq_fd();
+	if (fd)
+		close(fd);
+
+	line_used(line) = 0;
+
+	return 0;
+}
+
+/*
+ *  set the irq trigger type for an irq.
+ *
+ *  line      		:  The interrupt line
+ *  trig_type		:  edge or level type
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_set_type(unsigned int line, int trig_type)
+{
+	struct libirq_info *info;
+
+	if ((line >= SC_LIBIRQ_MAX) || (trig_type >= SC_LIBIRQ_TYPE_MAX))
+		return -EINVAL;
+
+	if (!line_used(line))
+		return -EEXIST;
+
+	info = &irq_ctx.info[line];
+	//if (info->type != trig_type) {
+	    if (ioctl(irq_fd(line), SC_IRQ_SET_TYPE, trig_type) < 0) {
+			return -EPERM;
+		}
+	//}
+
+	info->type = trig_type;
+
+	return 0;
+}
+
+/*
+ *  get the irq trigger type for an irq.
+ *
+ *  line      		:  The interrupt line
+ *  trig_type		:  edge or level type
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_get_type(unsigned int line, int *trig_type)
+{
+	struct libirq_info *info;
+
+	if ((line >= SC_LIBIRQ_MAX) || !trig_type)
+		return -EINVAL;
+
+	if (!line_used(line))
+		return -EEXIST;
+
+	info = &irq_ctx.info[line];
+	*trig_type = info->type;
+
+	return 0;
+}
+
+/*
+ *  control irq power management wakeup.
+ *
+ *  line      		:  The interrupt line
+ *  en				:  enable/disable power management wakeup
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_set_wake(unsigned int line, int en)
+{
+	struct libirq_info *info;
+
+	if (line >= SC_LIBIRQ_MAX)
+		return -EINVAL;
+
+	if (!line_used(line))
+		return -EEXIST;
+
+	info = &irq_ctx.info[line];
+	if (info->wake != en) {
+	    if (ioctl(irq_fd(line), SC_IRQ_SET_WAKE, en) < 0) {
+			return -EPERM;
+		}
+	}
+
+	info->wake = en;
+
+	return 0;
+}
+
+/*
+ *  get the irq awake status for an irq.
+ *
+ *  line      		:  The interrupt line
+ *  en				:  enable/disable power management wakeup
+ *
+ *  return 0 if succeed, others failed
+ */
+int sc_irq_get_wake(unsigned int line, int *en)
+{
+	struct libirq_info *info;
+	unsigned int wake;
+
+	if (line >= SC_LIBIRQ_MAX)
+		return -EINVAL;
+
+	if (!line_used(line))
+		return -EEXIST;
+
+	if (ioctl(irq_fd(line), SC_IRQ_GET_WAKE, &wake) < 0) {
+		return -EPERM;
+	}
+
+	info = &irq_ctx.info[line];
+	info->wake = wake;
+	*en = wake;
+
+	return 0;
+}
+
+
+
+
+/*****************************************
+* @brief:lynq_irq_install
+* @param count [IN]:2
+* @param sum [OUT]:NA
+* @return :success 0, failed other
+* @todo:NA
+* @see:NA
+* @warning:NA
+******************************************/
+
+int lynq_irq_install(int line, irq_handler irq_test_handler, trig_type_e trig_type)
+{
+    int ret;
+
+    if (trig_type != 0 && trig_type != 1)
+    {
+        LOGE("lynq_irq_install error trig_type:%d", trig_type);
+        return -1;
+    }
+
+    line = line-117;
+    if (line < 0)
+    {
+        LOGE("lynq_irq_install error line:%d", line);
+        return -1;
+    }
+
+    ret = sc_irq_install(line, irq_test_handler, trig_type);
+    if (ret != 0)
+    {
+        LOGE("do_install_irq failed, ret:%d", ret);
+        return ret;
+    }
+    return 0;
+}
+
+
+/*****************************************
+* @brief:lynq_irq_uninstall
+* @param count [IN]:2
+* @param sum [OUT]:NA
+* @return :success 0, failed other
+* @todo:NA
+* @see:NA
+* @warning:NA
+******************************************/
+
+int lynq_irq_uninstall(int line)
+{
+    int ret;
+
+	line = line-117;
+    ret = sc_irq_uninstall(line);
+    if (ret != 0)
+    {
+        LOGE("unistall failed, ret:%d", ret);
+        return ret;
+    }
+    LOGI("uninstall irq(%d) ok", line);
+    return 0;
+}
+
+
+/*****************************************
+* @brief:lynq_irq_set_type
+* @param count [IN]:2
+* @param sum [OUT]:NA
+* @return :success 0, failed other
+* @todo:NA
+* @see:NA
+* @warning:NA
+******************************************/
+int lynq_irq_set_type(int line, int trig_type)
+{
+    int ret;
+
+    if (trig_type != 0 && trig_type != 1)
+    {
+        LOGE("lynq_irq_set_type error trig_type:%d", trig_type);
+        return -1;
+    }
+
+	line = line-117;
+    ret = sc_irq_set_type(line, trig_type);
+    if (ret != 0)
+    {
+        LOGE("set_type failed, ret:%d", ret);
+        return ret;
+    }
+    return 0;
+
+}
+
+/*****************************************
+* @brief:lynq_irq_get_type
+* @param count [IN]:1
+* @param sum [OUT]:NA
+* @return :success >= 0, failed other
+* @todo:NA
+* @see:NA
+* @warning:NA
+******************************************/
+int lynq_irq_get_type(int line)
+{
+    int ret;
+    int trig_type;
+
+    line = line-117;
+    ret = sc_irq_get_type(line, &trig_type);
+    if (ret != 0)
+    {
+        LOGE("get_type failed, ret:%d", ret);
+        return ret;
+    }
+    LOGI("get_type readback(%d)", trig_type);
+    return trig_type;
+}
+
+
+/*****************************************
+* @brief:lynq_irq_set_wake
+* @param count [IN]:2
+* @param sum [OUT]:NA
+* @return :success 0, failed other
+* @todo:NA
+* @see:NA
+* @warning:NA
+******************************************/
+int lynq_irq_set_wake(int line, int en)
+{
+    int ret;
+
+    if((en != 0) && (en != 1))
+    {
+        LOGE("wake_state is not 0 or 1");
+        return -1;
+    }
+
+    line = line-117;
+    ret = sc_irq_set_wake(line, en);
+    if (ret != 0)
+    {
+        LOGE("set_wake failed, ret:%d", ret);
+        return ret;
+    }
+    return 0;
+}
+
+/*****************************************
+* @brief:lynq_irq_get_wake
+* @param count [IN]:1
+* @param sum [OUT]:NA
+* @return :success >= 0, failed other
+* @todo:NA
+* @see:NA
+* @warning:NA
+******************************************/
+int lynq_irq_get_wake(int line)
+{
+    int ret;
+    int en;
+
+    line = line-117;
+    ret = sc_irq_get_wake(line, &en);
+    if (ret != 0)
+    {
+        LOGE("get_wake failed, ret:%d", ret);
+        return ret;
+    }
+    LOGI("get_wake readback(%d)", en);
+    return en;
+}
+
+
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_log.c b/mbtk/liblynq_lib_rilv2/lynq_log.c
new file mode 100755
index 0000000..b844490
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_log.c
@@ -0,0 +1,640 @@
+#include <stdarg.h>
+#include <sys/un.h>
+#include <sys/socket.h>
+#include "json-c/json.h"
+#include "lynq_deflog.h"
+#include "mbtk_type.h"
+#include <signal.h>
+#include "mbtk_utils.h"
+
+#define LOG_CONFIG_PATH     "/etc/mbtk/mbtk_log.json"
+#define SYSLOG_PATCH "syslog"
+#define SYSLOG_NAME "syslog"
+#define SYSLOG_INDEX 0
+
+#define RADIOLOG_NAME "radio"
+#define RADIO_INDEX 1
+
+void lynq_log_configuration_init(const char *log_name)
+{
+    //UNUSED(log_name);
+    mbtk_log_init(SYSLOG_PATCH, (char*)log_name);
+}
+
+void lynq_log_global_output(log_level_enum Level,const char *format,...)
+{
+    va_list args;
+    va_start(args,format);
+    mbtk_log(Level, format, args);
+    va_end(args);
+}
+
+const char* lynq_read_log_version()
+{
+    return "LOG-V1.0";
+}
+
+int lynq_syslog_set_file_size(int value)
+{
+//    UNUSED(value);
+    json_object* jsonobj = NULL;
+    json_object* tmpjson = NULL;
+    json_object* datajson = NULL;
+    json_object* listjson = NULL;
+
+    int tmp_int;
+    const char* tmp_string = NULL;
+
+    if(value < 1)
+    {
+        value = 1;
+    }
+    else if(value > 100)
+    {
+        value = 100;
+    }
+    value = value*1024;
+
+    jsonobj = json_object_from_file(LOG_CONFIG_PATH);
+    if (NULL == jsonobj) {
+        printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
+        mbtk_system("echo Can't open config file > /dev/console");
+        return -1;
+    }
+    /***获取data***/
+    json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
+    datajson = json_object_array_get_idx(tmpjson, SYSLOG_INDEX);
+    if (NULL == datajson) {
+        json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+        json_object_put(jsonobj);
+        printf("NULL == datajson\n");
+        mbtk_system("echo NULL == datajson > /dev/console");
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "name", &listjson);
+    tmp_string = json_object_get_string(listjson);
+
+    json_object_object_get_ex(datajson, "enable", &listjson);
+    tmp_int = json_object_get_int(listjson);
+
+    if(strcmp(tmp_string, SYSLOG_NAME) != 0 || tmp_int != 1)
+    {
+        json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+        json_object_put(jsonobj);
+        printf("SYSLOG_NAME error, tmp_int != 1\n");
+        mbtk_system("echo SYSLOG_NAME error, tmp_int != 1 > /dev/console");
+        return -1;
+    }
+
+    json_object_object_add(datajson, "rotate_file_size", json_object_new_int(value));
+
+    /***释放json对象***/
+    json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+    json_object_put(jsonobj);
+    return 0;
+}
+
+int lynq_syslog_get_file_size(void)
+{
+    json_object* jsonobj = NULL;
+    json_object* tmpjson = NULL;
+    json_object* datajson = NULL;
+    json_object* listjson = NULL;
+
+    int tmp_int;
+    const char* tmp_string = NULL;
+
+    jsonobj = json_object_from_file(LOG_CONFIG_PATH);
+    if (NULL == jsonobj) {
+        printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
+        return -1;
+    }
+    /***获取data***/
+    json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
+    datajson = json_object_array_get_idx(tmpjson, SYSLOG_INDEX);
+    if (NULL == datajson) {
+        json_object_put(jsonobj);
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "name", &listjson);
+    tmp_string = json_object_get_string(listjson);
+
+    json_object_object_get_ex(datajson, "enable", &listjson);
+    tmp_int = json_object_get_int(listjson);
+
+    if(strcmp(tmp_string, SYSLOG_NAME) != 0 || tmp_int != 1)
+    {
+        json_object_put(jsonobj);
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "rotate_file_size", &listjson);
+    tmp_int = json_object_get_int(listjson);
+
+    /***释放json对象***/
+    json_object_put(jsonobj);
+
+    return tmp_int/1024;
+//    return tmp_int;
+}
+
+int lynq_syslog_set_file_rotate(int value)
+{
+    //UNUSED(value);
+
+    json_object* jsonobj = NULL;
+    json_object* tmpjson = NULL;
+    json_object* datajson = NULL;
+    json_object* listjson = NULL;
+
+    int tmp_int;
+    const char* tmp_string = NULL;
+
+    if(value < 0)
+    {
+        value = 0;
+    }
+    else if(value > 99)
+    {
+        value = 99;
+    }
+
+    jsonobj = json_object_from_file(LOG_CONFIG_PATH);
+    if (NULL == jsonobj) {
+        printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
+        return -1;
+    }
+    /***获取data***/
+    json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
+    datajson = json_object_array_get_idx(tmpjson, SYSLOG_INDEX);
+    if (NULL == datajson) {
+        json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+        json_object_put(jsonobj);
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "name", &listjson);
+    tmp_string = json_object_get_string(listjson);
+
+    json_object_object_get_ex(datajson, "enable", &listjson);
+    tmp_int = json_object_get_int(listjson);
+
+    if(strcmp(tmp_string, SYSLOG_NAME) != 0 || tmp_int != 1)
+    {
+        json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+        json_object_put(jsonobj);
+        return -1;
+    }
+
+    json_object_object_add(datajson, "rotate_file_count", json_object_new_int(value));
+
+    /***释放json对象***/
+    json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+    json_object_put(jsonobj);
+    return 0;
+}
+
+int lynq_syslog_get_file_rotate(void)
+{
+    json_object* jsonobj = NULL;
+    json_object* tmpjson = NULL;
+    json_object* datajson = NULL;
+    json_object* listjson = NULL;
+
+    int tmp_int;
+    const char* tmp_string = NULL;
+
+    jsonobj = json_object_from_file(LOG_CONFIG_PATH);
+    if (NULL == jsonobj) {
+        printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
+        return -1;
+    }
+    /***获取data***/
+    json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
+    datajson = json_object_array_get_idx(tmpjson, SYSLOG_INDEX);
+    if (NULL == datajson) {
+        json_object_put(jsonobj);
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "name", &listjson);
+    tmp_string = json_object_get_string(listjson);
+
+    json_object_object_get_ex(datajson, "enable", &listjson);
+    tmp_int = json_object_get_int(listjson);
+
+    if(strcmp(tmp_string, SYSLOG_NAME) != 0 || tmp_int != 1)
+    {
+        json_object_put(jsonobj);
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "rotate_file_count", &listjson);
+    tmp_int = json_object_get_int(listjson);
+
+    /***释放json对象***/
+    json_object_put(jsonobj);
+
+    return tmp_int;
+}
+
+log_level_enum filter_char_to_pri(char c)
+{
+    switch (c) {
+        case 'v':
+            return LOG_VERBOSE;
+        case 'd':
+            return LOG_DEBUG;
+        case 'i':
+            return LOG_INFO;
+        case 'w':
+            return LOG_WARNING;
+        case 'e':
+            return LOG_ERROR;
+        case '*':
+        default:
+            return LOG_LEVEL_MAX;
+    }
+}
+
+char filter_pri_to_char(log_level_enum level)
+{
+    char char_level;
+    switch (level) {
+        case LOG_VERBOSE:
+            char_level = 'v';
+            break;
+        case LOG_DEBUG:
+            char_level = 'd';
+            break;
+        case LOG_UNSET:
+        case LOG_INFO:
+            char_level = 'i';
+            break;
+        case LOG_WARNING:
+            char_level = 'w';
+            break;
+        case LOG_ERROR:
+            char_level = 'e';
+            break;
+        case LOG_LEVEL_MAX:
+        default:
+            char_level = '*';
+            break;
+    }
+    return char_level;
+}
+
+int lynq_set_log_level(const char * module_name, log_level_enum level)
+{
+    json_object* jsonobj = NULL;
+    json_object* tmpjson = NULL;
+    json_object* datajson = NULL;
+    json_object* listjson = NULL;
+    json_object* fileterjson = NULL;
+    json_object* fileter_listjson = NULL;
+    json_object* new_fileter = NULL;
+
+    int n = 0, array_length = 0;
+    char* tmp_string = NULL;
+    char level_string[5] = {'\0'};
+
+    jsonobj = json_object_from_file(LOG_CONFIG_PATH);
+    if (NULL == jsonobj) {
+        printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
+        return -1;
+    }
+    /***获取data***/
+    json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
+    datajson = json_object_array_get_idx(tmpjson, SYSLOG_INDEX);
+    if (NULL == datajson) {
+        json_object_put(jsonobj);
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "filter_list", &listjson);
+    if (NULL == listjson) {
+        printf("%s %d: object failure!\n", __FUNCTION__, __LINE__);
+        json_object_put(listjson);
+        return -1;
+    }
+    array_length = json_object_array_length(listjson);
+    for (n = 0; n <= array_length; n++) {
+        fileterjson = json_object_array_get_idx(listjson, n);
+        if (NULL == fileterjson) {
+            new_fileter = json_object_new_object();
+            sprintf(level_string, "%c", filter_pri_to_char(level));
+            json_object_object_add(new_fileter, "priority", json_object_new_string(level_string));
+            json_object_object_add(new_fileter, "tag", json_object_new_string(module_name));
+            json_object_array_add(listjson, new_fileter);
+            break;
+        }
+
+        json_object_object_get_ex(fileterjson, "tag", &fileter_listjson);
+        const char *str = json_object_get_string(fileter_listjson);
+        if (str) {
+            tmp_string = strdup(str);
+            if(strcmp(module_name, tmp_string) == 0)
+            {
+                sprintf(level_string, "%c", filter_pri_to_char(level));
+                json_object_object_add(fileterjson, "priority", json_object_new_string(level_string));
+                json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+                json_object_put(jsonobj);
+                return 0;
+            }
+        }
+        else
+        {
+            continue;
+        }
+    }
+    /***释放json对象***/
+    json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+    json_object_put(jsonobj);
+
+    return 0;
+}
+
+int lynq_get_log_level(const char * module_name, log_level_enum *level)
+{
+    json_object* jsonobj = NULL;
+    json_object* tmpjson = NULL;
+    json_object* datajson = NULL;
+    json_object* listjson = NULL;
+    json_object* fileterjson = NULL;
+    json_object* fileter_listjson = NULL;
+
+    int n;
+    char* tmp_string = NULL;
+
+    jsonobj = json_object_from_file(LOG_CONFIG_PATH);
+    if (NULL == jsonobj) {
+        printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
+        return -1;
+    }
+    /***获取data***/
+    json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
+    datajson = json_object_array_get_idx(tmpjson, SYSLOG_INDEX);
+    if (NULL == datajson) {
+        json_object_put(jsonobj);
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "filter_list", &listjson);
+    if (NULL == listjson) {
+        printf("%s %d: object failure!\n", __FUNCTION__, __LINE__);
+        json_object_put(listjson);
+        return -1;
+    }
+
+    for (n = 0 ; n < 5; n++) {
+        fileterjson = json_object_array_get_idx(listjson, n);
+        if (NULL == fileterjson) {
+            printf("the fileterjson exit\n");
+            break;
+        }
+
+        json_object_object_get_ex(fileterjson, "tag", &fileter_listjson);
+        const char *str = json_object_get_string(fileter_listjson);
+        if (str) {
+            tmp_string = strdup(str);
+            printf("tag is %s\n", tmp_string);
+            if(strcmp(module_name, tmp_string) == 0)
+            {
+                json_object_object_get_ex(fileterjson, "priority", &fileter_listjson);
+                str = json_object_get_string(fileter_listjson);
+                if (str) {
+                    *tmp_string = str[0];
+                    printf("fileter_listjson: %c\n", *tmp_string);
+                    *level = filter_char_to_pri(*tmp_string);
+                    //get the log level
+                    json_object_put(jsonobj);
+                    return 0;
+                }
+                else
+                {
+                    break;
+                }
+            }
+        }
+        else
+        {
+            continue;
+        }
+    }
+    *level = LOG_UNSET;
+    /***释放json对象***/
+    json_object_put(jsonobj);
+
+    return 0;
+}
+
+int lynq_set_special_log_level(const char * exe_name, const char * module_name, log_level_enum level)
+{
+    UNUSED(exe_name);
+    UNUSED(module_name);
+    UNUSED(level);
+
+
+    return 0;
+}
+
+int lynq_get_special_log_level(const char * exe_name, const char * module_name, log_level_enum *level)
+{
+    UNUSED(exe_name);
+    UNUSED(module_name);
+    UNUSED(level);
+
+
+    return 0;
+}
+
+int lynq_notify_recalc_log_level(pid_t pid)
+{
+    UNUSED(pid);
+    char sendBuff[100]={'\0'};
+    int clientFd,nwrite;
+    struct sockaddr_un serverAddr,clientAddr;
+
+    unlink("/var/log_client.socket");   /* in case it already exists */
+
+    memset(&clientAddr,0,sizeof(clientAddr));
+    memset(&serverAddr,0,sizeof(serverAddr));
+    clientAddr.sun_family = AF_UNIX;
+    sprintf(clientAddr.sun_path,"%s","/var/log_client.socket");
+
+    if ((clientFd = socket(AF_UNIX,SOCK_STREAM,0)) < 0)
+    {
+        printf("err -1\n");
+        return -1;
+    }
+
+    if (bind(clientFd, (struct sockaddr *)&clientAddr, sizeof(clientAddr)) < 0)
+    {
+        printf("err -2\n");
+        close(clientFd);
+        return -2;
+    }
+
+    serverAddr.sun_family = AF_UNIX;
+    sprintf(serverAddr.sun_path, "/var/log_server.socket");
+    if (connect(clientFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
+    {
+        printf("err -3\n");
+        close(clientFd);
+        return -3;
+    }
+
+    sprintf(sendBuff,"%s","update");
+    if ((nwrite = write(clientFd, sendBuff, 100)) < 0)
+    {
+        printf("err -4\n");
+        close(clientFd);
+        return -4;
+    }
+
+    close(clientFd);
+    return 0;
+}
+
+int lynq_write_log_to_file_now()
+{
+    FILE *fp;
+    char command[256];
+    char buffer[256];
+    int pid = -1;
+    const char *process_name = "mbtk_logd";
+
+
+    snprintf(command, sizeof(command), "pgrep %s", process_name);
+    fp = popen(command, "r");
+    if (fp == NULL)
+    {
+        perror("error comman");
+        return -1;
+    }
+
+    if (fgets(buffer, sizeof(buffer), fp) != NULL)
+    {
+        pid = atoi(buffer);
+    }
+     pclose(fp);
+
+    if (pid != -1)
+    {
+        printf("mbtk %s  PID: %d\n", process_name, pid);
+        if (kill(pid, SIGTERM) == -1)
+        {
+            perror("send SIGTERM signal failed");
+            return -1;
+        }
+        printf("send %d  SIGTERM signal\n", pid);
+    }
+    else
+    {
+        printf("no find %s\n", process_name);
+    }
+
+    //lynq_log_configuration_init("log_end");
+    //lynq_log_global_output(LOG_DEBUG,"mbtk_logd_out");
+    return 0;
+
+}
+
+int lynq_stop_record_log(int value)
+{
+
+    json_object* jsonobj = NULL;
+    json_object* tmpjson = NULL;
+    json_object* datajson = NULL;
+    json_object* listjson = NULL;
+
+//    int tmp_int;
+    const char* tmp_string = NULL;
+
+    if(value != 0 && value != 1)
+    {
+        printf("invalid value ");
+        return -1;
+    }
+
+    jsonobj = json_object_from_file(LOG_CONFIG_PATH);
+    if (NULL == jsonobj)
+    {
+        printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
+        mbtk_system("echo Can't open config file > /dev/console");
+        return -1;
+    }
+
+
+    json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
+
+    /***获取syslog json data***/
+    datajson = json_object_array_get_idx(tmpjson, SYSLOG_INDEX);
+    if (NULL == datajson)
+    {
+        json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+        json_object_put(jsonobj);
+        printf("NULL == datajson\n");
+        mbtk_system("echo NULL == datajson > /dev/console");
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "name", &listjson);
+    tmp_string = json_object_get_string(listjson);
+
+    json_object_object_get_ex(datajson, "enable", &listjson);
+    json_object_get_int(listjson);
+
+    if(strcmp(tmp_string, SYSLOG_NAME) != 0)
+    {
+        json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+        json_object_put(jsonobj);
+        printf("SYSLOG_NAME error, \n");
+        mbtk_system("echo SYSLOG_NAME error,  > /dev/console");
+        return -1;
+    }
+    else
+    {
+        //set 0 to syslog
+        json_object_object_add(datajson, "enable", json_object_new_int(value));
+    }
+
+    /***获取radiolog json data***/
+    datajson = json_object_array_get_idx(tmpjson, RADIO_INDEX);
+    if (NULL == datajson)
+    {
+        json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+        json_object_put(jsonobj);
+        printf("NULL == datajson\n");
+        mbtk_system("echo NULL == datajson > /dev/console");
+        return -1;
+    }
+
+    json_object_object_get_ex(datajson, "name", &listjson);
+    tmp_string = json_object_get_string(listjson);
+
+    json_object_object_get_ex(datajson, "enable", &listjson);
+    json_object_get_int(listjson);
+
+    if(strcmp(tmp_string, RADIOLOG_NAME) != 0)
+    {
+        json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+        json_object_put(jsonobj);
+        printf("RADIO_NAME error or \n");
+        mbtk_system("echo RADIO_NAME error,  > /dev/console");
+        return -1;
+    }
+    else
+    {
+        //set 0 to radio_log
+        json_object_object_add(datajson, "enable", json_object_new_int(value));
+    }
+
+    /***释放json对象***/
+    json_object_to_file(LOG_CONFIG_PATH, jsonobj);
+    json_object_put(jsonobj);
+    return 0;
+}
\ No newline at end of file
diff --git a/mbtk/liblynq_lib_rilv2/lynq_net_light.c b/mbtk/liblynq_lib_rilv2/lynq_net_light.c
new file mode 100755
index 0000000..4b229c3
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_net_light.c
@@ -0,0 +1,62 @@
+#include "lynq_led.h"
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+#include "mbtk_led_control.h"
+
+/****************************DEFINE***************************************/
+#define QSER_RESULT_FAIL    -1
+#define QSER_RESULT_SUCCESS 0
+/****************************DEFINE***************************************/
+
+/****************************VARIABLE***************************************/
+
+/****************************VARIABLE***************************************/
+
+
+/******************************FUNC*****************************************/
+
+/******************************FUNC*****************************************/
+
+/****************************API***************************************/
+int lynq_set_netled_on(int led_mode)
+{
+    //UNUSED(led_mode);
+
+    if(led_mode != MBTK_LED_STATUS_CLOSE && led_mode != MBTK_LED_STATUS_OPEN)
+    {
+        LOGE("[qser_led]param is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    led_info_s led_control;
+
+    memset(&led_control, 0x0, sizeof(led_info_s));
+    led_control.led_type = MBTK_LED_NET;
+    led_control.status = led_mode;
+    mbtk_led_set(led_control);
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int lynq_set_statusled_on(int led_mode)
+{
+    //UNUSED(led_mode);
+
+    if(led_mode != MBTK_LED_STATUS_CLOSE && led_mode != MBTK_LED_STATUS_OPEN)
+    {
+        LOGE("[qser_led]param is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    led_info_s led_control;
+
+    memset(&led_control, 0x0, sizeof(led_info_s));
+    led_control.led_type = MBTK_LED_STATUS;
+    led_control.status = led_mode;
+    mbtk_led_set(led_control);
+
+    return QSER_RESULT_SUCCESS;
+}
+/****************************API***************************************/
+
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_network.c b/mbtk/liblynq_lib_rilv2/lynq_network.c
new file mode 100755
index 0000000..aed8aad
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_network.c
@@ -0,0 +1,1212 @@
+#include "lynq_qser_network.h"
+#include "mbtk_type.h"
+#include "mbtk_ril_api.h"
+#include "mbtk_log.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define QSER_RESULT_SUCCESS 0
+#define QSER_RESULT_FAIL -1
+
+static mbtk_ril_handle* qser_info_handle;
+static const uint qser_h_nw = 0x5F6F7F8F;
+
+static uint64_t tmp_mode = 0xFF;
+
+typedef struct
+{
+    QSER_NW_RxMsgHandlerFunc_t handlerPtr;
+    void* contextPtr;
+} lynq_cust_cb_func;
+
+static lynq_cust_cb_func lynq_func_cb_handle;
+
+static int roaming_pref = 1;  // Open roaming for default.
+
+typedef enum {
+    RADIO_TECH_3GPP = 1, /* 3GPP Technologies - GSM, WCDMA */
+    RADIO_TECH_3GPP2 = 2 /* 3GPP2 Technologies - CDMA */
+} RIL_RadioTechnologyFamily;
+
+
+typedef struct
+{
+    uint8 *lynq_operator_l;
+    uint8 *lynq_operator_s;
+    uint32 lynq_mcc_mnc;
+} lynq_operator_mcc_mnc_t;
+
+static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
+{
+    {(uint8*)"China Mobile",(uint8*)"CMCC",46000},
+    {(uint8*)"China Unicom",(uint8*)"CU",46001},
+    {(uint8*)"China Mobile",(uint8*)"CMCC",46002},
+    {(uint8*)"China Telecom",(uint8*)"CT",46003},
+    {(uint8*)"China Mobile",(uint8*)"CMCC",46004},
+    {(uint8*)"China Telecom",(uint8*)"CT",46005},
+    {(uint8*)"China Unicom",(uint8*)"CU",46006},
+    {(uint8*)"China Mobile",(uint8*)"CMCC",46007},
+    {(uint8*)"China Mobile",(uint8*)"CMCC",46008},
+    {(uint8*)"China Unicom",(uint8*)"CU",46009},
+    {(uint8*)"China Telecom",(uint8*)"CT",46011}
+};
+
+#if 0
+//T106的实现
+/*Used to wait for an update signal*/
+int lynq_wait_signalchanges(int *handle)
+{
+    LYDBGLOG("start wait signalchanges info");
+    if(NULL == handle)
+    {
+        LYERRLOG("illegal input");
+        return LYNQ_E_PARAMETER_ANONALY;
+    }
+    wait_urc_signal_changes();
+    LYDBGLOG("get signalchanges");
+    *handle = s_module_wait_urc_id;
+    return RESULT_OK;
+}
+
+bool is_support_urc(int urc_id)
+{
+    switch(urc_id)
+    {
+        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
+        case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
+        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
+        case RIL_UNSOL_SIGNAL_STRENGTH:
+            return true;
+        default:
+            return false;
+    }
+}
+
+/*Used to get urc info*/
+int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)
+{
+    if(g_module_init_flag != MODULE_RUNNING)
+    {
+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
+        return -1;
+    }
+    LYDBGLOG("start get urc info");
+    if(is_support_urc(handle)==false)
+    {
+        LYINFLOG("invalid handle!!!");
+        return -1;
+    }
+    if((handle ==RIL_UNSOL_SIGNAL_STRENGTH && NULL == solSigStren) ||
+        (handle !=RIL_UNSOL_SIGNAL_STRENGTH && NULL == slot_id))
+    {
+        LYINFLOG("incoming solSigStren or slot_id is NULL!!!");
+        return -1;
+    }
+    switch(handle)
+    {
+        case RIL_UNSOL_SIGNAL_STRENGTH: //1009
+        {
+            LYDBGLOG("get state update to signal info");
+            solSigStren->gw_sig_valid = s_network_urc_solSigStren.gw_sig_valid;
+            solSigStren->rssi = s_network_urc_solSigStren.rssi;
+            solSigStren->wcdma_signalstrength = s_network_urc_solSigStren.wcdma_signalstrength;
+            solSigStren->wcdma_sig_valid = s_network_urc_solSigStren.wcdma_sig_valid;
+            solSigStren->rscp = s_network_urc_solSigStren.rscp;
+            solSigStren->ecno = s_network_urc_solSigStren.ecno;
+            solSigStren->lte_signalstrength = s_network_urc_solSigStren.lte_signalstrength;
+            solSigStren->lte_sig_valid = s_network_urc_solSigStren.lte_sig_valid;
+            solSigStren->rsrp = s_network_urc_solSigStren.rsrp;
+            solSigStren->rsrq = s_network_urc_solSigStren.rsrq;
+            solSigStren->rssnr = s_network_urc_solSigStren.rssnr;
+            solSigStren->nr_sig_valid = s_network_urc_solSigStren.nr_sig_valid;
+            solSigStren->ssRsrp = s_network_urc_solSigStren.ssRsrp;
+            solSigStren->ssRsrq = s_network_urc_solSigStren.ssRsrq;
+            solSigStren->ssSinr = s_network_urc_solSigStren.ssSinr;
+            solSigStren->csiRsrp = s_network_urc_solSigStren.csiRsrp;
+            solSigStren->csiRsrq = s_network_urc_solSigStren.csiRsrq;
+            solSigStren->csiSinr = s_network_urc_solSigStren.csiSinr;
+            break;
+        }
+        default:
+        {
+            *slot_id = s_module_urc_slot_id;
+            LYINFLOG("slot_id = %d",s_module_urc_slot_id);
+        }
+    }
+    return 0;
+}
+
+
+void urc_msg_process_voice_reg()
+{
+    if(s_handlerPtr != NULL)
+    {
+        s_handlerPtr(g_nw_val,NW_IND_VOICE_REG_EVENT_IND_FLAG,NULL,0,s_contextPtr);
+    }
+}
+
+void urc_msg_process_data_reg()
+{
+    if(s_handlerPtr != NULL)
+    {
+        s_handlerPtr(g_nw_val,NW_IND_DATA_REG_EVENT_IND_FLAG,NULL,0,s_contextPtr);
+    }
+}
+
+void urc_msg_process_ims_reg()
+{
+    if(s_handlerPtr != NULL)
+    {
+        s_handlerPtr(g_nw_val,NW_IND_IMS_REG_EVENT_IND_FLAG,NULL,0,s_contextPtr);
+    }
+}
+
+void *new_network_thread_recv(void *context)
+{
+    int handle = -1;
+    uint32_t ind_flag = 0;
+
+    while (1)
+    {
+        lynq_wait_signalchanges(&handle);
+
+        switch(handle)
+        {
+            case 1002: //RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
+            {
+                urc_msg_process_voice_reg();
+
+                break;
+            }
+            case 3015://RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
+            {
+                urc_msg_process_data_reg();
+                break;
+            }
+            case 1009://RIL_UNSOL_SIGNAL_STRENGTH:
+            {
+                urc_msg_process_signal_strength();
+                break;
+            }
+            case 1037://RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
+            {
+                urc_msg_process_ims_reg();
+                break;
+            }
+        }
+    }
+    return NULL;
+}
+
+void urc_msg_process_signal_strength()
+{
+    signalStrength_t signalstrength;
+    int slot_id;
+
+    int ret = lynq_get_urc_info(1009,&signalstrength,&slot_id);
+    if (ret == 0)
+    {
+        QSER_NW_SINGNAL_EVENT_IND_T msg_buf;
+        msg_buf.gsm_sig_info_valid = signalstrength.gw_sig_valid;
+        msg_buf.gsm_sig_info.rssi = signalstrength.rssi;
+        msg_buf.wcdma_sig_info_valid = signalstrength.wcdma_sig_valid;
+        msg_buf.wcdma_sig_info.rssi = signalstrength.rscp;
+        msg_buf.wcdma_sig_info.ecio = signalstrength.ecno;
+        msg_buf.tdscdma_sig_info_valid = 0;
+        msg_buf.lte_sig_info_valid = signalstrength.lte_sig_valid;
+        msg_buf.lte_sig_info.rssi = -125;
+        msg_buf.lte_sig_info.rsrp = signalstrength.rsrp;
+        msg_buf.lte_sig_info.rsrq = signalstrength.rsrq;
+        msg_buf.lte_sig_info.snr = signalstrength.rssnr;
+        msg_buf.cdma_sig_info_valid = 0;
+        msg_buf.hdr_sig_info_valid = 0;
+        msg_buf.nr_sig_info_valid = signalstrength.nr_sig_valid;
+        msg_buf.nr_sig_info.ssRsrp = signalstrength.ssRsrp;
+        msg_buf.nr_sig_info.ssRsrq = signalstrength.ssRsrq;
+        msg_buf.nr_sig_info.ssSinr = signalstrength.ssSinr;
+        msg_buf.nr_sig_info.csiRsrp = signalstrength.csiRsrp;
+        msg_buf.nr_sig_info.csiRsrq = signalstrength.csiRsrq;
+        msg_buf.nr_sig_info.csiSinr = signalstrength.csiSinr;
+        void *ind_msg_buf= &msg_buf;
+        if(s_handlerPtr!=NULL)
+        {
+            s_handlerPtr(g_nw_val,NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG,ind_msg_buf,sizeof (msg_buf) ,s_contextPtr);
+        }
+   }
+}
+
+#endif
+
+static int8_t rssi_convert_to_dBm(uint8 rssi)
+{
+    if(rssi <= 31)
+    {
+        return rssi * 2 - 113;
+    }
+    else
+    {
+        return -125;
+    }
+}
+
+static int16_t rsrp_convert_to_dBm(uint8 rsrp)
+{
+    if(rsrp <= 96)
+    {
+        return rsrp - 140;
+    }
+    else
+    {
+        return -44;
+    }
+}
+
+static int16_t rsrq_convert_to_dB(uint8 rsrq)
+{
+    if(rsrq >= 1 && rsrq <= 34)
+    {
+        return (rsrq + 1) / 2 - 20;
+    }
+    else
+    {
+        return  -20;
+    }
+}
+
+static int16_t ecno_convert_to_dB(uint8 ecno)
+{
+    if(ecno >= 48)
+    {
+        return 0;
+    }
+    else if(ecno == 255)
+    {
+        return 255;
+    }
+    else
+    {
+        return 48 - ecno;
+    }
+}
+
+void qser_signal_state_change_cb(const void* data, int data_len)
+{
+    /*
+    data_signal[0] = signal.type;
+    data_signal[1] = signal.rssi;
+    data_signal[2] = signal.rxlev;
+    data_signal[3] = signal.ber;
+    data_signal[4] = signal.rscp;
+    data_signal[5] = signal.ecno;
+    data_signal[6] = signal.rsrq;
+    data_signal[7] = signal.rsrp;
+    */
+    if(data && data_len == 8)
+    {
+        uint8 *net_data = (uint8*)data;
+        mbtk_radio_technology_enum type = (mbtk_radio_technology_enum)net_data[0];
+
+        QSER_NW_SINGNAL_EVENT_IND_T signal_msg_buf;
+        memset(&signal_msg_buf, 0x0, sizeof(QSER_NW_SINGNAL_EVENT_IND_T));
+
+        signal_msg_buf.gsm_sig_info_valid     = FALSE;
+        signal_msg_buf.lte_sig_info_valid     = FALSE;
+        signal_msg_buf.wcdma_sig_info_valid   = FALSE;
+        signal_msg_buf.tdscdma_sig_info_valid = FALSE;
+        signal_msg_buf.cdma_sig_info_valid    = FALSE;
+        signal_msg_buf.hdr_sig_info_valid     = FALSE;
+        signal_msg_buf.nr_sig_info_valid      = FALSE;
+
+        if(type == MBTK_RADIO_TECH_GSM || type == MBTK_RADIO_TECH_GSM_COMPACT || \
+           type == MBTK_RADIO_TECH_GSM_EGPRS)              //GSM
+        {
+            signal_msg_buf.gsm_sig_info_valid = TRUE;
+            signal_msg_buf.gsm_sig_info.rssi = rssi_convert_to_dBm(net_data[1]);
+        }
+        else if(type == MBTK_RADIO_TECH_E_UTRAN)     //LTE
+        {
+            signal_msg_buf.lte_sig_info_valid = TRUE;
+            signal_msg_buf.lte_sig_info.rssi = rssi_convert_to_dBm(net_data[1]);
+            signal_msg_buf.lte_sig_info.rsrp = rsrp_convert_to_dBm(net_data[7]);
+            signal_msg_buf.lte_sig_info.rsrq = rsrq_convert_to_dB(net_data[6]);
+            signal_msg_buf.lte_sig_info.snr = 0x7FFF;//(当前mbtk没有该参数)
+        }
+        else if (type == MBTK_RADIO_TECH_UTRAN || type == MBTK_RADIO_TECH_UTRAN_HSDPA || \
+                 type == MBTK_RADIO_TECH_UTRAN_HSUPA || type == MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA ||  \
+                 type == MBTK_RADIO_TECH_UTRAN_HSPA )//WCDMA
+        {
+            signal_msg_buf.wcdma_sig_info_valid = TRUE;
+            signal_msg_buf.wcdma_sig_info.rssi = rssi_convert_to_dBm(net_data[1]);
+            signal_msg_buf.wcdma_sig_info.ecio = ecno_convert_to_dB(net_data[5]);
+        }
+
+        if(lynq_func_cb_handle.handlerPtr != NULL)
+        {
+            lynq_func_cb_handle.handlerPtr(qser_h_nw, NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG, (void *)&signal_msg_buf, sizeof(QSER_NW_SINGNAL_EVENT_IND_T), lynq_func_cb_handle.contextPtr);
+            lynq_func_cb_handle.handlerPtr(qser_h_nw, NW_IND_VOICE_REG_EVENT_IND_FLAG, NULL, 0, lynq_func_cb_handle.contextPtr);
+            lynq_func_cb_handle.handlerPtr(qser_h_nw, NW_IND_DATA_REG_EVENT_IND_FLAG, NULL, 0, lynq_func_cb_handle.contextPtr);
+            lynq_func_cb_handle.handlerPtr(qser_h_nw, NW_IND_IMS_REG_EVENT_IND_FLAG, NULL, 0, lynq_func_cb_handle.contextPtr);
+        }
+    }
+    else
+    {
+        LOGD("qser_nw_state_change_cb : NULL");
+    }
+
+}
+
+static uint8 lynq_net_pre_change(bool mbtk_2_lynq,int net_mode)
+{
+    uint8 mbtk_net_pre = 0xFF;
+
+#if 0
+    此参数表在别处使用
+    E_QSER_NW_RADIO_TECH_TD_SCDMA = 1,                                       Y3     1
+    E_QSER_NW_RADIO_TECH_GSM      = 2,    /**<  GSM; only supports voice. */ YL2    0
+    E_QSER_NW_RADIO_TECH_HSPAP    = 3,    /**<  HSPA+. */                      3    1
+    E_QSER_NW_RADIO_TECH_LTE      = 4,    /**<  LTE. */                        4    5
+    E_QSER_NW_RADIO_TECH_EHRPD    = 5,    /**<  EHRPD. */                      3    1
+    E_QSER_NW_RADIO_TECH_EVDO_B   = 6,    /**<  EVDO B. */                   D3     1
+    E_QSER_NW_RADIO_TECH_HSPA     = 7,    /**<  HSPA. */                      3     1
+    E_QSER_NW_RADIO_TECH_HSUPA    = 8,    /**<  HSUPA. */                     3.5   1
+    E_QSER_NW_RADIO_TECH_HSDPA    = 9,    /**<  HSDPA. */                     3.5   1
+    E_QSER_NW_RADIO_TECH_EVDO_A   = 10,   /**<  EVDO A. */                   D3     1
+    E_QSER_NW_RADIO_TECH_EVDO_0   = 11,   /**<  EVDO 0. */                   D3     1
+    E_QSER_NW_RADIO_TECH_1xRTT    = 12,   /**<  1xRTT. */                       2   0
+    E_QSER_NW_RADIO_TECH_IS95B    = 13,   /**<  IS95B. */                       3   0
+    E_QSER_NW_RADIO_TECH_IS95A    = 14,   /**<  IS95A. */                       3   0
+    E_QSER_NW_RADIO_TECH_UMTS     = 15,   /**<  UMTS. */                     L3     1
+    E_QSER_NW_RADIO_TECH_EDGE     = 16,   /**<  EDGE. */                      2.75  0
+    E_QSER_NW_RADIO_TECH_GPRS     = 17,   /**<  GPRS. */                      2.5   0
+    E_QSER_NW_RADIO_TECH_NONE     = 18    /**<  No technology selected. */
+#endif
+    /*
+    0 : GSM only
+    1 : UMTS only
+    2 : GSM/UMTS(auto)
+    3 : GSM/UMTS(GSM preferred)
+    4 : GSM/UMTS(UMTS preferred)
+    5 : LTE only
+    6 : GSM/LTE(auto)
+    7 : GSM/LTE(GSM preferred)
+    8 : GSM/LTE(LTE preferred)
+    9 : UMTS/LTE(auto)
+    10 : UMTS/LTE(UMTS preferred)
+    11 : UMTS/LTE(LTE preferred)
+    12 : GSM/UMTS/LTE(auto)
+    13 : GSM/UMTS/LTE(GSM preferred)
+    14 : GSM/UMTS/LTE(UMTS preferred)
+    15 : GSM/UMTS/LTE(LTE preferred)
+    */
+
+    if(mbtk_2_lynq)
+    {
+        switch(net_mode)
+        {
+            //使用之前set的tmp_mode的值来进行回显get
+            case QSER_NW_MODE_GSM:
+                mbtk_net_pre = QSER_NW_MODE_GSM;
+                break;
+            case QSER_NW_MODE_WCDMA:
+                mbtk_net_pre = QSER_NW_MODE_WCDMA;
+                break;
+            case QSER_NW_MODE_CDMA:
+                mbtk_net_pre = QSER_NW_MODE_CDMA;
+                break;
+            case QSER_NW_MODE_EVDO:
+                mbtk_net_pre = QSER_NW_MODE_EVDO;
+                break;
+            case QSER_NW_MODE_LTE:
+                mbtk_net_pre = QSER_NW_MODE_LTE;
+                break;
+            case QSER_NW_MODE_TDSCDMA:
+                mbtk_net_pre = QSER_NW_MODE_TDSCDMA;
+                break;
+            default:
+                mbtk_net_pre = 0xFF;
+                break;
+        }
+    }
+    else
+   {
+        if(QSER_NW_MODE_GSM == net_mode)
+        {
+            mbtk_net_pre = MBTK_NET_PREF_GSM_ONLY;
+        }
+        else if(QSER_NW_MODE_WCDMA == net_mode)
+        {
+            mbtk_net_pre = MBTK_NET_PREF_UMTS_ONLY;
+        }
+        else if(QSER_NW_MODE_LTE == net_mode)
+        {
+            mbtk_net_pre = MBTK_NET_PREF_LTE_ONLY;
+        }
+        else if((QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA) == net_mode)
+        {
+            mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_UMTS_PREF;
+        }
+        else if((QSER_NW_MODE_WCDMA | QSER_NW_MODE_LTE) == net_mode)
+        {
+            mbtk_net_pre = MBTK_NET_PREF_UMTS_LTE_LTE_PREF;
+        }
+        else if((QSER_NW_MODE_GSM | QSER_NW_MODE_LTE) == net_mode)
+        {
+            mbtk_net_pre = MBTK_NET_PREF_GSM_LTE_LTE_PREF;
+        }
+        else if((QSER_NW_MODE_GSM | QSER_NW_MODE_WCDMA | QSER_NW_MODE_LTE) == net_mode)
+        {
+            mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF;
+        }
+        else
+        {
+            mbtk_net_pre = 0xFF;
+        }
+    }
+    return mbtk_net_pre;
+}
+
+int qser_nw_client_init(nw_client_handle_type *ph_nw)
+{
+    //UNUSED(ph_voice);
+    if(ph_nw == NULL)
+   {
+       LOGE("[qser_nw] ph_nw is NULL.");
+       return QSER_RESULT_FAIL;
+   }
+
+   if(NULL == qser_info_handle)
+   {
+       qser_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+       if(NULL == qser_info_handle)
+       {
+           LOGE("[qser_nw] qser_info_handle get fail.");
+           return QSER_RESULT_FAIL;
+       }
+   }
+   else
+   {
+        LOGE("[qser_nw] qser_info_handle has init.");
+        *ph_nw = qser_h_nw;
+        return QSER_RESULT_FAIL;
+   }
+   *ph_nw = qser_h_nw;
+
+   LOGE("[qser_nw] qser_info_handle get success.");
+
+
+    return QSER_RESULT_SUCCESS;
+
+}
+
+
+int qser_nw_client_deinit(nw_client_handle_type h_nw)
+{
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle)
+    {
+        int ret = mbtk_ril_close(MBTK_AT_PORT_DEF);;
+        if(ret)
+        {
+            LOGE("[qser_nw] mbtk_info_handle_free() fail.");
+            return QSER_RESULT_FAIL;
+        }
+        else
+        {
+            qser_info_handle = NULL;
+            lynq_func_cb_handle.handlerPtr = NULL;
+        }
+    }
+    else
+    {
+        LOGE("[qser_nw] handle not inited.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+
+int qser_nw_set_config(nw_client_handle_type h_nw,QSER_NW_CONFIG_INFO_T *pt_info)
+{
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_info_handle == NULL.");
+        return -1;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("pt_info == NULL.");
+        return -1;
+    }
+
+    roaming_pref = pt_info->roaming_pref;
+
+    mbtk_band_info_t band;
+    memset(&band, 0, sizeof(mbtk_band_info_t));
+    tmp_mode = pt_info->preferred_nw_mode;//临时保存一下原本的mode
+
+    //printf("tmp_mode = [%llu]",tmp_mode);
+    band.net_pref = lynq_net_pre_change(FALSE, pt_info->preferred_nw_mode);
+    LOGI("band.net_pref = [%d] ",band.net_pref);
+
+    if(band.net_pref == 0xFF)
+    {
+        LOGE("lynq_net_pre_change() fail.");
+        return -1;
+    }
+
+    if(mbtk_current_band_set(qser_info_handle, &band))
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int qser_nw_get_operator_name(nw_client_handle_type h_nw, QSER_NW_OPERATOR_NAME_INFO_T *pt_info)
+{
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_info_handle == NULL.");
+        return -1;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("pt_info == NULL.");
+        return -1;
+    }
+
+    char OperatorFN[128];
+    char OperatorSH[128];
+    char MccMnc[128];
+    mbtk_net_info_t net;
+    if(!mbtk_net_sel_mode_get(qser_info_handle, &net) && net.plmn > 0)
+    {
+        // printf("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
+        int i = 0;
+        while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
+        {
+            if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
+                break;
+            i++;
+        }
+
+        if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))   // No found mcc&mnc
+        {
+            strcpy(OperatorFN, "UNKNOWN");
+            strcpy(OperatorSH, "UNKNOWN");
+            sprintf(MccMnc, "%d", net.plmn);
+        }
+        else
+        {
+            strcpy(OperatorFN, (char*)lynq_operator_mcc_mnc[i].lynq_operator_l);
+            strcpy(OperatorSH, (char*)lynq_operator_mcc_mnc[i].lynq_operator_s);
+            sprintf(MccMnc, "%d", lynq_operator_mcc_mnc[i].lynq_mcc_mnc);
+        }
+        memset(pt_info->long_eons,0,128);
+        memcpy(pt_info->long_eons,lynq_operator_mcc_mnc[i].lynq_operator_l,strlen((char*)lynq_operator_mcc_mnc[i].lynq_operator_l));
+        memset(pt_info->short_eons,0,128);
+        memcpy(pt_info->short_eons,lynq_operator_mcc_mnc[i].lynq_operator_s,strlen((char*)lynq_operator_mcc_mnc[i].lynq_operator_s));
+        memset(pt_info->mcc,0,4);
+        memset(pt_info->mnc,0,4);
+        sprintf(pt_info->mcc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
+        sprintf(pt_info->mnc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
+        //pt_info->act;
+        return 0;
+    }
+
+    return -1;
+}
+
+int qser_nw_get_reg_status(nw_client_handle_type h_nw, QSER_NW_REG_STATUS_INFO_T *pt_info)
+{
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_info_handle == NULL.");
+        return -1;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("pt_info == NULL.");
+        return -1;
+    }
+
+    /*VOICE/DATA/IMS*/
+    mbtk_net_reg_info_t reg;
+    int err = mbtk_net_reg_get(qser_info_handle, &reg);
+    if(err)
+    {
+        LOGE("mbtk_net_reg_get fail.");
+        return -1;
+    }
+    else
+    {
+        memset(pt_info, 0x0, sizeof(QSER_NW_REG_STATUS_INFO_T));
+
+
+        char OperatorFN[128];
+        char OperatorSH[128];
+        char MccMnc[128];
+        mbtk_net_info_t net;
+        if(!mbtk_net_sel_mode_get(qser_info_handle, &net) && net.plmn > 0)
+        {
+            // printf("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
+            int i = 0;
+            while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
+            {
+                if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
+                    break;
+                i++;
+            }
+
+            if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))   // No found mcc&mnc
+            {
+                strcpy(OperatorFN, "UNKNOWN");
+                strcpy(OperatorSH, "UNKNOWN");
+                sprintf(MccMnc, "%d", net.plmn);
+            }
+            else
+            {
+                sprintf(MccMnc, "%d", lynq_operator_mcc_mnc[i].lynq_mcc_mnc);
+            }
+            sprintf(pt_info->data_registration_details_3gpp.mcc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
+            sprintf(pt_info->data_registration_details_3gpp.mnc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
+            sprintf(pt_info->voice_registration_details_3gpp.mcc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
+            sprintf(pt_info->voice_registration_details_3gpp.mnc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
+            //pt_info->act;
+        }
+
+        //暂时未知是否其他也被使用,现根据ql模块的传输情况,
+        //只配置3gpp,涉及call,data状态没有对应的匹配的就没有赋值
+
+        pt_info->voice_registration_valid = TRUE;
+        pt_info->voice_registration.deny_reason = 0;
+        pt_info->voice_registration.roaming = 0;
+        pt_info->voice_registration.tech_domain = 0;
+
+
+        pt_info->data_registration_valid = TRUE;
+        pt_info->data_registration.deny_reason = 0;
+        pt_info->data_registration.roaming = 0;
+        pt_info->data_registration.tech_domain = 0;
+
+        if (reg.call_state == 1 || reg.call_state == 5)
+        {
+            pt_info->voice_registration.registration_state = E_QSER_NW_SERVICE_FULL;
+        }
+        else if (reg.call_state == 0 || reg.call_state == 2 || reg.call_state == 3 || reg.call_state == 4)
+        {
+            pt_info->voice_registration.registration_state = E_QSER_NW_SERVICE_NONE;
+        }
+
+        if (reg.data_state == 1 || reg.data_state == 5)
+        {
+            pt_info->data_registration.registration_state = E_QSER_NW_SERVICE_FULL;
+        }
+        else if (reg.data_state == 0 || reg.data_state == 2 || reg.data_state == 3 || reg.data_state == 4)
+        {
+            pt_info->data_registration.registration_state = E_QSER_NW_SERVICE_NONE;
+        }
+
+
+        pt_info->voice_registration_details_3gpp_valid = TRUE;
+        pt_info->voice_registration_details_3gpp.lac = reg.lac;
+        pt_info->voice_registration_details_3gpp.cid = reg.ci;
+        //补位填0 or 1
+        pt_info->voice_registration_details_3gpp.tech_domain = 1;
+        pt_info->voice_registration_details_3gpp.roaming = 0;
+        pt_info->voice_registration_details_3gpp.forbidden = 0;
+        pt_info->voice_registration_details_3gpp.psc = 0;
+        pt_info->voice_registration_details_3gpp.tac = 0;
+
+        pt_info->data_registration_details_3gpp_valid = TRUE;
+        pt_info->data_registration_details_3gpp.lac = reg.lac;
+        pt_info->data_registration_details_3gpp.cid = reg.ci;
+        //补位填0 or 1
+        pt_info->data_registration_details_3gpp.tech_domain = 1;
+        pt_info->data_registration_details_3gpp.roaming = 0;
+        pt_info->data_registration_details_3gpp.forbidden = 0;
+        pt_info->data_registration_details_3gpp.psc = 0;
+        pt_info->data_registration_details_3gpp.tac = 0;
+
+
+        pt_info->voice_registration_details_3gpp2_valid = FALSE;
+        //pt_info->voice_registration_details_3gpp2
+
+        pt_info->data_registration_details_3gpp2_valid = FALSE;
+        //pt_info->data_registration_details_3gpp2
+
+
+        switch(reg.type)
+        {
+            case MBTK_RADIO_TECH_GSM:
+            case MBTK_RADIO_TECH_GSM_COMPACT:
+            case MBTK_RADIO_TECH_GSM_EGPRS:
+            case MBTK_RADIO_TECH_UTRAN_HSPA:
+            {
+                pt_info->data_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_HSPA;
+                pt_info->voice_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_HSPA;
+                pt_info->data_registration.radio_tech = E_QSER_NW_RADIO_TECH_HSPA;
+                pt_info->voice_registration.radio_tech = E_QSER_NW_RADIO_TECH_HSPA;
+                break;
+            }
+            case MBTK_RADIO_TECH_UTRAN:
+            case MBTK_RADIO_TECH_UTRAN_HSDPA:
+            case MBTK_RADIO_TECH_UTRAN_HSUPA:
+            case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
+            {
+                pt_info->data_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_UMTS;
+                pt_info->voice_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_UMTS;
+                pt_info->data_registration.radio_tech = E_QSER_NW_RADIO_TECH_UMTS;
+                pt_info->voice_registration.radio_tech = E_QSER_NW_RADIO_TECH_UMTS;
+                break;
+            }
+            case MBTK_RADIO_TECH_E_UTRAN:
+            {
+                pt_info->data_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_LTE;
+                pt_info->voice_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_LTE;
+                pt_info->data_registration.radio_tech = E_QSER_NW_RADIO_TECH_LTE;
+                pt_info->voice_registration.radio_tech = E_QSER_NW_RADIO_TECH_LTE;
+                break;
+            }
+            default:
+            {
+                pt_info->data_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_NONE;
+                pt_info->voice_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_NONE;
+                pt_info->data_registration.radio_tech = E_QSER_NW_RADIO_TECH_NONE;
+                pt_info->voice_registration.radio_tech = E_QSER_NW_RADIO_TECH_NONE;
+                pt_info->data_registration.registration_state = E_QSER_NW_SERVICE_NONE;
+                pt_info->voice_registration.registration_state = E_QSER_NW_SERVICE_NONE;
+                break;
+            }
+        }
+    }
+
+    return 0;
+}
+
+int qser_nw_get_signal_strength(nw_client_handle_type h_nw,QSER_NW_SIGNAL_STRENGTH_INFO_T *pt_info)
+{
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_info_handle == NULL.");
+        return -1;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("pt_info == NULL.");
+        return -1;
+    }
+
+    int ret;
+    mbtk_signal_info_t signal;
+    ret = mbtk_net_signal_get(qser_info_handle, &signal);
+    if(ret != 0) {
+        LOGE("mbtk_net_signal_get fail.");
+        return -1;
+    }
+    else
+    {
+        memset(pt_info, 0x0, sizeof(QSER_NW_SIGNAL_STRENGTH_INFO_T));
+        if(signal.type == MBTK_RADIO_TECH_GSM || signal.type == MBTK_RADIO_TECH_GSM_COMPACT || \
+           signal.type == MBTK_RADIO_TECH_GSM_EGPRS)              //GSM
+        {
+            pt_info->gsm_sig_info_valid = TRUE;
+            pt_info->gsm_sig_info.rssi = rssi_convert_to_dBm(signal.rssi);
+        }
+        else if(signal.type == MBTK_RADIO_TECH_E_UTRAN)     //LTE
+        {
+            pt_info->lte_sig_info_valid = TRUE;
+            pt_info->lte_sig_info.rsrp = rsrp_convert_to_dBm(signal.rsrp);
+            pt_info->lte_sig_info.rsrq = rsrq_convert_to_dB(signal.rsrq);
+            pt_info->lte_sig_info.snr = 0x7FFF;//->MBTK接口无该参数(对应参数为rssnr,该值INT_MAX:0x7FFFFFFFF表示无效值),写死值为0x7FFFFFFFF
+            pt_info->lte_sig_info.rssi = rssi_convert_to_dBm(signal.rssi);
+        }
+        else if (signal.type == MBTK_RADIO_TECH_UTRAN || signal.type == MBTK_RADIO_TECH_UTRAN_HSDPA || \
+                 signal.type == MBTK_RADIO_TECH_UTRAN_HSUPA || signal.type == MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA ||  \
+                 signal.type == MBTK_RADIO_TECH_UTRAN_HSPA )//WCDMA
+        {
+            pt_info->wcdma_sig_info_valid = TRUE;
+            pt_info->wcdma_sig_info.rssi = rssi_convert_to_dBm(signal.rssi);
+            pt_info->wcdma_sig_info.ecio = ecno_convert_to_dB(signal.ecno);
+        }
+        else
+        {
+            return -1;
+        }
+        /*
+        pt_info->gsm_sig_info_valid = 1//signal.gw_sig_valid;
+        pt_info->gsm_sig_info.rssi = signal.rssi;//signal.rssi-110;
+        pt_info->wcdma_sig_info_valid = 1//signal.wcdma_sig_valid;
+        pt_info->wcdma_sig_info.rssi = signal.rscp;//signal.wcdma_signalstrength-110;
+        pt_info->wcdma_sig_info.ecio = //signal.ecno/5;
+        pt_info->tdscdma_sig_info_valid = 0;
+        pt_info->lte_sig_info_valid = 1//signal.lte_sig_valid;
+        pt_info->lte_sig_info.rssi = -125;//signal.lte_signalstrength-110;
+        pt_info->lte_sig_info.rsrp = signal.rsrp;//signal.rsrp*(-1);
+        pt_info->lte_sig_info.rsrq = signal.rsrq;//signal.rsrq*(-1);
+        pt_info->lte_sig_info.snr = 0x7FFFFFFFF;//signal.rssnr;
+        pt_info->cdma_sig_info_valid = 0;
+        pt_info->hdr_sig_info_valid = 0;
+        //mbtk 无nr
+        pt_info->nr_sig_info_valid = 0//signal.nr_sig_valid;
+        pt_info->nr_sig_info.ssRsrp = 0//signal.ssRsrp;
+        pt_info->nr_sig_info.ssRsrq = 0//signal.ssRsrq;
+        pt_info->nr_sig_info.ssSinr = 0//signal.ssSinr;
+        pt_info->nr_sig_info.csiRsrp = 0//signal.csiRsrp;
+        pt_info->nr_sig_info.csiRsrq = 0//signal.csiRsrq;
+        pt_info->nr_sig_info.csiSinr = 0//signal.csiSinr;
+        */
+    }
+
+    return 0;
+}
+
+int qser_nw_add_rx_msg_handler (nw_client_handle_type h_nw, QSER_NW_RxMsgHandlerFunc_t handlerPtr, void* contextPtr)
+{
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_info_handle == NULL.");
+        return -1;
+    }
+
+    lynq_func_cb_handle.handlerPtr = handlerPtr;
+    lynq_func_cb_handle.contextPtr = contextPtr;
+
+    mbtk_signal_state_change_cb_reg(qser_signal_state_change_cb);
+
+    return 0;
+}
+
+int qser_nw_set_oos_config (nw_client_handle_type h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info)
+{
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if (pt_info == NULL)
+    {
+        LOGE("QSER_NW_OOS_CONFIG_INFO_T NULL");
+        return -1;
+    }
+
+    uint32 oosPhase_0, oosPhase_1, oosPhase_2;
+    char tmp_type;
+    mbtk_ril_oos_info_t oos_info;
+
+    memset(&oos_info, 0x00, sizeof(mbtk_ril_oos_info_t));
+
+
+    tmp_type = pt_info->type;
+
+    if (tmp_type == QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN)
+    {//如果没有配置对应的值,例如,10,20
+     //oosPhase_2这个位置没有配置,则使用默认值20,既不限制次数的5s进行一次扫描
+     //同理oosPhase_0,oosPhase_1这个位置没有配置,则使用默认值5,10,既限制次数5次的5s,10s进行一次扫描
+     //输入多少配置多少,可以缺省使用默认值
+        if (pt_info->u.full_band_scan_info.t_min < 0 || pt_info->u.full_band_scan_info.t_step < 0 || pt_info->u.full_band_scan_info.t_max < 0)
+        {
+            LOGE("qser_nw_set_oos_config set time < 0 ");
+            return -1;
+        }
+        else if ((pt_info->u.full_band_scan_info.t_min > 0 && pt_info->u.full_band_scan_info.t_min <= 255) && pt_info->u.full_band_scan_info.t_step == 0 && pt_info->u.full_band_scan_info.t_max == 0)
+        {
+            oosPhase_0 = pt_info->u.full_band_scan_info.t_min;
+            oos_info.state = 1;
+            oos_info.oosPhase[0] = oosPhase_0;
+        }
+        else if ((pt_info->u.full_band_scan_info.t_min > 0 && pt_info->u.full_band_scan_info.t_min <= 255) && (pt_info->u.full_band_scan_info.t_step > 0 && pt_info->u.full_band_scan_info.t_step <= 255) && pt_info->u.full_band_scan_info.t_max == 0)
+        {
+            oosPhase_0 = pt_info->u.full_band_scan_info.t_min;
+            oosPhase_1 = pt_info->u.full_band_scan_info.t_step;
+            oos_info.state = 1;
+            oos_info.oosPhase[0] = oosPhase_0;
+            oos_info.oosPhase[1] = oosPhase_1;
+        }
+        else if ((pt_info->u.full_band_scan_info.t_min > 0 && pt_info->u.full_band_scan_info.t_min <= 255) && (pt_info->u.full_band_scan_info.t_step > 0 && pt_info->u.full_band_scan_info.t_step <= 255) && (pt_info->u.full_band_scan_info.t_max > 0 && pt_info->u.full_band_scan_info.t_max <= 255))
+        {
+            oosPhase_0 = pt_info->u.full_band_scan_info.t_min;
+            oosPhase_1 = pt_info->u.full_band_scan_info.t_step;
+            oosPhase_2 = pt_info->u.full_band_scan_info.t_max;
+            oos_info.state = 1;
+            oos_info.oosPhase[0] = oosPhase_0;
+            oos_info.oosPhase[1] = oosPhase_1;
+            oos_info.oosPhase[2] = oosPhase_2;
+        }
+        else if (pt_info->u.full_band_scan_info.t_min == 0 && pt_info->u.full_band_scan_info.t_step == 0 && pt_info->u.full_band_scan_info.t_max == 0)
+        {
+            oos_info.state = 0;
+        }
+        else
+        {
+            LOGE("qser_nw_set_oos_config set Format err");
+            return -1;
+        }
+
+        int err = mbtk_oos_set(qser_info_handle, &oos_info);
+        if (err != 0)
+        {
+            LOGE("qser_nw_set_oos_config mbtk_oos_set err");
+            return -1;
+        }
+    }
+    else if (tmp_type == QSER_NW_OOS_CFG_TYPE_FAST_SCAN)
+    {
+        LOGE("Not currently supported");
+        return -1;
+    }
+    else
+    {
+        LOGE("type is error");
+        return -1;
+    }
+
+    return 0;
+}
+
+int qser_nw_get_oos_config (nw_client_handle_type h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info)
+{
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if (pt_info == NULL)
+    {
+        LOGE("QSER_NW_OOS_CONFIG_INFO_T NULL");
+        return -1;
+    }
+    
+    mbtk_ril_oos_info_t oos_info;
+//    uint32 oosPhase_0, oosPhase_1, oosPhase_2;
+//    char cmd[100] = {0};
+
+    memset(&oos_info, 0x00, sizeof(mbtk_ril_oos_info_t));
+
+    int err = mbtk_oos_get(qser_info_handle, &oos_info);
+    if (err != 0)
+    {
+        LOGE("qser_nw_get_oos_config mbtk_oos_get err ");
+        return -1;
+    }
+/*
+    printf("oos_info.mode =[%d] \n",oos_info.mode);
+    printf("oos_info.1 =[%d] \n",oos_info.oosPhase[0]);
+    printf("oos_info.2 =[%d] \n",oos_info.oosPhase[1]);
+    printf("oos_info.3 =[%d] \n",oos_info.oosPhase[2]);
+*/
+    if(oos_info.state == 0)//关闭状态
+    {
+        pt_info->u.full_band_scan_info.t_min = 0;
+        pt_info->u.full_band_scan_info.t_step = 0;
+        pt_info->u.full_band_scan_info.t_max = 0;
+    }
+    else
+    {
+        pt_info->u.full_band_scan_info.t_min = (int)oos_info.oosPhase[0];
+        pt_info->u.full_band_scan_info.t_step = (int)oos_info.oosPhase[1];
+        pt_info->u.full_band_scan_info.t_max = (int)oos_info.oosPhase[2];
+    }
+    pt_info->type = QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN;
+
+
+    if (pt_info == NULL)
+    {
+        LOGE("qser_nw_get_oos_config pt_info is null ");
+        return -1;
+    }
+
+    return 0;
+}
+
+int qser_nw_set_rf_mode (nw_client_handle_type h_nw, E_QSER_NW_RF_MODE_TYPE_T rf_mode)
+{
+    //UNUSED(h_nw);
+    //UNUSED(rf_mode);
+    int ret;
+
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_info_handle == NULL.");
+        return -1;
+    }
+
+/*
+    if (rf_mode == 4)
+    {
+        printf("Flight Mode no Support Now\n");
+        return -1;
+    }
+*/
+    if (rf_mode != 4 && rf_mode != 0 && rf_mode != 1)
+    {
+        LOGE("mode is error!");
+        return -1;
+    }
+
+    ret = mbtk_radio_state_set(qser_info_handle, rf_mode, 0);
+
+    //ret = mbtk_radio_state_set(qser_info_handle, rf_mode);
+    if (ret != 0)
+    {
+        LOGE("mbtk_radio_state_set fail.");
+        return -1;
+    }
+    else
+    {
+        LOGI("qser_nw_set_rf_mode is success\n");
+    }
+
+    return 0;
+}
+
+int qser_nw_get_rf_mode (nw_client_handle_type h_nw, E_QSER_NW_RF_MODE_TYPE_T *rf_mode)
+{
+    //UNUSED(h_nw);
+    //UNUSED(rf_mode);
+    int ret;
+    mbtk_radio_state_enum tmp_rf;
+
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_info_handle == NULL.");
+        return -1;
+    }
+
+    ret = mbtk_radio_state_get(qser_info_handle, &tmp_rf);
+
+    //ret = mbtk_radio_state_get(qser_info_handle, &tmp_rf);
+    if (ret != 0)
+    {
+        LOGE("mbtk_radio_state_get fail.");
+        return -1;
+    }
+    else
+    {
+        LOGI("qser_nw_get_rf_mode is success\n");
+        *rf_mode = tmp_rf;
+    }
+
+
+    return 0;
+}
+
+int qser_nw_set_ims_enable(nw_client_handle_type        h_nw, E_QSER_NW_IMS_MODE_TYPE_T ims_mode)
+{
+    int ret = 0;
+
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_info_handle == NULL.");
+        return -1;
+    }
+
+    ret = mbtk_volte_state_set(qser_info_handle, ims_mode);
+    if (ret != 0)
+    {
+        LOGE("mbtk_net_ims_set fail.");
+        return -1;
+    }
+
+    return 0;
+}
+
+int qser_nw_get_ims_reg_status(nw_client_handle_type h_nw, QSER_NW_IMS_REG_STATUS_INFO_T *pt_info)
+{
+    int ret = 0;
+    int tmp_pt;
+
+    if(h_nw != qser_h_nw)
+    {
+        LOGE("[qser_nw] h_nw is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_info_handle == NULL.");
+        return -1;
+    }
+
+    ret = mbtk_volte_state_get(qser_info_handle, &tmp_pt);
+    if (ret != 0)
+    {
+        LOGE("mbtk_net_ims_get fail.");
+        return -1;
+    }
+
+    if (tmp_pt == 0)
+        pt_info->registration_state = E_QSER_NW_IMS_SERVICE_NONE;
+    else if (tmp_pt == 1)
+        pt_info->registration_state = E_QSER_NW_IMS_SERVICE_REGISTERED;
+    else
+    {
+        LOGE("mbtk_net_ims_get value error fail.");
+        return -1;
+    }
+
+    return 0;
+}
+
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_sim.c b/mbtk/liblynq_lib_rilv2/lynq_sim.c
new file mode 100755
index 0000000..31a3b46
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_sim.c
@@ -0,0 +1,735 @@
+#include "lynq_qser_sim.h"
+#include "mbtk_type.h"
+#include "mbtk_ril_api.h"
+
+/****************************DEFINE***************************************/
+#define QSER_RESULT_SUCCESS 0
+#define QSER_RESULT_FAIL -1
+
+#define QSER_IMEI_SV_VERSION "01"
+
+/****************************DEFINE***************************************/
+
+/****************************VARIABLE***************************************/
+static mbtk_ril_handle* qser_info_handle;
+static const uint qser_h_sim = 0x5F6F7F8F;
+static QSER_SIM_RxMsgHandlerFunc_t qser_sim_state_cb = NULL;
+static bool qser_sim_cb_state = false;
+/****************************VARIABLE***************************************/
+
+/******************************FUNC*****************************************/
+void qser_sim_state_change_cb(const void* data, int data_len)
+{
+    //uint8 *ptr = (uint8*)data;
+    mbtk_ril_sim_state_info_t* ptr_state = (mbtk_ril_sim_state_info_t*)data; 
+    LOGE("[qser_sim] SIM state : %d\n", ptr_state->sim_state);
+    QSER_SIM_CARD_STATUS_INFO_T qser_sim_statue = {0};
+    if(ptr_state->sim_state == 0)
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+    }
+    else if(ptr_state->sim_state == 1)
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_PRESENT;
+    }
+    else if(ptr_state->sim_state == 18)
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+    }
+    else
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_UNKNOWN;
+    }
+    if(qser_sim_state_cb != NULL)
+    {
+        qser_sim_state_cb(&qser_sim_statue);
+    }
+}
+
+/******************************FUNC*****************************************/
+
+/****************************API***************************************/
+int qser_sim_client_init(sim_client_handle_type *ph_sim)
+{
+    //UNUSED(ph_voice);
+    if(ph_sim == NULL)
+   {
+       LOGE("[qser_sim] ph_sim is NULL.");
+       return QSER_RESULT_FAIL;
+   }
+
+   if(NULL == qser_info_handle)
+   {
+       qser_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+       if(NULL == qser_info_handle)
+       {
+           LOGE("[qser_sim] qser_info_handle get fail.");
+           return QSER_RESULT_FAIL;
+       }
+   }
+   else
+   {
+        LOGE("[qser_sim] qser_info_handle has init.");
+        *ph_sim = qser_h_sim;
+        return QSER_RESULT_FAIL;
+   }
+   *ph_sim = qser_h_sim;
+
+   LOGE("[qser_sim] qser_info_handle get success.");
+
+
+    return QSER_RESULT_SUCCESS;
+
+}
+
+
+
+int qser_sim_getimsi(sim_client_handle_type h_sim, QSER_SIM_APP_ID_INFO_T *pt_info,char *imsi,size_t imsiLen)
+{
+    //UNUSED(h_sim);
+    UNUSED(pt_info);
+    //UNUSED(imsi);
+    //UNUSED(imsiLen);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(imsi == NULL || imsiLen < 15)
+    {
+        LOGE("[qser_sim] imsi is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    memset(imsi,0,imsiLen);
+    int err = mbtk_imsi_get(qser_info_handle, imsi);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_imsi_get is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(strlen(imsi) > imsiLen)
+    {
+        LOGE("[qser_sim] get datalength out of range.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_geticcid(sim_client_handle_type h_sim,QSER_SIM_SLOT_ID_TYPE_T simId,char *iccid, size_t iccidLen)
+{
+    //UNUSED(h_sim);
+    UNUSED(simId);
+    //UNUSED(iccid);
+    //UNUSED(iccidLen);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(iccid == NULL || iccidLen < QSER_SIM_ICCID_LEN_MAX)
+    {
+        LOGE("[qser_sim] iccid is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    memset(iccid, 0, iccidLen);
+    int err = mbtk_iccid_get(qser_info_handle, iccid);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_iccid_get is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(strlen(iccid) > iccidLen)
+    {
+        LOGE("[qser_sim] get datalength out of range.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_getphonenumber(sim_client_handle_type h_sim,QSER_SIM_APP_ID_INFO_T *pt_info, char*phone_num, size_t phoneLen)
+{
+    //UNUSED(h_sim);
+    UNUSED(pt_info);
+    //UNUSED(phone_num);
+    //UNUSED(phoneLen);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(phone_num == NULL || phoneLen < 11)
+    {
+        LOGE("[qser_sim] phone_num is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    memset(phone_num, 0, phoneLen);
+    int err = mbtk_phone_number_get(qser_info_handle, phone_num);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_phone_number_get is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(strlen(phone_num) > phoneLen)
+    {
+        LOGE("[qser_sim] get datalength out of range.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_verifypin(sim_client_handle_type h_sim,QSER_SIM_VERIFY_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+    mbtk_sim_lock_info_t info = {0};
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    info.type = MBTK_SIM_LOCK_TYPE_VERIFY_PIN;
+    memcpy(info.pin1, pt_info->pin_value, strlen(pt_info->pin_value));
+
+    int err = mbtk_sim_lock_set(qser_info_handle, &info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_verify_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_changepin(sim_client_handle_type h_sim,QSER_SIM_CHANGE_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+    mbtk_sim_lock_info_t info = {0};
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    info.type = MBTK_SIM_LOCK_TYPE_CHANGE;
+    memcpy(info.pin1, pt_info->old_pin_value, strlen(pt_info->old_pin_value));
+    memcpy(info.pin2, pt_info->new_pin_value, strlen(pt_info->new_pin_value));
+
+    int err = mbtk_sim_lock_set(qser_info_handle, &info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_change_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_unblockpin(sim_client_handle_type h_sim, QSER_SIM_UNBLOCK_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+    mbtk_sim_lock_info_t info = {0};
+    
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    info.type = MBTK_SIM_LOCK_TYPE_VERIFY_PUK;
+    memcpy(info.pin1, pt_info->new_pin_value, strlen(pt_info->new_pin_value));
+    memcpy(info.puk, pt_info->puk_value, strlen(pt_info->puk_value));
+
+    int err = mbtk_sim_lock_set(qser_info_handle, &info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_unlock_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_enablepin(sim_client_handle_type h_sim, QSER_SIM_ENABLE_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+    mbtk_sim_lock_info_t info = {0};
+    
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    info.type = MBTK_SIM_LOCK_TYPE_ENABLE;
+    memcpy(info.pin1, pt_info->pin_value, strlen(pt_info->pin_value));
+
+    int err = mbtk_sim_lock_set(qser_info_handle, &info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_enable_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_disablepin(sim_client_handle_type h_sim, QSER_SIM_DISABLE_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+    mbtk_sim_lock_info_t info = {0};
+    
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    info.type = MBTK_SIM_LOCK_TYPE_DISABLE;
+    memcpy(info.pin1, pt_info->pin_value, strlen(pt_info->pin_value));
+
+    int err = mbtk_sim_lock_set(qser_info_handle, &info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_enable_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_getcardstatus(sim_client_handle_type h_sim,QSER_SIM_SLOT_ID_TYPE_T simId,QSER_SIM_CARD_STATUS_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(simId);
+    //UNUSED(pt_info);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_sim_state_enum sim;
+    mbtk_sim_card_type_enum sim_card_type;
+    mbtk_pin_puk_last_times_t qser_last_times = {0};
+    int err = mbtk_sim_state_get(qser_info_handle, &sim);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_sim_state_get fail [err = %d].", err);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        LOGE("[qser_sim] sim = %d.", sim);
+        memset(pt_info, 0x0, sizeof(QSER_SIM_CARD_STATUS_INFO_T));
+        switch (sim)
+        {
+            case 0:                     //ABSENT
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+                break;
+            case 1:                     //NOT READY
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+                break;
+            case 2:                     //READY
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_PRESENT;
+                break;
+            case 3:                     //SIM PIN
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_PRESENT;
+                break;
+            case 4:                     //SIM PUK
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_PRESENT;
+                break;
+            case 5:                     //NETWORK
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_ERROR_SIM_TECHNICAL_PROBLEMS;
+                break;
+            default:
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_UNKNOWN;
+                break;
+        }
+    }
+
+    err = mbtk_sim_type_get(qser_info_handle, &sim_card_type);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_sim_state_get fail [err = %d].", err);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        if(sim_card_type == 0 || sim_card_type == 2)
+            pt_info->e_card_type = QSER_SIM_CARD_TYPE_ICC;
+        else if(sim_card_type == 1 || sim_card_type == 3)
+            pt_info->e_card_type = QSER_SIM_CARD_TYPE_UICC;
+        else
+            pt_info->e_card_type = QSER_SIM_CARD_TYPE_UNKNOWN;
+    }
+
+    err = mbtk_sim_lock_retry_times_get(qser_info_handle, &qser_last_times);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_sim_state_get fail [err = %d].", err);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        pt_info->card_app_info.app_3gpp.pin1_num_retries = qser_last_times.p1_retry;
+        pt_info->card_app_info.app_3gpp.pin2_num_retries = qser_last_times.p2_retry;
+        pt_info->card_app_info.app_3gpp.puk1_num_retries = qser_last_times.puk1_retry;
+        pt_info->card_app_info.app_3gpp.puk2_num_retries = qser_last_times.puk2_retry;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_getimei(sim_client_handle_type h_sim, char *imei)
+{
+    //UNUSED(h_sim);
+    //UNUSED(imei);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(imei == NULL)
+    {
+        LOGE("[qser_sim] imei is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    int err = mbtk_imei_get(qser_info_handle, imei);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_imei_get Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_get_imei_and_sv(sim_client_handle_type h_sim,char *imei, char*sv)
+{
+    //UNUSED(h_sim);
+    //UNUSED(imei);
+    //UNUSED(sv);
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(imei == NULL || sv == NULL)
+    {
+        LOGE("[qser_sim] param is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    int err = mbtk_imei_get(qser_info_handle, imei);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_imei_get Error: %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+
+    memcpy(sv, QSER_IMEI_SV_VERSION, strlen(QSER_IMEI_SV_VERSION));
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_reset_modem(sim_client_handle_type h_sim)
+{
+    //UNUSED(h_sim);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    for(int cid =0; cid < MBTK_APN_CID_MAX; cid++)
+    {
+        mbtk_data_call_stop(qser_info_handle, cid, 1);
+    }
+
+    mbtk_radio_state_enum radio = MBTK_RADIO_STATE_MINI_FUNC;
+    int reset = 0;
+    int err = mbtk_radio_state_set(qser_info_handle, radio, reset);
+    
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+
+    radio = MBTK_RADIO_STATE_FULL_FUNC;
+    err = mbtk_radio_state_set(qser_info_handle, radio, reset);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_get_version(sim_client_handle_type h_sim, char *buf)
+{
+    //UNUSED(h_sim);
+    //UNUSED(buf);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(buf == NULL)
+    {
+        LOGE("[qser_sim] buf is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    int err = mbtk_version_get(qser_info_handle, buf);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_version_get Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_reset_sim(sim_client_handle_type h_sim)
+{
+    //UNUSED(h_sim);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_radio_state_enum radio = MBTK_RADIO_STATE_DIS_SIM;
+    int reset = 0;
+    int err = mbtk_radio_state_set(qser_info_handle, radio, reset);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+
+    radio = MBTK_RADIO_STATE_FULL_FUNC;
+    err = mbtk_radio_state_set(qser_info_handle, radio, reset);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_addrxmsghandler(QSER_SIM_RxMsgHandlerFunc_t handlerPtr)
+{
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(handlerPtr == NULL)
+    {
+        LOGE("[qser_sim] param is NULL.");
+        qser_sim_state_cb = NULL;
+        return QSER_RESULT_SUCCESS;
+    }
+
+    qser_sim_state_cb = handlerPtr;
+    if(!qser_sim_cb_state)
+    {
+        int ret = mbtk_sim_state_change_cb_reg(qser_sim_state_change_cb);
+        if(ret != 0)
+        {
+            LOGE("[qser_sim] set cb fail.");
+            qser_sim_state_cb = NULL;
+            return QSER_RESULT_FAIL;
+        }
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+
+int qser_sim_client_deinit(sim_client_handle_type h_sim)
+{
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle)
+    {
+        int ret = mbtk_ril_close(MBTK_AT_PORT_DEF);;
+        if(ret)
+        {
+            LOGE("[qser_sim] mbtk_info_handle_free() fail.");
+            return QSER_RESULT_FAIL;
+        }
+        else
+        {
+            qser_info_handle = NULL;
+            qser_sim_state_cb = NULL;
+        }
+    }
+    else
+    {
+        LOGE("[qser_sim] handle not inited.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+
+/****************************API***************************************/
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_sleep.c b/mbtk/liblynq_lib_rilv2/lynq_sleep.c
new file mode 100755
index 0000000..91a8e28
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_sleep.c
@@ -0,0 +1,326 @@
+#include "lynq-qser-autosuspend.h"

+

+#include <stdio.h>

+#include <unistd.h>

+#include <stddef.h>

+#include <sys/types.h>

+#include <sys/stat.h>

+#include <fcntl.h>

+#include <pthread.h>

+#include <string.h>

+#include <stdlib.h>

+#include <errno.h>

+#include <sys/epoll.h>

+#include <linux/input.h>

+

+#include "mbtk_type.h"

+#include "mbtk_log.h"

+#include "mbtk_power.h"

+#include "mbtk_lpm.h"

+#include "mbtk_sleep.h"

+#include "mbtk_utils.h"

+#include "mbtk_ril_api.h"

+

+

+static bool call_Off  = FALSE;

+static bool nw_off = FALSE;

+static bool sms_off = FALSE;

+static bool data_off = FALSE;

+

+static mbtk_ril_handle* whitelist_info_handle = NULL;

+

+

+int qser_autosuspend_enable(char enable)

+{

+    int ret = 0;

+

+    ret = mbtk_autosuspend_enable(enable);

+    if (ret == -1)

+    {

+        LOGE("qser_autosuspend_enable is error");

+    }

+

+    return ret;

+}

+

+int qser_wakelock_create(const char* name , size_t len)

+{

+    int ret = 0;

+

+    ret = mbtk_wakelock_create(name, len);

+    if (ret == -1)

+    {

+        LOGE("qser_wakelock_create is error");

+    }

+

+    return ret;

+}

+

+int qser_wakelock_lock(int fd)

+{

+    int ret = 0;

+

+    ret = mbtk_wakelock_lock(fd);

+    if (ret == -1)

+    {

+        LOGE("qser_wakelock_lock is error");

+    }

+

+    return ret;

+}

+

+int qser_wakelock_unlock(int fd)

+{

+    int ret = 0;

+

+    ret = mbtk_wakelock_unlock(fd);

+    if (ret == -1)

+    {

+        LOGE("qser_wakelock_unlock is error");

+    }

+

+    return ret;

+}

+

+int qser_wakelock_destroy(int fd)

+{

+    int ret = 0;

+

+    ret = mbtk_wakelock_destroy(fd);

+    if (ret == -1)

+    {

+        LOGE("qser_wakelock_destroy is error");

+    }

+

+    return ret;

+}

+

+int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)

+{

+    UNUSED(qser_lpm_cfg);

+

+    if(mbtk_lpm_init((mbtk_lpm_handler_t)qser_lpm_handler))

+    {

+        LOGE("qser_lpm_init fail");

+        return -1;

+    }

+

+    return 0;

+}

+

+int qser_lpm_deinit(void)

+{

+    mbtk_lpm_deinit();

+

+    return 0;

+}

+

+/*

+例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,

+其中PS DATA目前暂时不支持,只是保留了这个标志位;

+AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA

+0 means resume all.

+目标文件"/system/etc/powerind"

+如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13

+

+*/

+

+int qser_whitelist_set(char* whitelish)

+{

+    //UNUSED(whitelish);

+    uint32 on = 0;

+    int call_t, nw_t, data_t, sms_t, tmp;

+

+    int len = strlen(whitelish);

+

+    if (len != 4)

+    {

+        LOGE("whitelish num error num=[%d]",len);

+        return -1;

+    }

+

+    tmp = atoi(whitelish);

+

+    call_t = tmp/1000;

+    nw_t = tmp%1000/100;

+    data_t = tmp%1000%100/10;

+    sms_t = tmp%1000%100%10;

+

+    if (call_t == 1)

+        call_Off = TRUE;

+    else

+        call_Off = FALSE;

+

+    if (nw_t == 1)

+        nw_off = TRUE;

+    else

+        nw_off = FALSE;

+

+    if (data_t == 1)

+        data_off = TRUE;

+    else

+        data_off = FALSE;

+

+    if (sms_t == 1)

+        sms_off = TRUE;

+    else

+        sms_off = FALSE;

+

+    if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)

+    {

+        on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内

+    }

+    else

+    {

+        if (call_Off == TRUE)

+            call_t = 8;

+        else

+            call_t = 0;

+

+        if (nw_off == TRUE)

+            nw_t = 1;

+        else

+            nw_t = 0;

+

+        if (data_off == TRUE)

+            data_t = 16;

+        else

+            data_t = 0;

+

+        if (sms_off == TRUE)

+            sms_t = 4;

+        else

+            sms_t = 0;

+

+        on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内

+    }

+

+    if(whitelist_info_handle == NULL)

+    {

+        whitelist_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);

+        if(whitelist_info_handle)

+        {

+            LOGI("creat whitelist_info_handle is success");

+        }

+        else

+        {

+            LOGE("creat whitelist_info_handle is fail");

+            return -1;

+        }

+    }

+

+    int err = mbtk_wakeup_state_set(whitelist_info_handle, on);

+    if(err)

+    {

+        LOGE("whitelist_info_handle Error : %d", err);

+        return -1;

+    }

+

+    if(whitelist_info_handle != NULL)

+    {

+        int ret_ril = mbtk_ril_close(MBTK_AT_PORT_DEF);

+        if (ret_ril == MBTK_RIL_ERR_SUCCESS)

+        {

+            LOGI("deinit whitelist_info_handle is succuess");

+            whitelist_info_handle = NULL;

+        }

+        else

+        {

+            LOGE("deinit whitelist_info_handle is error(%d)",ret_ril);

+            return -1;

+        }

+    }

+

+    return 0;

+}

+

+

+int qser_whitelist_get(char* whitelish)

+{

+    //UNUSED(whitelish);

+    char list[10] = {0};

+    int get_tmp;

+

+    get_tmp = mbtk_powerrind_get();

+    LOGI(">>>powerrind_get: %d",get_tmp);

+    //call 8   nw 1   data 16  sms 4    SIM的上报会一直被包含在内

+    switch(get_tmp)

+    {

+        case 0:

+            sprintf(list, "%d%d%d%d", 1, 1, 1, 1);

+            break;

+        case 8:

+            sprintf(list, "%d%d%d%d", 0, 1, 1, 1);

+            break;

+        case 1:

+            sprintf(list, "%d%d%d%d", 1, 0, 1, 1);

+            break;

+        case 16:

+            sprintf(list, "%d%d%d%d", 1, 1, 0, 1);

+            break;

+        case 4:

+            sprintf(list, "%d%d%d%d", 1, 1, 1, 0);

+            break;

+

+        case 9:

+            sprintf(list, "%d%d%d%d", 0, 0, 1, 1);

+            break;

+        case 24:

+            sprintf(list, "%d%d%d%d", 0, 1, 0, 1);

+            break;

+        case 12:

+            sprintf(list, "%d%d%d%d", 0, 1, 1, 0);

+            break;

+        case 17:

+            sprintf(list, "%d%d%d%d", 1, 0, 0, 1);

+            break;

+        case 5:

+            sprintf(list, "%d%d%d%d", 1, 0, 1, 0);

+            break;

+        case 20:

+            sprintf(list, "%d%d%d%d", 1, 1, 0, 0);

+            break;

+

+        case 25:

+            sprintf(list, "%d%d%d%d", 0, 0, 0, 1);

+            break;

+        case 13:

+            sprintf(list, "%d%d%d%d", 0, 0, 1, 0);

+            break;

+        case 28:

+            sprintf(list, "%d%d%d%d", 0, 1, 0, 0);

+            break;

+        case 21:

+            sprintf(list, "%d%d%d%d", 1, 0, 0, 0);

+            break;

+

+        case 29:

+            sprintf(list, "%d%d%d%d", 0, 0, 0, 0);

+            break;

+

+         default :

+            LOGE("qser_whitelist_get is error");

+            return -1;

+    }

+

+    LOGI("whitelist list: %s",list);

+    strncpy(whitelish, list, strlen(list));

+

+    return 0;

+}

+

+

+int qser_suspend_timer_set(int time, mbtk_sleep_callback_func cb)

+{

+    int ret = 0;

+    ret = mbtk_suspend_timer_set(time, cb);

+    if(0 > ret)

+    {

+        LOGE("qser_suspend_timer_set failed");

+    }

+

+

+    return ret;

+}

+

+

diff --git a/mbtk/liblynq_lib_rilv2/lynq_sms.c b/mbtk/liblynq_lib_rilv2/lynq_sms.c
new file mode 100755
index 0000000..1c839a5
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_sms.c
@@ -0,0 +1,673 @@
+#include "lynq_qser_sms.h"
+#include "mbtk_type.h"
+#include "mbtk_pdu_sms.h"
+#include "lynq_sms.h"
+#include "mbtk_log.h"
+#include "mbtk_ril_api.h"
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+#define TELEPHONE_NUM_MAX 16
+#define MSM_NUMBER_MAX 2048+1
+#define RES_NUM_MIN 128
+
+#define HAL_SMS_CONTENT_LEN 1024
+
+
+#define QSER_RESULT_SUCCESS 0
+#define QSER_RESULT_FAIL -1
+
+#define DSC_to_msg(DSC) (DSC == 0 ? "Bit7" : (DSC == 1 ? "Bit8" : "UCS2"))
+
+static mbtk_ril_handle* qser_info_handle;
+static const uint qser_h_sms = 0x5F6F7F8F;
+
+
+static char sms_center_address[128] = {0};
+
+typedef struct
+{
+    QSER_SMS_RxMsgHandlerFunc_t handlerPtr;
+    void* contextPtr;
+} lynq_sms_cb_func;
+
+static lynq_sms_cb_func lynq_sms_func_cb_handle;
+
+void lynq_sms_state_change_cb(const void* data, int data_len)
+{
+    LOGV("sms_state_change_cb()----------start\n");
+    mbtk_ril_sms_state_info_t *ptr = (mbtk_ril_sms_state_info_t *)data;
+        //LOGD("3sms_state_change_cb() : %s\n", ptr->pdu);
+
+    QSER_SMS_Msg_t tmp_data;
+
+    memset(&tmp_data,0x00, sizeof(QSER_SMS_Msg_t));
+
+    char smsc[MDAPI_MAX_PDU_SIZE] = {0};
+    char received_pdu[MDAPI_MAX_PDU_SIZE] = {0};
+    char msg[MDAPI_MAX_PDU_SIZE] = {0};
+    char num[MDAPI_MAX_PDU_SIZE] = {0};
+    char date[32] = {0};
+    int charset = 0;
+    int ret = -1;
+    int curr_pack = 1;
+    int total_pack = 1;
+    if(ptr == NULL)
+    {
+        LOGE("ptr is null");
+    }
+    LOGE("ptr: %s\n,data_len = %d\n", (char *)ptr->pdu, data_len);
+    if(data_len > MDAPI_MAX_PDU_SIZE)
+    {
+        strncpy(received_pdu, (const char *)ptr->pdu, MDAPI_MAX_PDU_SIZE-1);
+    }
+    else
+    {
+        strncpy(received_pdu, (const char *)ptr->pdu, data_len);
+    }
+    ret = smsPduDecode((const char *)received_pdu, data_len, num, smsc, msg, &charset, &curr_pack, &total_pack,date);
+    if(ret != 0)
+    {
+        LOGE("smsPduDecode fail ret: %d\n",ret);
+        return ;
+    }
+
+    LOGE("[EVENT][MT_SMS]PDU decode:smsc: %s\n, phone number: %s\ncharset: %d\n msg_len: %d\n message content: %s\n curr_pack: %d\n total_pack: %d\n date: %s", smsc, num, charset, strlen(msg), msg, curr_pack, total_pack, date);
+
+    tmp_data.format = charset;
+    memcpy(tmp_data.src_addr, num, strlen(num));
+    tmp_data.sms_data_len = strlen(msg);
+    memcpy(tmp_data.sms_data, msg, strlen(msg));
+
+    if(total_pack > 1 && curr_pack < total_pack)
+    {
+        tmp_data.user_data_head_valid = TRUE;
+        tmp_data.user_data_head.total_segments = total_pack;
+        tmp_data.user_data_head.seg_number = curr_pack;
+        lynq_sms_func_cb_handle.handlerPtr(&tmp_data, &curr_pack);
+    }
+    else
+    {
+        tmp_data.user_data_head_valid = FALSE;
+        tmp_data.user_data_head.total_segments = total_pack;
+        tmp_data.user_data_head.seg_number = curr_pack;
+        lynq_sms_func_cb_handle.handlerPtr(&tmp_data, NULL);
+    }
+
+}
+
+
+int qser_sms_client_init(sms_client_handle_type *ph_sms)//out
+{
+    //UNUSED(ph_voice);
+    if(ph_sms == NULL)
+   {
+       LOGE("[qser_sms] ph_sms is NULL.");
+       return QSER_RESULT_FAIL;
+   }
+
+   if(NULL == qser_info_handle)
+   {
+       qser_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+       if(NULL == qser_info_handle)
+       {
+           LOGE("[qser_sms] qser_info_handle get fail.");
+           return QSER_RESULT_FAIL;
+       }
+   }
+   else
+   {
+        LOGE("[qser_sms] qser_info_handle has init.");
+        *ph_sms = qser_h_sms;
+        return QSER_RESULT_FAIL;
+   }
+   *ph_sms = qser_h_sms;
+
+   LOGE("[qser_sms] qser_info_handle get success.");
+
+
+    return QSER_RESULT_SUCCESS;
+
+}
+
+
+int qser_sms_client_deinit(sms_client_handle_type h_sms)//in
+{
+    if(h_sms != qser_h_sms)
+    {
+        LOGE("[qser_sms] h_sms is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle)
+    {
+        int ret = mbtk_ril_close(MBTK_AT_PORT_DEF);;
+        if(ret)
+        {
+            LOGE("[qser_sms] mbtk_info_handle_free() fail.");
+            return QSER_RESULT_FAIL;
+        }
+        else
+        {
+            qser_info_handle = NULL;
+            lynq_sms_func_cb_handle.handlerPtr = NULL;
+        }
+    }
+    else
+    {
+        LOGE("[qser_sms] handle not inited.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+
+int qser_sms_send_sms(sms_client_handle_type h_sms, QSER_sms_info_t *pt_sms_info)//in in 发送短信的内容、目的号码
+{
+    if(h_sms != qser_h_sms)
+    {
+        LOGE("[qser_sms] h_sms is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if (pt_sms_info == NULL)
+    {
+        LOGE("QSER_sms_info_t NULL");
+        return -1;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_sms_send_sms qser_info_handle NULL");
+        return -1;
+    }
+
+    int8 *phone_num = NULL;
+    int8 *msg = NULL;
+	int32 msg_len;
+
+    char cmgs[MSM_NUMBER_MAX] = {0};
+    char resp[RES_NUM_MIN] = {0};
+
+    char smscPDU[30] = {0};
+    char **pdu = NULL;
+    char smsc[4] = {0};
+    char msg_e_b[HAL_SMS_CONTENT_LEN] = {0};// +1 for end of string.*2:A char array contains two elements of a string for each value
+
+    int char_set = 0;
+    int lsms_flag = 0;
+    int err = 0;
+    int i = 0;
+
+    msg = (int8 *)pt_sms_info->sms_data;
+
+    msg_len = strlen(pt_sms_info->sms_data);
+
+    phone_num = (int8 *)pt_sms_info->src_addr;
+
+    lsms_flag = pt_sms_info->user_data_head_valid;
+
+    if(strcmp((char*)msg,"") == 0 || msg[0] == '\0')
+    {
+        LOGE("qser_sms_send_sms msg [%s]",msg);
+        return -1;
+    }
+
+    if(strcmp((char*)phone_num,"") == 0 || phone_num[0] == '\0')
+    {
+        LOGE("qser_sms_send_sms phone_num [%s]",phone_num);
+        return -1;
+    }
+
+    if (pt_sms_info->format == 0)//7
+        char_set = 0;
+    else if (pt_sms_info->format == 1)//8
+        char_set = 1;
+    else if (pt_sms_info->format == 2)//UCS2
+        char_set = 2;
+    else
+    {
+        LOGE("qser_sms_send_sms format error");
+        return -1;
+    }
+
+
+    //设置存储器
+/*
+    if (pt_sms_info->storage == 0)
+    {
+        strcpy(mem, "SM");
+    }
+    else if (pt_sms_info->storage == 1)
+    {
+        strcpy(mem, "ME");
+    }
+    else
+    {
+        LOGE("qser_sms_deletefromstorage storage is no Support");
+        return -1;
+    }
+
+    memset(resp, 0, sizeof(resp));
+    err = mbtk_sms_cpms_set(qser_info_handle, mem, resp);
+    if(err) {
+        LOGE("Error : %d", err);
+    } else {
+        LOGI("cpms set success. resp:%s", resp);
+    }
+*/
+
+
+
+    kal_int32 msg_num = 0;
+    kal_int32 pdu_msg_len = 0;
+    kal_int32 status = MDAPI_RET_ERROR;
+    kal_int32 index = 0;
+
+    if(char_set == 1) //8bit
+    {
+        ArrayToStr((unsigned char *)msg, (unsigned int)msg_len, msg_e_b);
+        status = _mdapi_sms_get_msg_num(msg_e_b, char_set, &msg_num, &pdu_msg_len);
+    }
+    else //7bit usc2
+    {
+        status = _mdapi_sms_get_msg_num((char *)msg, char_set, &msg_num, &pdu_msg_len);
+    }
+    
+    LOGE("msg_len = [%d] ,msg_num=[%d]",msg_len, msg_num);
+    if(status == MDAPI_RET_ERROR)
+    {
+        LOGE("get message number failed");
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {        
+        if (lsms_flag == TRUE || lsms_flag == FALSE)
+        {
+            if (lsms_flag == FALSE && msg_num > 1)
+            {
+                LOGE("msg_num %d user head need for true",msg_num);
+                return QSER_RESULT_FAIL;
+            }
+            else if (lsms_flag == TRUE && msg_num > 4)
+            {
+                LOGE("Only 4 long SMS messages are supported");
+                return QSER_RESULT_FAIL;
+            }
+        }
+        else
+        {
+            LOGE("1:TRUE long sms 0:FALSE short message set user head error:%d",lsms_flag);
+            return QSER_RESULT_FAIL;
+        }
+
+    
+        //allocate memery for **pdu
+        pdu = (char **)malloc(sizeof(char *) * msg_num);
+        if(pdu == NULL)
+        {
+            LOGE("allocate memory for pdu failed");
+            return QSER_RESULT_FAIL;
+        }
+        else
+        {
+            for(index = 0; index < msg_num; index++)
+            {
+                pdu[index] = (char *)malloc(sizeof(char)*MAX_PDU_SIZE);
+                if(pdu[index] == NULL)
+                {
+                    for(i = 0; i < index; i++)
+                    {
+                        free(pdu[i]);
+                        pdu[i] = NULL;
+                    }
+                    free(pdu);
+                    pdu = NULL;
+                    LOGE("allocate memory for pdu[%d] failed",index);
+                    return QSER_RESULT_FAIL;
+                }
+                else
+                {
+                    memset(pdu[index], 0, MAX_PDU_SIZE);
+                    LOGE("pdu[%d} init value is: %s ",index, pdu[index]);
+                }
+            }
+        }
+    }
+
+    //allocate memory for **pdu success
+    if(index == msg_num)
+    {
+        if(char_set == 1)//8bit
+        {
+            smsPduEncode(smsc, (char *)phone_num, msg_e_b, char_set, smscPDU, pdu);
+        }
+        else
+        {
+            smsPduEncode(smsc, (char *)phone_num, (char *)msg, char_set, smscPDU, pdu);
+        }
+
+        for(index = 0; index < msg_num; index++)
+        {
+            char pdu_data[MAX_PDU_SIZE] = {0};
+            char *p = pdu_data;
+
+            LOGE("index:%d",index);
+            LOGE("smscPDU: %s, pdu: %s",smscPDU, pdu[index]);
+            sprintf(p, "%s",smscPDU);
+            LOGE("pdu_data:%s\n", pdu_data);
+            int sc = strlen(pdu_data);
+            sprintf(p+strlen(p), "%s", pdu[index]);
+            LOGE("pdu_data:%s", pdu_data);
+
+            int t = strlen(pdu_data);
+            sprintf(cmgs, "%d,%s", (t-sc)/2, pdu_data);
+            LOGE("cmgs:%s\n", cmgs);
+            memset(resp, 0, sizeof(resp));
+
+            err = mbtk_sms_cmgf_set(qser_info_handle, 0);
+            if(err)
+            {
+                LOGE("cmgf set error : %d", err);
+                for(index = 0; index < msg_num; index++){
+                    free(pdu[index]);
+                    pdu[index] = NULL;
+                }
+                free(pdu);
+                pdu = NULL;
+                return QSER_RESULT_FAIL;
+            }
+            else
+            {
+                LOGD("cmgf set success");
+            }
+
+            err = mbtk_sms_cmgs_set(qser_info_handle, cmgs, resp);
+            if(err)
+            {
+                LOGE("cmgs send fail (%d)",err);
+                for(index = 0; index < msg_num; index++){
+                    free(pdu[index]);
+                    pdu[index] = NULL;
+                }
+                free(pdu);
+                pdu = NULL;
+                return QSER_RESULT_FAIL;
+            }
+            else
+            {
+                LOGD("cmgs send success, resp:%s", resp);
+            }
+
+        }
+    }
+
+    for(index = 0; index < msg_num; index++){
+        free(pdu[index]);
+        pdu[index] = NULL;
+    }
+    free(pdu);
+    pdu = NULL;
+
+    return 0;
+}
+
+//注册接收新短信
+int qser_sms_addrxmsghandler(QSER_SMS_RxMsgHandlerFunc_t handlerPtr, void* contextPtr)//in sms电话状态回调函数 in 主要是获取 上报 的内容
+{
+    //UNUSED(handlerPtr);
+    //UNUSED(contextPtr);
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_sms_addrxmsghandler qser_info_handle NULL");
+        return -1;
+    }
+
+    int err = mbtk_sms_cnmi_set(qser_info_handle);
+    if(err)
+    {
+        LOGE("set cnmi fail (%d)",err);
+        return -1;
+    }
+
+    lynq_sms_func_cb_handle.handlerPtr = handlerPtr;
+    lynq_sms_func_cb_handle.contextPtr = contextPtr;
+
+    err = mbtk_sms_state_change_cb_reg(lynq_sms_state_change_cb);
+    if(err)
+    {
+        LOGE("mbtk_sms_state_change_cb_reg fail (%d)",err);
+        return -1;
+    }
+
+    return 0;
+}
+
+//删除短信
+int qser_sms_deletefromstorage(sms_client_handle_type h_sms, QSER_sms_storage_info_t *pt_sms_storage)//in in 删除短信的信息
+{
+    //UNUSED(h_sms);
+    //UNUSED(pt_sms_storage);
+    char cmgd[128] = {0};
+    int err = 0;
+
+    if(h_sms != qser_h_sms)
+    {
+        LOGE("[qser_sms] h_sms is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(pt_sms_storage == NULL)
+    {
+        LOGE("qser_sms_deletefromstorage pt_sms_storage NULL");
+        return -1;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_sms_deletefromstorage qser_info_handle NULL");
+        return -1;
+    }
+/*
+    t_storage = pt_sms_storage->storage; //设置存储器
+
+    if (t_storage == 0)
+    {
+        strncpy(mem, "SM", 2);
+    }
+    else if (t_storage == 1)
+    {
+        strncpy(mem, "ME", 2);
+    }
+    else
+    {
+        LOGE("qser_sms_deletefromstorage storage is no Support");
+        return -1;
+    }
+
+    memset(resp, 0, sizeof(resp));
+    err = mbtk_sms_cpms_set(qser_info_handle, mem, resp);
+    if(err) {
+        LOGE("Error : %d", err);
+    } else {
+        LOGI("cpms set success. resp:%s", resp);
+    }
+*/
+    uint32_t id_x = 0; //若后面其他产品是int类型则用宏控制
+    id_x = pt_sms_storage->storage_idx;//获取idx的值
+
+    if(id_x == -1)      //delete all
+    {
+        memcpy(cmgd, "0,4", strlen("0,4"));
+    }
+    else
+    {
+        sprintf(cmgd,"%d",id_x);
+    }
+
+    LOGI("cmgd:%s", cmgd);
+
+    err = mbtk_sms_cmgd_set(qser_info_handle, cmgd);
+    if(err)
+    {
+        LOGE("qser_sms_deletefromstorage Error : %d", err);
+        return -1;
+    }
+    else
+    {
+        LOGI("qser_sms_deletefromstorage set success");
+    }
+
+    return 0;
+}
+
+//获取短信中心号码
+int qser_sms_getsmscenteraddress( sms_client_handle_type h_sms,QSER_sms_service_center_cfg_t *set_sca_cfg)//in out
+{
+    //UNUSED(h_sms);
+    //UNUSED(set_sca_cfg);
+    char sms_center_addree[254] = {0};
+    int len_t;
+    char *p1, *p2 ,*substr;
+
+    if(h_sms != qser_h_sms)
+    {
+        LOGE("[qser_sms] h_sms is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if (set_sca_cfg == NULL)
+    {
+        LOGE("QSER_sms_service_center_cfg_t NULL");
+        return -1;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_sms_getsmscenteraddress qser_info_handle NULL");
+        return -1;
+    }
+
+    int err = mbtk_sms_csca_get(qser_info_handle, sms_center_addree);
+    if(sms_center_addree[0] == '\0')
+    {
+        LOGE("qser_sms_getsmscenteraddress Error : %d", err);
+        return -1;
+    }
+    else
+    {
+        p1 = strchr(sms_center_addree, '\"');
+        p2 = strrchr(sms_center_addree, '\"');
+        if (p1 && p2 && p2 > p1)
+        {
+            len_t = p2 - p1 - 1;
+            char substr_t[len_t + 1];
+            strncpy(substr_t, p1 + 1, len_t);
+            substr_t[len_t] = '\0';
+
+            substr = substr_t;
+
+            memcpy(set_sca_cfg->service_center_addr, substr, strlen(substr));
+            memcpy(sms_center_address, substr, strlen(substr));
+
+            LOGI("qser_sms_getsmscenteraddress success");
+        }
+        else
+        {
+            LOGE("String inside double quotes not found");
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+//设置短信中心号码
+int qser_sms_setsmscenteraddress( sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *get_sca_cfg)//in in
+{
+    //UNUSED(h_sms);
+    //UNUSED(get_sca_cfg);
+    char *destNum = NULL;
+
+    if(h_sms != qser_h_sms)
+    {
+        LOGE("[qser_sms] h_sms is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_sms_setsmscenteraddress qser_info_handle NULL");
+        return -1;
+    }
+
+    if(get_sca_cfg == NULL)
+    {
+        LOGE("qser_sms_setsmscenteraddress get_sca_cfg NULL");
+        return -1;
+    }
+
+    destNum = get_sca_cfg->service_center_addr;
+
+    //printf("1destNum:%s\n", destNum);
+    memset(sms_center_address, 0, sizeof(sms_center_address));
+    memcpy(sms_center_address, destNum, strlen(destNum));
+
+    if (destNum == NULL)
+    {
+        LOGE("qser_sms_setsmscenteraddress destNum NULL");
+        return -1;
+    }
+
+    int err = mbtk_sms_csca_set(qser_info_handle, destNum);
+    if(err)
+    {
+        LOGE("Error : %d", err);
+        return -1;
+    }
+    else
+    {
+    //    memset(sms_center_address, 0, sizeof(sms_center_address));
+    //    memcpy(sms_center_address, destNum, strlen(destNum));
+        //printf("destNum:%s\n", destNum);
+        LOGI("qser_sms_setsmscenteraddress success");
+    }
+
+    return 0;
+}
+
+
+//显示删除列表
+int qser_sms_deletefromstoragelist( sms_client_handle_type h_sms, char* del_list)//in out
+{
+    //UNUSED(h_sms);
+    //UNUSED(get_sca_cfg);
+
+    if(h_sms != qser_h_sms)
+    {
+        LOGE("[qser_sms] h_sms is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("qser_sms_deletefromstoragelist qser_info_handle NULL");
+        return -1;
+    }
+
+    int err = mbtk_sms_cmgd_get(qser_info_handle, del_list);
+    if(err > 0  && err != 300)//MBTK_INFO_ERR_SUCCESS
+    {
+        LOGE("Error : %d", err);
+        return -1;
+    }
+
+    return 0;
+}
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_thermal.c b/mbtk/liblynq_lib_rilv2/lynq_thermal.c
new file mode 100755
index 0000000..6d0c76f
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_thermal.c
@@ -0,0 +1,98 @@
+#if 1
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+#include "lynq_qser_thermal.h"
+#include "mbtk_ril_api.h"
+
+/****************************DEFINE***************************************/
+#define QSER_RESULT_FAIL    -1
+#define QSER_RESULT_SUCCESS 0
+/****************************DEFINE***************************************/
+
+/****************************VARIABLE***************************************/
+static mbtk_ril_handle* qser_info_handle = NULL;
+
+/****************************VARIABLE***************************************/
+
+
+/******************************FUNC*****************************************/
+static int qser_thermal_client_init(void)
+{
+    qser_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+
+    if (qser_info_handle == NULL)
+    {
+        LOGE("[qser_led] qser_info_handle fail.");
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        LOGI("[qser_led] qser_info_handle success.");
+        return QSER_RESULT_SUCCESS;
+    }
+}
+
+static int qser_thermal_client_deinit(void)
+{
+    if(qser_info_handle != NULL)
+    {
+        int ret_ril = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if (ret_ril == MBTK_RIL_ERR_SUCCESS)
+        {
+            LOGI("deinit qser_info_handle is succuess");
+            return QSER_RESULT_SUCCESS;
+        }
+        else
+        {
+            LOGE("deinit qser_info_handle is error(%d)",ret_ril);
+            return QSER_RESULT_FAIL;
+        }
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+/******************************FUNC*****************************************/
+
+/****************************API***************************************/
+int get_thermal_zone(int *numbers, int size)
+{
+    if(numbers == NULL)
+    {
+        LOGE("[qser_thermal]: numbers is NULL!");
+        return QSER_RESULT_FAIL;
+    }
+    
+    int ret = 0;
+    int thermal = -1;
+    int thermal_num = 0;
+    int temp = 0;
+
+    ret = qser_thermal_client_init();
+    if(ret != QSER_RESULT_SUCCESS)
+    {
+        LOGE("[qser_thermal]qser_led_client_init fail.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    ret = mbtk_temp_get(qser_info_handle, 0, &temp);
+    thermal = temp;
+    if(ret != QSER_RESULT_SUCCESS)
+    {
+        LOGE("[qser_thermal]mbtk_temp_get fail.");
+        qser_thermal_client_deinit();
+        return QSER_RESULT_FAIL;
+    }
+
+    qser_thermal_client_deinit();
+    numbers[thermal_num++] = thermal;
+    for(; thermal_num < size; thermal_num++)
+    {
+        numbers[thermal_num] = 0;
+    }
+
+    return size;
+}
+/****************************API***************************************/
+
+#endif
diff --git a/mbtk/liblynq_lib_rilv2/lynq_time.c b/mbtk/liblynq_lib_rilv2/lynq_time.c
new file mode 100755
index 0000000..29937bd
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_time.c
@@ -0,0 +1,418 @@
+#include "lynq_systime.h"
+#include "mbtk_type.h"
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <errno.h>
+#include <netdb.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <netinet/in.h>
+
+#include <cutils/properties.h>
+#include <sys/time.h>
+
+
+#include "mbtk_ntp.h"
+#include "mbtk_net_control.h"
+#include "lynq_systime.h"
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+#include "mbtk_utils.h"
+
+
+#define MBTK_AT_NTP_LEN_MAX 128
+
+
+
+
+typedef enum {
+    LYNQ_TIME_TYPE_CELL = 0,  //NITZ
+    LYNQ_TIME_TYPE_NTP,
+    LYNQ_TIME_TYPE_GNSS,
+    LYNQ_TIME_TYPE_USER,
+
+    LYNQ_TIME_TYPE_UNUSE
+} lynq_time_type_enum;
+
+//enable set time from ntp
+int ntp_sync_time(int enable);
+//enable set time from nitz
+int modem_time_enable(int enable);
+//enable set time from gnss
+int gnss_time_enable(int enable);
+//enable set time from user
+int user_set_time(char* date, char* time);
+// RTC TIME set to system
+int lynq_sync_time_from_rtc(void);
+//check sysytem type
+int lynq_get_time_src_status (time_src_status_s * time_src);
+// system time set to RTC
+int lynq_set_rtc_time(void);
+// get RTC time
+int lynq_get_rtc_time(unsigned long *ulsec);
+
+int sync_time_flag = 0;
+
+//int req_time_set(int type, char *time, int *cme_err);
+static int metis_strptime(char *str_time)
+{
+    LOGD("%s(), str_time:%s\n", __FUNCTION__, str_time);
+    struct tm stm;
+//    char dateTime[30];
+    struct timeval tv;
+    if(strptime(str_time, "%Y-%m-%d %H:%M:%S",&stm) != NULL)
+    {
+        time_t _t = (long)mktime(&stm);
+        tzset();
+        tv.tv_sec = _t;
+        tv.tv_usec = 0;
+        if(_t == -1)
+        {
+            LOGD("Set time :%s", str_time);
+            LOGD("timestamp:%ld", _t);
+            LOGD("mktime error, reason: %s\n", strerror(errno));
+            return -1;
+        }
+
+        if(settimeofday(&tv, NULL)) {
+            LOGD("Set time :%s", str_time);
+            LOGD("timestamp:%ld", _t);
+            LOGD("mktime error, reason: %s\n", strerror(errno));
+            return -1;
+        }
+
+        LOGD("Success Set time to %s.\n", str_time);
+        return 0;
+
+    } else {
+        LOGD("Set time fail.");
+        return -1;
+    }
+    return 0;
+}
+
+
+static void* ntp_pthread_run(int* ntp_flag)
+{
+    if (mbtk_net_state_get() == MBTK_NET_STATE_OFF)
+    {
+        LOGD("Network is disconnected. Set time fail.");
+        if(NULL != ntp_flag)
+       {
+            *ntp_flag = -1;
+       }
+        return NULL;
+    }
+    LOGD("Network is connected.");
+
+    char time_type[10];
+    while(1){
+        memset(time_type, 0, 10);
+        property_get("persist.mbtk.time_type", time_type, "0");
+    	if(atoi(time_type) == LYNQ_TIME_TYPE_NTP) // NTP time
+    	{
+//            char time_str[100] = {0};
+            time_t time = 0;
+            if((time = (time_t)mbtk_at_systime()) == 0)
+            {
+                LOGD("NTP client fail!\n");
+                if(NULL != ntp_flag)
+                {
+                     *ntp_flag = -1;
+                }
+                return NULL;
+            }
+#if 1
+            struct tm CurlocalTime;
+            localtime_r(&time, &CurlocalTime);
+      //      CurlocalTime.tm_hour += 8;    //cst
+            char dateTime[30];
+            strftime(dateTime, 30, "%Y-%m-%d %H:%M:%S %A", &CurlocalTime);
+
+      //      printf("dateTime:%s, %ld\n", dateTime, time+28800);  //cst
+            LOGD("dateTime:%s, %ld\n", dateTime, time);
+
+            struct timeval tv;
+            tv.tv_sec = time;
+       //     tv.tv_sec += 28800;  //cst
+            tv.tv_usec = 0;
+
+            if(settimeofday(&tv, NULL)) {
+                LOGD("Set time :%s", dateTime);
+                LOGD("timestamp:%ld, tv.tv_sec:%ld\n", time, tv.tv_sec);
+
+                if(settimeofday(&tv, NULL)) {
+                    *ntp_flag = -1;
+                    LOGD("mktime error, reason: %s\n", strerror(errno));
+                    return NULL;
+                }
+            }
+            LOGD("Set time success\n");
+            lynq_set_rtc_time();
+#else
+
+            struct tm *tm_t;
+            tm_t = localtime(&time);
+            tm_t->tm_hour += 8;
+            strftime(time_str,128,"%F %T",tm_t);
+
+            // NTP time
+            if(metis_strptime(time_str))
+            {
+                *ntp_flag = -1;
+                return NULL;
+            }
+#endif
+            break;
+    	} else {
+            break;
+    	}
+
+        sleep(64); // Sleep 64s.
+    }
+    if(NULL != ntp_flag)
+    {
+         *ntp_flag = 0;
+    }
+    return NULL;
+}
+
+int set_time_user(char* data_time_str)
+{
+
+    int ret = 0;
+    if(strlen(data_time_str) > 0)
+    {
+        ret = metis_strptime(data_time_str);
+    }
+
+    return ret;
+}
+
+
+//MBTK_TIME_TYPE_CELL = 0,  //NITZ
+//MBTK_TIME_TYPE_NTP,
+//MBTK_TIME_TYPE_GNSS,
+//MBTK_TIME_TYPE_USER
+void set_time_type(int mbtk_time_type)
+{
+    char type_str[10] = {0};
+    sprintf(type_str, "%d", mbtk_time_type);
+    property_set("persist.mbtk.time_type", type_str);
+
+    return;
+}
+
+static int mbtk_get_gnss_time_set_flag() {
+    int type = 0;
+    char time_type[] ={0};
+    property_get("persist.mbtk.gnss_time_type", time_type, "0");
+
+    type = atoi(time_type);
+    LOGD("persist.mbtk.gnss_time_type :%d\n", type);
+    return type;
+}
+
+
+int ntp_sync_time(int enable)
+{
+    if(0 != enable && 1 != enable)
+    {
+        return -1;
+    }
+    UNUSED(enable);
+    int ntp_status = 0;
+    int ret = 0;
+    sync_time_flag = 0;
+    if(enable)
+    {
+        set_time_type(LYNQ_TIME_TYPE_NTP);
+        ntp_pthread_run(&ntp_status);
+        if(ntp_status == 0)
+        {
+            ret = 0;
+            sync_time_flag = 0;
+        }
+        else
+        {
+            ret = -1;
+            set_time_type(LYNQ_TIME_TYPE_UNUSE);
+            sync_time_flag = -1;
+        }
+    }
+    else
+    {
+        set_time_type(LYNQ_TIME_TYPE_UNUSE);
+    }
+
+    return ret;
+}
+
+//enable set time from nitz
+int modem_time_enable(int enable)
+{
+    if(0 != enable && 1 != enable)
+    {
+        return -1;
+    }
+    UNUSED(enable);
+    sync_time_flag = 0;
+
+    if(enable)
+    {
+        set_time_type(LYNQ_TIME_TYPE_CELL);
+    }
+    else
+    {
+        set_time_type(LYNQ_TIME_TYPE_UNUSE);
+    }
+    return 0;
+}
+
+
+//enable set time from gnss
+int gnss_time_enable(int enable)
+{
+    if(0 != enable && 1 != enable)
+    {
+        return -1;
+    }
+    UNUSED(enable);
+    sync_time_flag = 0;
+    if(enable)
+    {
+        set_time_type(LYNQ_TIME_TYPE_GNSS);
+    }
+    else
+    {
+        set_time_type(LYNQ_TIME_TYPE_UNUSE);
+    }
+
+    return 0;
+}
+
+
+//enable set time from user
+int user_set_time(char* date, char* time)
+{
+    UNUSED(date);
+    UNUSED(time);
+    if(date == NULL || time == NULL)
+    {
+        return -1;
+    }
+
+    int ret = 0;
+    char time_str[128] ={0};
+    memset(time_str, 0x0, MBTK_AT_NTP_LEN_MAX);
+
+    char *p = time;
+    char *p1 = strstr(p, ":");
+    char *p2 = strstr(p1+1, ":");
+    if(p2 == NULL)
+    {
+        sprintf(time_str, "%s %s:00", date, time);  //2023-11-30 11:30
+        set_time_type(LYNQ_TIME_TYPE_USER);
+        ret = set_time_user(time_str);
+    }else
+    {
+        sprintf(time_str, "%s %s", date, time); //2023-11-30 11:30:31
+        set_time_type(LYNQ_TIME_TYPE_USER);
+        ret = set_time_user(time_str);
+    }
+
+    return ret;
+}
+
+
+//check sysytem type
+int lynq_get_time_src_status (time_src_status_s * time_src)
+{
+    UNUSED(time_src);
+    int type = 0;
+    char time_type[] ={0};
+    property_get("persist.mbtk.time_type", time_type, "0");
+
+    type = atoi(time_type);
+    printf("time_type :%d", type);
+    if(type == LYNQ_TIME_TYPE_NTP)
+    {
+        time_src->ntp = 1;
+        time_src->nitz = 0;
+        time_src->gnss = 0;
+    }
+    else if(type == LYNQ_TIME_TYPE_CELL)
+    {
+        time_src->ntp = 0;
+        time_src->nitz = 1;
+        time_src->gnss = 0;
+    }
+    else if(type == LYNQ_TIME_TYPE_GNSS)
+    {
+        time_src->ntp = 0;
+        time_src->nitz = 0;
+        time_src->gnss = 1;
+    }
+    else if(type == LYNQ_TIME_TYPE_UNUSE)
+    {
+        time_src->ntp = 0;
+        time_src->nitz = 0;
+        time_src->gnss = 0;
+    }
+
+    return 0;
+}
+
+// RTC TIME set to system
+int lynq_sync_time_from_rtc(void)
+{
+    mbtk_system("hwclock --hctosys");
+    return 0;
+}
+
+// system time set to RTC
+int lynq_set_rtc_time(void)
+{
+//    system("hwclock --systohc");
+    mbtk_system("hwclock -w rtc0");
+    return 0;
+}
+
+int lynq_get_rtc_time(unsigned long *ulsec)
+{
+    UNUSED(ulsec);
+
+    return 0;
+}
+
+
+int get_sync_time_result(void )
+{
+    int type = 0;
+    int gnss_status = 0;
+    char time_type[] ={0};
+    property_get("persist.mbtk.time_type", time_type, "0");
+    type = atoi(time_type);
+    printf("time_type :%d", type);
+    if(type == LYNQ_TIME_TYPE_GNSS)
+    {
+        gnss_status = mbtk_get_gnss_time_set_flag();
+        if(gnss_status)   //success
+        {
+            sync_time_flag = 0;
+        }
+        else{
+            sync_time_flag = -1;
+        }
+    }
+    LOGD("mbtk_gnss_time_set_flag :%d", mbtk_get_gnss_time_set_flag());
+    return sync_time_flag;
+}
+
+
+
+
+
diff --git a/mbtk/liblynq_lib_rilv2/lynq_voice_call.c b/mbtk/liblynq_lib_rilv2/lynq_voice_call.c
new file mode 100755
index 0000000..97ddc63
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_voice_call.c
Binary files differ
diff --git a/mbtk/liblynq_lib_rilv2/lynq_wifi.c b/mbtk/liblynq_lib_rilv2/lynq_wifi.c
new file mode 100755
index 0000000..a2b08b7
--- /dev/null
+++ b/mbtk/liblynq_lib_rilv2/lynq_wifi.c
@@ -0,0 +1,1103 @@
+#include "sta_cli.h"
+#include "lynq_wifi.h"
+#include "mbtk_log.h"
+#include "mbtk_wifi_ap.h"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+#define STA_BUF_SIZE 2048
+#define PATH_MAX_LEN 64
+#define DEF_INTERFACE "wlan0"
+static lynq_wifi_event_handle_sta g_event_handle_sta_cb = NULL;
+static lynq_wifi_status_e g_ap_status = LYNQ_WIFI_AP_STATUS_NONE;
+
+
+
+int qser_wifi_enable(void)
+{
+    static char sta_cli_buf[STA_BUF_SIZE] = "OPEN";
+    char reply[STA_BUF_SIZE];
+    if(sta_cli_cmd_parse(sta_cli_buf, reply, STA_BUF_SIZE))
+    {
+        if(strlen(reply) > 0)
+        {
+             LOGE("reply data(%s).\n",reply);
+        }
+        else
+        {
+            LOGE("No reply data(%s).\n",sta_cli_buf);
+            return LYNQ_ERR_FAIL;
+		}
+    }
+    else
+    {
+        LOGE("Parse cmd fail.\n");
+        return LYNQ_ERR_FAIL;
+    }
+
+    g_ap_status = LYNQ_WIFI_AP_STATUS_ENABLING;
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_disable(void)
+{
+    static char sta_cli_buf[STA_BUF_SIZE] = "CLOSE";
+    char reply[STA_BUF_SIZE];
+    if(sta_cli_cmd_parse(sta_cli_buf, reply, STA_BUF_SIZE)){
+        if(strlen(reply) > 0)
+        {
+           LOGE("reply data(%s).\n",reply);
+        }
+        else
+        {
+           LOGE("No reply data(%s).\n",sta_cli_buf);
+           return LYNQ_ERR_FAIL;
+		}
+    }
+    else
+    {
+        LOGE("Parse cmd fail.\n");
+        return LYNQ_ERR_FAIL;
+    }
+
+    g_ap_status = LYNQ_WIFI_AP_STATUS_IDLE;
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_work_mode_set(lynq_wifi_work_mode_e type)
+{
+    int ret = 0;
+     if(LYNQ_WIFI_WORK_MODE_AP0 == type)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "hw_mode", "g");
+    }
+    else
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "hw_mode", "a");
+    }
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_work_mode_get(lynq_wifi_work_mode_e *type)
+{
+    int ret = 0;
+    char value[SETTING_VALUE_MAX_LEN] = {0};
+
+    if(NULL == type)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+    
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "hw_mode", value, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    if('g' == value[0])
+    {
+        *type = LYNQ_WIFI_AP_INDEX_AP0;
+    }
+    else
+    {
+        *type = LYNQ_WIFI_AP_INDEX_AP1;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_ap_get_status(lynq_wifi_ap_index_e idx, lynq_wifi_ap_status_t* ap_stat)
+{
+    if(NULL == ap_stat)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    int ret = mbtk_wifi_get_setting(SETTING_FILE, "ssid", ap_stat->bssid, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    ap_stat->status = g_ap_status;
+    memcpy(ap_stat->ifname, DEF_INTERFACE, strlen(DEF_INTERFACE));
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_ap_acl_set(lynq_wifi_ap_index_e idx, lynq_wifi_mac_acl_rule_e acl_rule, char *mac_list)
+{
+    int ret = 0;
+    char path[PATH_MAX_LEN] = {0};
+    
+    if(NULL == mac_list)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    if(LYNQ_WIFI_MAC_ACL_RULE_WHITE_LIST == acl_rule)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "macaddr_acl", "1");
+        memcpy(path, ACL_ACCEPT_FILE, strlen(ACL_ACCEPT_FILE));
+        
+    }
+    else if(LYNQ_WIFI_MAC_ACL_RULE_BLACK_LIST == acl_rule)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "macaddr_acl", "0");
+        memcpy(path, ACL_DENY_FILE, strlen(ACL_DENY_FILE));
+    }
+    else
+    {
+        LOGE("qser_wifi_ap_acl_set LYNQ_WIFI_MAC_ACL_RULE_NONE");
+        return LYNQ_ERR_SUCCESS;
+    }
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    ret = mbtk_wifi_set_file(path, mac_list);
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_ap_acl_get(lynq_wifi_ap_index_e idx, lynq_wifi_mac_acl_rule_e *acl_rule, char *mac_list)
+{
+    int ret = 0;
+    char value[SETTING_VALUE_MAX_LEN] = {0};
+    char path[PATH_MAX_LEN] = {0};
+
+    if(NULL == acl_rule || NULL == mac_list)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "macaddr_acl", value, SETTING_LINE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    if('1' == value[0])
+    {
+        *acl_rule = LYNQ_WIFI_MAC_ACL_RULE_WHITE_LIST;
+        memcpy(path, ACL_ACCEPT_FILE, strlen(ACL_ACCEPT_FILE));
+    }
+    else if('0' == value[0])
+    {
+        *acl_rule = LYNQ_WIFI_MAC_ACL_RULE_BLACK_LIST;
+        memcpy(path, ACL_DENY_FILE, strlen(ACL_DENY_FILE));
+    }
+    else
+    {
+        *acl_rule = LYNQ_WIFI_MAC_ACL_RULE_NONE;
+        LOGE("qser_wifi_ap_acl_get LYNQ_WIFI_MAC_ACL_RULE_NONE");
+        return LYNQ_ERR_SUCCESS;
+    }
+
+    ret = mbtk_wifi_get_file(path, mac_list, SETTING_LINE_MAX_LEN);
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_ap_ssid_set(lynq_wifi_ap_index_e idx, const char *ssid)
+{
+    int ret = 0;
+     
+    if(NULL == ssid)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+     
+    ret = mbtk_wifi_set_setting(SETTING_FILE, "ssid", ssid);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_ap_ssid_get(lynq_wifi_ap_index_e idx, char *ssid)
+{
+    int ret = 0;
+
+    if(NULL == ssid)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+    
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "ssid", ssid, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_ap_ssid_hide_set(lynq_wifi_ap_index_e idx,bool hide)
+{
+    int ret = 0;
+    if(true == hide)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "ignore_broadcast_ssid", "0");
+    }
+    else
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "ignore_broadcast_ssid", "1");
+    }
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+    
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_ap_ssid_hide_get(lynq_wifi_ap_index_e idx,bool* hide)
+{
+    int ret = 0;
+    char value[SETTING_VALUE_MAX_LEN] = {0};
+
+    if(NULL == hide)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "ignore_broadcast_ssid", value, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    if('0' == value[0])
+    {
+        *hide = true;
+    }
+    else
+    {
+        *hide = false;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_ap_mode_set(lynq_wifi_ap_index_e idx, lynq_wifi_mode_type_e mode)
+{
+    int ret = 0;
+    if(LYNQ_WIFI_MODE_80211B == mode)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "ieee80211b", "1");
+    }
+    else if(LYNQ_WIFI_MODE_80211BG == mode)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "ieee80211bg", "1");
+    }
+    else if(LYNQ_WIFI_MODE_80211BGN == mode)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "ieee80211bgn", "1");
+    }
+    else if(LYNQ_WIFI_MODE_80211A == mode)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "ieee80211a", "1");
+    }
+    else if(LYNQ_WIFI_MODE_80211AN == mode)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "ieee80211an", "1");
+    }
+    else if(LYNQ_WIFI_MODE_80211AC == mode)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "ieee80211ac", "1");
+    }
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_ap_mode_get(lynq_wifi_ap_index_e idx, lynq_wifi_mode_type_e* mode)
+{
+    int ret = 0;
+    char value[SETTING_VALUE_MAX_LEN] = {0};
+
+    if(NULL == mode)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "ieee80211b", value, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    if('1' == value[0])
+    {
+        *mode = LYNQ_WIFI_MODE_80211B;
+    }
+
+    memset(value, 0, SETTING_VALUE_MAX_LEN);
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "ieee80211bg", value, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    if('1' == value[0])
+    {
+        *mode = LYNQ_WIFI_MODE_80211BG;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_ap_bandwidth_set(lynq_wifi_ap_index_e idx, lynq_wifi_bandwidth_type_e bandwidth)
+{
+    int ret = 0;
+    if(LYNQ_WIFI_BANDWIDTH_HT20 == bandwidth)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "vht_oper_chwidth", "0");
+    }
+    else if(LYNQ_WIFI_BANDWIDTH_HT40 == bandwidth)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "vht_oper_chwidth", "1");
+    }
+    else if(LYNQ_WIFI_BANDWIDTH_HT80 == bandwidth)
+    {
+        ret = mbtk_wifi_set_setting(SETTING_FILE, "vht_oper_chwidth", "2");
+    }
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+
+}
+
+int qser_wifi_ap_bandwidth_get(lynq_wifi_ap_index_e idx, lynq_wifi_bandwidth_type_e *bandwidth)
+{
+    int ret = 0;
+    char value[SETTING_VALUE_MAX_LEN] = {0};
+
+    if(NULL == bandwidth)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "vht_oper_chwidth", value, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    if('0' == value[0])
+    {
+        *bandwidth = LYNQ_WIFI_BANDWIDTH_HT20;
+    }
+    else if ('1' == value[0])
+    {
+        *bandwidth = LYNQ_WIFI_BANDWIDTH_HT40;
+    }
+    else if ('2' == value[0])
+    {
+        *bandwidth = LYNQ_WIFI_BANDWIDTH_HT80;
+    }
+
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_ap_channel_set(lynq_wifi_ap_index_e idx,const char* country_code, int channel)
+{
+    int ret = 0;
+    char value[SETTING_VALUE_MAX_LEN] = {0};
+
+    if(NULL == country_code)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_set_setting(SETTING_FILE, "country_code", country_code);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    sprintf(value, "%d", channel);
+    ret = mbtk_wifi_set_setting(SETTING_FILE, "channel", value);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_ap_channel_get(lynq_wifi_ap_index_e idx,char* country_code, int* channel)
+{
+    int ret = 0;
+    char value[SETTING_VALUE_MAX_LEN] = {0};
+
+    if(NULL == country_code || NULL ==channel)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "country_code", country_code, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "channel", value, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+    
+    *channel = atoi(value);
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_ap_auth_set(lynq_wifi_ap_index_e idx, lynq_wifi_auth_e auth_mode, const char * auth_passwd)
+{
+    int ret = 0;
+
+    if(NULL == auth_passwd)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_set_setting(SETTING_FILE, "wpa", "2");
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+    
+    ret = mbtk_wifi_set_setting(SETTING_FILE, "wpa_key_mgmt", "WPA-PSK");
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+    
+    ret = mbtk_wifi_set_setting(SETTING_FILE, "wpa_passphrase", auth_passwd);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+
+}
+
+int qser_wifi_ap_auth_get(lynq_wifi_ap_index_e idx, lynq_wifi_auth_e *auth_mode, char * auth_passwd)
+{
+    int ret = 0;
+
+    if(NULL == auth_mode || NULL == auth_passwd)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "wpa_passphrase", auth_passwd, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_ap_auth_get_s(lynq_wifi_ap_index_e idx, lynq_wifi_ap_auth_t* auth_mode)
+{
+    int ret = 0;
+
+    if(NULL == auth_mode)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "wpa_passphrase", auth_mode->passwd, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_ap_max_sta_set(lynq_wifi_ap_index_e idx, int max_sta_num)
+{
+    int ret = 0;
+    char value[SETTING_VALUE_MAX_LEN] = {0};
+
+    sprintf(value, "%d", max_sta_num);
+    ret = mbtk_wifi_set_setting(SETTING_FILE, "max_num_sta", value);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_ap_max_sta_get(lynq_wifi_ap_index_e idx, int* max_sta_num)
+{
+    int ret = 0;
+    char value[SETTING_VALUE_MAX_LEN] = {0};
+
+    if(NULL == max_sta_num)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    ret = mbtk_wifi_get_setting(SETTING_FILE, "max_num_sta", value, SETTING_VALUE_MAX_LEN);
+
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+    
+    *max_sta_num = atoi(value);
+
+    return LYNQ_ERR_SUCCESS;
+
+}
+
+
+
+int qser_wifi_lanhost_get_list(lynq_lanhost_ts* lynq_arrays)
+{
+    if(NULL == lynq_arrays)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    if(0 > mbtk_wifi_get_dhcp((mbtk_lanhost_ts*)lynq_arrays))
+    {
+        LOGE("qser wifi get lanhost fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+
+    if(0 > mbkt_wifi_get_uptime((mbtk_lanhost_ts*)lynq_arrays))
+    {
+        LOGE("qser wifi get lanhost fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_get_ap_pkt_stats(lynq_wifi_ap_index_e idx, lynq_wifi_pkt_stats_t *pkt_stat)
+{
+    if(NULL == pkt_stat)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    if(0 > mbtk_wifi_get_pkt((mbtk_wifi_pkt_stats_t*)pkt_stat))
+    {
+        LOGE("qser wifi get pkt fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_ap_start(lynq_wifi_ap_index_e idx)
+{
+    int ret = 0;
+
+    if(LYNQ_WIFI_AP_INDEX_AP0 == idx)
+    {
+         ret = qser_wifi_work_mode_set(LYNQ_WIFI_AP_INDEX_AP0);
+    }
+    else
+    {
+        ret = qser_wifi_work_mode_set(LYNQ_WIFI_AP_INDEX_AP1);
+    }
+    LOGI("qser_wifi_ap_start set hw_mode ret:%d\n", ret);
+    if(0 > ret)
+    {
+        LOGE("qser wifi fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+   if(0 > mbtk_wifi_ap_start())
+    {
+        return LYNQ_ERR_FAIL;
+    }
+    
+
+     g_ap_status = LYNQ_WIFI_AP_STATUS_ENABLED;
+     return LYNQ_ERR_SUCCESS;   
+}
+
+int qser_wifi_ap_stop(lynq_wifi_ap_index_e idx)
+{
+    if(0 > mbtk_wifi_ap_stop())
+    {
+        return LYNQ_ERR_FAIL;
+    }
+
+    g_ap_status = LYNQ_WIFI_AP_STATUS_DISABLING;
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_ap_restart(lynq_wifi_ap_index_e idx)
+{
+    if(0 > mbtk_wifi_ap_stop())
+    {
+        return LYNQ_ERR_FAIL;
+    }
+
+    if(0 > mbtk_wifi_ap_start())
+    {
+        return LYNQ_ERR_FAIL;
+    }
+
+   return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_register_handle(lynq_wifi_event_handle event_handle, lynq_wifi_event_handle_sta event_handle_sta, void *arg)
+{
+    if(NULL != event_handle_sta)
+    {
+        g_event_handle_sta_cb = event_handle_sta;
+       
+    }
+    else
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+   
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_sta_param_set(lynq_wifi_sta_param_t *param_stat)
+{
+    if(NULL == param_stat)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+    
+    sta_cli_ssid_set(param_stat->ssid);
+    sta_cli_psk_set(param_stat->passwd);
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_sta_param_get(lynq_wifi_sta_param_t *param_stat)
+{
+    int len = 0;
+
+    if(NULL == param_stat)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+    
+    sta_cli_ssid_get(param_stat->ssid);
+    len = strlen(param_stat->ssid);
+    param_stat->ssid[len - 1] = '\0';
+    sta_cli_psk_get(param_stat->passwd);
+    len = strlen(param_stat->passwd);
+    param_stat->passwd[len - 1] = '\0';
+    
+    LOGE("ssid: %s, passwd: %s", param_stat->ssid, param_stat->passwd);
+    
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_sta_start(void)
+{
+    char reply[STA_BUF_SIZE];
+
+    if(sta_cli_cmd_parse("ADD_NETWORK", reply, STA_BUF_SIZE))
+    {
+		if(strlen(reply) > 0)
+		{
+           LOGE("reply data(%s).\n",reply);
+		}else
+        {
+			LOGE("No reply data\n");
+		}
+    }
+    else
+    {
+        LOGE("Parse cmd fail.\n");
+    }
+
+
+    if(sta_cli_cmd_parse("SELECT_NETWORK", reply, STA_BUF_SIZE))
+    {
+		if(strlen(reply) > 0)
+		{
+           LOGE("reply data(%s).\n",reply);
+		}else
+        {
+			LOGE("No reply data\n");
+		}
+    }
+    else
+    {
+        LOGE("Parse cmd fail.\n");
+    }
+
+      if(sta_cli_cmd_parse("ENABLE_NETWORK", reply, STA_BUF_SIZE))
+    {
+		if(strlen(reply) > 0)
+		{
+           LOGE("reply data(%s).\n",reply);
+		}else
+        {
+			LOGE("No reply data\n");
+		}
+    }
+    else
+    {
+        LOGE("Parse cmd fail.\n");
+    }
+
+    if(0 > system("udhcpc -i wlan0"))
+    {
+        return LYNQ_ERR_FAIL;
+    }
+
+    
+    return LYNQ_ERR_SUCCESS;
+}
+
+int qser_wifi_sta_stop(void)
+{
+    char reply[STA_BUF_SIZE];
+
+    if(sta_cli_cmd_parse("DISABLE_NETWORK", reply, STA_BUF_SIZE))
+    {
+		if(strlen(reply) > 0)
+		{
+           LOGE("reply data(%s).\n",reply);
+		}else
+        {
+			LOGE("No reply data\n");
+		}
+    }
+    else
+    {
+        LOGE("Parse cmd fail.\n");
+    }
+
+      if(sta_cli_cmd_parse("REMOVE_NETWORK", reply, STA_BUF_SIZE))
+    {
+		if(strlen(reply) > 0)
+		{
+           LOGE("reply data(%s).\n",reply);
+		}else
+        {
+			LOGE("No reply data\n");
+		}
+    }
+    else
+    {
+        LOGE("Parse cmd fail.\n");
+    }
+    
+   return LYNQ_ERR_SUCCESS;
+}
+
+int  qser_wifi_sta_get_status(lynq_wifi_sta_status_t *status_stat)
+{
+    char reply[STA_BUF_SIZE];
+    int i = 0, j = 0;
+    int status_flag = 0;
+
+    if(NULL == status_stat)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+      if(sta_cli_cmd_parse("STATUS", reply, STA_BUF_SIZE))
+    {
+		if(strlen(reply) > 0)
+		{
+           LOGE("reply data(%s).\n",reply);
+		}else
+        {
+			LOGE("No reply data\n");
+		}
+    }
+    else
+    {
+        LOGE("Parse cmd fail.\n");
+    }
+
+    
+    for(i = 0; i < strlen(reply); i++)
+    {
+        if(',' == reply[i])
+        {
+            j = 0;
+            status_flag++;
+            continue;
+        }
+
+        if(0 == status_flag)
+        {
+            status_stat->status = 4;
+            j++;
+        }
+        else if(1 == status_flag)
+        {
+            status_stat->ap_bssid[j] = reply[i];
+            j++;
+        }
+        else if(2 == status_flag)
+        {
+            status_stat->ifname[j] = reply[i];
+            j++;
+        }
+        else if(8 == status_flag)
+        {
+            status_stat->has_addr = '1';
+            status_stat->addr[0].addr[j] = reply[i];
+            j++;
+        }
+      
+
+     
+    }
+    LOGE("state:%d, ap_bssid:%s, ifname:%s, has_addr:%c, addr:%s\n", status_stat->status, status_stat->ap_bssid, status_stat->ifname, status_stat->has_addr, 
+                status_stat->addr[0].addr);
+
+    return LYNQ_ERR_SUCCESS;
+    
+}
+
+
+int qser_wifi_get_sta_pkt_stats(lynq_wifi_pkt_stats_t *pkt_stat)
+{
+    if(NULL == pkt_stat)
+    {
+        LOGE("qser wifi ptr is null");
+        return LYNQ_ERR_BADPARAM;
+    }
+
+    if(0 > mbtk_wifi_get_pkt((mbtk_wifi_pkt_stats_t*)pkt_stat))
+    {
+        LOGE("qser wifi get pkt fail");
+        return LYNQ_ERR_FAIL;
+    }
+
+    return LYNQ_ERR_SUCCESS;
+}
+
+
+int qser_wifi_sta_start_scan(void)
+{
+    char reply[STA_BUF_SIZE] = {0};
+    lynq_wifi_sta_scan_list_t scan_list = {0};
+    int i = 0, j = 0;
+    int status_flag = 0;
+
+    if(sta_cli_cmd_parse("SCAN", reply, STA_BUF_SIZE))
+    {
+		if(strlen(reply) > 0)
+		{
+           LOGE("reply data(%s).\n",reply);
+		}else
+        {
+			LOGE("No reply data\n");
+		}
+    }
+    else
+    {
+        LOGE("Parse cmd fail.\n");
+    }
+
+
+
+    scan_list.cnt = 1;
+    
+    for(i = 0; i < strlen(reply); i++)
+    {
+        if(',' == reply[i])
+        {
+            j = 0;
+            status_flag++;
+            continue;
+        }
+
+        if(0 == status_flag)
+        {
+            scan_list.info[0].bssid[j] = reply[i];
+            j++;
+        }
+        else if(1 == status_flag)
+        {
+            //scan_list.info[0].bssid = reply[i];
+            j++;
+        }
+        else if(2 == status_flag)
+        {
+            //scan_list.info[0].signal = atoi(reply[i]);
+            j++;
+        }
+        else if(4 == status_flag)
+        {
+            scan_list.info[0].essid[j] = reply[i];
+            j++;
+        }
+      
+
+     
+    }
+
+
+    
+    g_event_handle_sta_cb(&scan_list);
+    return LYNQ_ERR_SUCCESS;
+}
+
+/*
+ void lynq_wifi_event_handle_demo(lynq_wifi_event_s *event, void *arg)
+ {
+    if(event->id == LYNQ_WIFI_EVENT_AP_STATION)
+        LOGE("[lynq-wifi-demo] %s:event-id = %d- %d\n", __func__, event->id, event->status);
+    else if(event->id == LYNQ_WIFI_EVENT_AP_STA_STATUS)
+        LOGE("[lynq-wifi-demo] %s:event-id = %d,%d,%s,%s\n", __func__, event->id,
+        event->ap_sta_info.connected, event->ap_sta_info.mac,event->ap_sta_info.hostname);
+    if(event->id == LYNQ_WIFI_EVENT_STA_STATUS)
+        LOGE("[lynq-wifi-demo] %s:event-id = %d- %d\n", __func__, event->id, event->status);
+    else
+    return;
+ }
+ */
+ 
+ void lynq_wifi_event_handle_sta_demo(lynq_wifi_sta_scan_list_t *event)
+ {
+     int i = 0;
+     if(NULL == event)
+    {
+        LOGE("qser wifi ptr is null");
+        return;
+    }
+
+     for (i = 0; i < event->cnt; i++)
+     {
+         LOGE("[lynq-wifi-demo] %s : ap[%d]:%s,%d,%d,%d,%s,%d,%d,%d\n", __func__, i,
+         event->info[i].essid, event->info[i].auth,
+         event->info[i].cipher, event->info[i].channel, event->info[i].bssid,
+         event->info[i].signal_level,event->info[i].frequency,event->info[i].signal);
+     }
+ }
+
+
+
+
diff --git a/mbtk/libql_lib_v2_rilv2/Makefile b/mbtk/libql_lib_v2_rilv2/Makefile
new file mode 100755
index 0000000..bd35f0d
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/Makefile
@@ -0,0 +1,94 @@
+BUILD_ROOT = $(shell pwd)/..
+include $(BUILD_ROOT)/Make.defines
+
+LOCAL_PATH=$(BUILD_ROOT)/libql_lib_v2_rilv2
+
+INC_DIR += \
+		-I$(LOCAL_PATH)
+
+LIB_DIR +=
+
+LIBS += -lmbtk_lib -llog -lubus -lubox -lblobmsg_json -lrilutil -lm
+
+CFLAGS += -shared -Wl,-shared,-Bsymbolic
+
+DEFINE +=
+
+#MY_FILES_PATH:=$(LOCAL_PATH)
+#ifeq ($(CONFIG_MBTK_QL_SUPPORT),y)
+#MY_FILES_PATH += $(LOCAL_PATH)/ql
+#endif
+
+#ifeq ($(CONFIG_MBTK_PLATFORM),linux)
+#MY_FILES_PATH += $(LOCAL_PATH)/platform/linux
+#endif
+
+#MY_FILES_SUFFIX:=%.c %.cpp
+#My_All_Files := $(foreach src_path,$(MY_FILES_PATH), $(shell find "$(src_path)" -type f))
+#MY_SRC_LIST  := $(filter $(MY_FILES_SUFFIX),$(My_All_Files))
+#MY_SRC_LIST  := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%)
+#LOCAL_SRC_FILES += $(MY_SRC_LIST)
+#$(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES))
+
+#LOCAL_SRC_FILES = $(wildcard *.c) $(wildcard *.cpp)
+ LOCAL_SRC_FILES = ql_sim.c \
+	ql_nw.c \
+   ql_sms.c \
+   ql_voice.c \
+    ql_data_call_v1.c \
+   ql_wifi.c \
+   ql_test_utils.c \
+    ql_absys_api.c \
+    ql_adc.c \
+    ql_atc.c \
+    ql_audio_cfg.c \
+    ql_audio_pcm.c \
+    ql_cell_locator.c \
+    ql_dm.c \
+    ql_fota.c \
+    ql_fota_api.c \
+    ql_fota_common.c \
+    ql_gnss.c \
+    ql_gpio.c \
+    ql_gpio_internal.c \
+    ql_lanhost.c \
+    ql_lpm.c \
+    ql_ms_data_call.c \
+    ql_ms_dm.c \
+    ql_ms_nw.c \
+    ql_ms_sim.c \
+    ql_ms_sms.c \
+    ql_ms_voice.c \
+    ql_net_usb_dev.c \
+    ql_nf.c \
+    ql_nslookup.c \
+    ql_sleep_wakelock.c \
+   ql_ecall.c   
+    
+
+
+
+OBJS = $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(LOCAL_SRC_FILES)))
+$(info OBJS = $(OBJS))
+
+lib_name := libql_lib.so
+lib_version := 2
+
+dtarget := $(OUT_DIR)/lib/$(lib_name).$(lib_version)
+
+all: $(dtarget)
+
+$(dtarget): $(OBJS)
+	$(CC) $(CFLAGS) $(LIB_DIR) $(LIBS) $(OBJS) -o $@
+	cp $@ $(BUILD_ROOT)/rootfs/lib
+	ln -sf $(lib_name).$(lib_version) $(BUILD_ROOT)/rootfs/lib/$(lib_name)
+
+%.o:%.c
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+%.o:%.cpp
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+clean:
+	rm -f $(OBJS) $(dtarget)
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_absys_api.c b/mbtk/libql_lib_v2_rilv2/ql_absys_api.c
new file mode 100755
index 0000000..5d0b253
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_absys_api.c
@@ -0,0 +1,103 @@
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "ql_absys_api.h"
+#include "mbtk_type.h"
+#include "mbtk_fota.h"
+#include "mbtk_log.h"
+#include "mbtk_utils.h"
+
+int ql_absys_get_cur_active_part(absystem_t *cur_system)
+{
+    int active;
+
+    active = mbtk_fota_get_active_absys_type();
+    if (active == 0)
+    {
+        *cur_system = SYSTEM_A;
+    }
+    else if (active == 1)
+    {
+        *cur_system = SYSTEM_B;
+    }
+    else
+    {
+        LOGE("ql_absys_get_cur_active_part fail");
+        return -1;
+    }
+
+    return 0;
+}
+
+int ql_absys_switch(void)
+{
+    int absys_t, active, tmp_active, reboot_cnt;
+
+    active = mbtk_fota_get_active_absys_type();
+    tmp_active = mbtk_fota_get_tmp_absys_type();
+    absys_t = mbtk_fota_get_sync_absys_type();
+    reboot_cnt = mbtk_fota_get_asr_reboot_cnt_flag();
+    LOGI("ql_absys_get_cur_active_part active=%d,tmp_active=%d,absys_t=%d,reboot_cnt=%d",active,tmp_active,absys_t,reboot_cnt);
+
+    if (reboot_cnt == 0 && (active == tmp_active))
+    {
+        return 0;
+    }
+
+    if ((active == tmp_active) && absys_t == 0)
+    {
+        return -2;
+    }
+
+    if ((active != tmp_active) && absys_t == 0)
+    {
+        return -3;
+    }
+
+    return -1;
+}
+
+int ql_absys_getstatus(sysstatus_t *sys_state)
+{
+    int active, tmp_active, mtd_check;
+    char tmp_ac, ac;
+    char out[8]={0};
+
+    active = mbtk_fota_get_active_absys_type();
+    tmp_active = mbtk_fota_get_tmp_absys_type();
+    mtd_check = mbtk_fota_get_mtd_check_type();
+    LOGI("ql_absys_get_cur_active_part tmp_active=%d active=%d mtd_check=%d",tmp_active,active,mtd_check);
+
+    if (mtd_check == 0)
+    {
+        sys_state->is_damaged = 0;
+    }
+    else
+    {
+        if (tmp_active == 0)
+            tmp_ac = 'A';
+        else
+            tmp_ac = 'B';
+
+        if (active == 0)
+            ac = 'A';
+        else
+            ac = 'B';
+
+        sys_state->is_damaged = 1;
+        sprintf(out, "%c to %c",tmp_ac, ac);
+        memcpy(sys_state->damaged_partname, out, strlen(out));
+    }
+
+    return 0;
+}
+
+int ql_absys_sync(void)
+{
+    mbtk_system("sync");
+
+    return 0;
+}
+
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_adc.c b/mbtk/libql_lib_v2_rilv2/ql_adc.c
new file mode 100755
index 0000000..d3baeaf
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_adc.c
@@ -0,0 +1,35 @@
+#include "ql_adc.h"
+#include "mbtk_adc.h"
+
+
+/*========================================================================
+  FUNCTION:  ql_adc_show
+=========================================================================*/
+/** @brief
+    This function retrieves the ADC voltage value with the specified
+    ADC channel.
+    Support input vol value:
+    ADC0 : 0V-VBAT_BB
+    ADC1 : 0V-VBAT_BB
+
+    @param[in] qadc, adc channel definitions, one value of ADC_CHANNEL_E.
+
+    @return
+    adc value(mv) on success
+    on failure, the return value is -1;
+*/
+/*=======================================================================*/
+int ql_adc_show(ADC_CHANNEL_E qadc)
+{
+    if(qadc >= ADC0 && qadc <= ADC2) {
+        int result = mbtk_adc_get(ADC_DEVICE_AUX, (mbtk_adc_enum)(qadc - 1));
+        if(result < 0) {
+            return -1;
+        } else {
+            return result;
+        }
+    } else {
+        return -1;
+    }
+}
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_atc.c b/mbtk/libql_lib_v2_rilv2/ql_atc.c
new file mode 100755
index 0000000..5626121
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_atc.c
@@ -0,0 +1,71 @@
+#include "ql_atc.h"
+#include "ql_type.h"
+
+#include "mbtk_at.h"
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize ATC service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the ATC service was successfully intialized.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_atc_init(void)
+{
+	return mbtk_at_init();
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief send at command async.
+  @param[in] req_buf At command request content
+  @param[out] async_index Async AT command index
+  @param[in] async_cb Async callback function
+  @return Whether to successfully send the AT command asynchronously
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_atc_send_async(char *req_buf, int *async_index, void *async_cb)
+{
+	return QL_ERR_UNSUPPORTED;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief send AT command.
+  @param[in] req_buf At command request content
+  @param[in] rsp_buf At command response content
+  @param[in] rsp_len The length of rsp_buf
+  @return Whether to successfully send AT command
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_atc_send(char *req_buf, char *rsp_buf, int rsp_len)
+{
+	return mbtk_at_send(req_buf, rsp_buf, rsp_len);
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize ATC service.
+  @return Whether the DM service was successfully deintialized.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_atc_deinit(void)
+{
+	return mbtk_at_deinit();
+}
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_audio_cfg.c b/mbtk/libql_lib_v2_rilv2/ql_audio_cfg.c
new file mode 100755
index 0000000..4f521e5
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_audio_cfg.c
@@ -0,0 +1,714 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_audio_cfg.h
+  @brief audio config API, including audio initlization, audio configuration
+
+  @detailes
+  Quectel AG55x series module AUDIO service.
+
+  @htmlonly
+  <span style="font-weight: bold">History</span>
+  @endhtmlonly
+
+  when       |   who      	|    what, where, why
+  --------   |   ---      	|    ----------------------------------------------------------
+  2021-11-03 |   dameng.lin |    Created .
+
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+#ifndef __QL_AUDIO_CFG_H__
+#define __QL_AUDIO_CFG_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <math.h>
+#include <stdint.h>
+#include "mbtk_log.h"
+#include "mbtk_audio2.h"
+#include "mbtk_audio_gain.h"
+#include "mbtk_audio_ubus.h"
+#include "ql_v2/ql_type.h"
+
+#define QL_AUDIO_STATE_0  0
+#define QL_AUDIO_STATE_1  1
+
+#define AUDIO_MODE_NORMAL   0
+#define AUDIO_MODE_RINGTONE 1
+#define AUDIO_MODE_IN_CALL  2
+#define DEVICE_EARPIECE 0
+#define DEVICE_SPEAKER  1
+#define DEVICE_HEADSET  2
+
+#define MIC_GAIN_MIN 0
+#define MIC_GAIN_MAX 65535
+#define VOLUME_MIN 0
+#define VOLUME_MAX 100
+
+static int32_t stored_mic_gain = -1;
+static int32_t stored_down_volume = -1;
+
+
+/**
+  @brief  The audio service error callback function
+  @param  error  error code.See ql_type.h for details.
+*/
+typedef void (*ql_audio_service_error_cb_f)(int error);
+
+ql_audio_service_error_cb_f audio_error_callback = NULL;
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function initializes an audio service.
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_SERVICE_NOT_READY  Audio service not ready. Try again later.
+  @retval  Others Failed execution.See ql_type.h for error codes
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_init(void)
+{
+    int result = mbtk_audio_pcm_init();
+    if (result != 0) {
+        LOGE("Error: mbtk_audio_wav_init failed with error code %d\n", result);
+        if (audio_error_callback) {
+            audio_error_callback(result);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    return QL_ERR_OK;
+}
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function deinitializes audio services.
+
+  @retval  QL_ERR_OK Successful
+  @retval  QL_ERR_SERVICE_NOT_READY Service is not ready, need to retry
+  @retval  Others Failed execution.See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_deinit(void)
+{
+    int result = mbtk_audio_wav_deinit();
+    if (result != 0) {
+        LOGE("Error: mbtk_audio_wav_deinit failed with error code %d\n", result);
+        if (audio_error_callback) {
+            audio_error_callback(result);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the value of a mixer.
+
+  @param[in] control    the name of the mixer
+  @param[in] val_list   the value of the mixer to be set. String type value.Multiple values are separated by spaces.
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others Failed execution.See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_mixer_control(const char *control, const char *val_list);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the value of the mixer.
+
+  @param[in]  control       the name of the mixer
+  @param[out] val_list_buf  buffer for storing mixer values
+  @param[in]  buf_size      the buffer size. Unit:Byte
+
+  @retval  QL_ERR_OK Successful execution.
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others Failed execution.See ql_type.h for error codes.
+
+  @note  Generally, 64 bytes is enough
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_mixer_control(const char *control, char *val_list_buf, uint32_t buf_size);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the microphone gain for voice call uplink.
+
+  @param[in] mic_gain  the microphone gain to be set. range:0-65535
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called before a voice call
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_tx_voice_mic_gain(int32_t mic_gain)
+{
+    if (mic_gain < MIC_GAIN_MIN || mic_gain > MIC_GAIN_MAX) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    stored_mic_gain = mic_gain;
+
+    float mapped_gain = MBTK_AUDIO_GAIN_MIN + ((float)mic_gain * (MBTK_AUDIO_GAIN_MAX - MBTK_AUDIO_GAIN_MIN) / MIC_GAIN_MAX);
+    int result = mbtk_dsp_gain_set(CONFIG_DSPGAIN_TX, (int)round(mapped_gain));
+    if (result != 0) {
+        LOGE("Error: mbtk_dsp_gain_set failed with error code %d\n", result);
+        if (audio_error_callback) {
+            audio_error_callback(result);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the microphone gain for voice call uplink.
+
+  @param[out] p_mic_gain  the current microphone gain for voice call uplink.
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_tx_voice_mic_gain(int32_t *p_mic_gain)
+{
+    if (p_mic_gain == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    if (stored_mic_gain != -1) {
+        *p_mic_gain = stored_mic_gain;
+    } else {
+        int rx_gain, tx_gain;
+        int result = mbtk_dsp_gain_get(&rx_gain, &tx_gain);
+        if (result != 0) {
+            LOGE("Error: mbtk_dsp_gain_get failed with error code %d\n", result);
+            if (audio_error_callback) {
+                audio_error_callback(result);
+            }
+            return QL_ERR_SERVICE_NOT_READY;
+        }
+        *p_mic_gain = (tx_gain - MBTK_AUDIO_GAIN_MIN) * MIC_GAIN_MAX / (MBTK_AUDIO_GAIN_MAX - MBTK_AUDIO_GAIN_MIN);
+    }
+    LOGD("Retrieved mic gain: %d\n", *p_mic_gain);
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the speaker gain for voice call downlink.
+
+  @param[in] spkr_gain   the speaker gain to be set. range:0-65535
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called before a voice call
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_rx_voice_spkr_gain(int32_t spkr_gain);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the speaker gain for voice call downlink.
+
+  @param[out] p_spkr_gain   the current speaker gain for voice call downlink.
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_rx_voice_spkr_gain(int32_t *p_spkr_gain);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the mute state of voice call uplink.
+
+  @param[in] mute_state  the mute state to be set.
+             QL_AUDIO_STATE_0: unmute, QL_AUDIO_STATE_1: mute
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called during the call
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_tx_voice_mute_state(int32_t mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the mute state of voice call uplink.
+
+  @param[out] p_mute_state  the current mute state of voice call uplink. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_tx_voice_mute_state(int32_t *p_mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the mute state of voice call downlink.
+
+  @param[in] mute_state  the mute state to be set.
+             QL_AUDIO_STATE_0: unmute, QL_AUDIO_STATE_1: mute
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called during the call
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_rx_voice_mute_state(int32_t mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the mute state of voice call downlink.
+
+  @param[out] p_mute_state  the current mute state of voice call downlink. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_rx_voice_mute_state(int32_t *p_mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the uplink volume of a codec.
+
+  @param[in] up_volume  the uplink volume to be set. range:0-100
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_up_vol(int32_t up_volume);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the uplink volume of a codec.
+
+  @param[out] p_up_volume  the current uplink volume of codec. range:0-100
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_up_vol(int32_t *p_up_volume);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the downlink volume of a codec.
+
+  @param[in] down_volume  the volume to be set. range:0-100
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_down_vol(int32_t down_volume)
+{
+    if (down_volume < VOLUME_MIN || down_volume > VOLUME_MAX) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    stored_down_volume = down_volume;
+
+    float mapped_volume = MBTK_AUDIO_GAIN_MIN + ((float)down_volume * (MBTK_AUDIO_GAIN_MAX - MBTK_AUDIO_GAIN_MIN) / VOLUME_MAX);
+    int result = mbtk_dsp_gain_set(CONFIG_DSPGAIN_RX, (int)round(mapped_volume));
+    if (result != 0) {
+        LOGE("Error: mbtk_dsp_gain_set failed with error code %d\n", result);
+        if (audio_error_callback) {
+            audio_error_callback(result);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the downlink volume of a codec.
+
+  @param[out] p_down_volume  the current downlink volume of codec. range:0-100
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_down_vol(int32_t *p_down_volume)
+{
+    if (p_down_volume == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    if (stored_down_volume != -1) {
+        *p_down_volume = stored_down_volume;
+    } else {
+        int rx_gain, tx_gain;
+        int result = mbtk_dsp_gain_get(&rx_gain, &tx_gain);
+        if (result != 0) {
+            LOGE("Error: mbtk_dsp_gain_get failed with error code %d\n", result);
+            if (audio_error_callback) {
+                audio_error_callback(result);
+            }
+            return QL_ERR_SERVICE_NOT_READY;
+        }
+        *p_down_volume = (rx_gain - MBTK_AUDIO_GAIN_MIN) * VOLUME_MAX / (MBTK_AUDIO_GAIN_MAX - MBTK_AUDIO_GAIN_MIN);
+    }
+    LOGD("Retrieved codec downlink volume: %d\n", *p_down_volume);
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the microphone mute state of a codec.
+
+  @param[in] mute_state  the muute state to be set.
+             QL_AUDIO_STATE_0: unmute, QL_AUDIO_STATE_1: mute
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called during the call or audio playback
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_mic_mute_state(int32_t mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the microphone mute state of a codec.
+
+  @param[out] p_mute_state  the current microphone mute state of codec. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_mic_mute_state(int32_t *p_mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the speaker mute state of a codec.
+
+  @param[in] mute_state  the mute state to be set.
+             QL_AUDIO_STATE_0: unmute, QL_AUDIO_STATE_1: mute
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The API should be called during the call or audio playback
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_spk_mute_state(int32_t mute_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the speaker mute state of a codec.
+
+  @param[out] p_mute_state  the current speaker mute state of codec. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_spk_mute_state(int32_t *p_mute_state);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function enables/disables loopback.
+
+  @param[in] enable_state  enable/disable the loopback to be set.
+             QL_AUDIO_STATE_0: disable, QL_AUDIO_STATE_1: enable
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_loopback_enable_state(int32_t enable_state)
+{
+    int result;
+    int device = DEVICE_SPEAKER;
+
+    if (enable_state == QL_AUDIO_STATE_1) {
+        result = mbtk_audio_set_loopback_enable_state(device, enable_state);
+        if (result != 0) {
+            LOGE("Error: mbtk_audio_set_loopback_enable_state failed\n");
+            if (audio_error_callback) {
+                audio_error_callback(result);
+            }
+            return QL_ERR_SERVICE_NOT_READY;
+        }
+        LOGD("Loopback started successfully\n");
+    } else if (enable_state == QL_AUDIO_STATE_0) {
+        result = mbtk_audio_set_loopback_enable_state(device, enable_state);
+        if (result != 0) {
+            LOGE("Error: mbtk_audio_set_loopback_enable_state failed\n");
+            if (audio_error_callback) {
+                audio_error_callback(result);
+            }
+            return QL_ERR_SERVICE_NOT_READY;
+        }
+    } else {
+        LOGD("Error: Invalid enable_state %d\n", enable_state);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  The function gets the loopback state.
+
+  @param[out] p_enable_state  the current loopback state. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_loopback_enable_state(int32_t *p_enable_state)
+{
+    if (p_enable_state == NULL) {
+        LOGE("Error: p_enable_state is NULL\n");
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int device;
+    int result = mbtk_audio_get_loopback_enable_state(&device, p_enable_state);
+    if (result != 0) {
+        LOGE("Error: mbtk_audio_get_loopback_enable_state failed\n");
+        if (audio_error_callback) {
+            audio_error_callback(result);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    LOGD("Current loopback state: %d\n", *p_enable_state);
+    return QL_ERR_OK;
+}
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the sidetone gain.
+
+  @param[in] sidetone_gain  sidetone gain to be set. range: 0-65535
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_sidetone_gain(int32_t sidetone_gain);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the sidetone gain.
+
+  @param[out] p_sidetone_gain  the current sidetone gain. range: 0-65535, default value: 1298
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_sidetone_gain(int32_t *p_sidetone_gain);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the voice call manager state. By default, voice call services such as ringtones, ringback
+tones, third-party ringtones and voice stream status control are all implemented by ql_audiod program
+automatically.
+
+  @param[in] manager_state  The manager state to be set. Voice call services include ringtones, ringback tones, the third-party
+ringtones and voice stream status control. range: QL_AUDIO_STATE_0 and QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  The voice service, such as call ring, beep tone, will not work during a voice call
+         If the manager_state is set to QL_AUDIO_STATE_1
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_voice_call_manager_state(int32_t manager_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the voice call manager state.
+
+  @param[out] p_manager_state  the current voice call manager state.
+              QL_AUDIO_STATE_0: close, QL_AUDIO_STATE_1:open
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_voice_call_manager_state(int32_t *p_manager_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the voice stream state.
+
+  @param[in] stream_state  voice stream state to be set.
+             QL_AUDIO_STATE_0: close, QL_AUDIO_STATE_1:open
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+
+  @note  After the voice call manager state is set to QL_AUDIO_STATE_1 by calling
+ql_audio_set_voice_call_manager_state(), the service program ql_audiod will not enable voice stream
+while establishing a voice call. In such a case, call ql_audio_set_voice_stream_state() to enable voice
+stream state by setting stream_state to QL_AUDIO_STATE_1, and then the voice stream can be disabled
+by setting stream_state to QL_AUDIO_STATE_0.*/
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_audio_set_voice_stream_state(int32_t stream_state);
+int ql_audio_set_voice_stream_state(int32_t stream_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  The function gets the voice stream state.
+
+  @param[out] p_stream_state  the current voice stream state. QL_AUDIO_STATE_0 or QL_AUDIO_STATE_1
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_audio_get_voice_stream_state(int32_t *p_stream_state);
+int ql_audio_get_voice_stream_state(int32_t *p_stream_state);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the callback function for audio service errors. 
+  @param[in] cb  The callback function for audio service errors.Only when the audioservice exit abnormally,the callback function is executed.
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_service_error_cb(ql_audio_service_error_cb_f cb)
+{
+    if (cb == NULL) {
+        LOGE("Error: Callback function is NULL\n");
+        return QL_ERR_INVALID_ARG;
+    }
+
+    audio_error_callback = cb;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function switch codec.
+
+  @param[in] codec_switch  the which codec to be switch.
+             0:GSSP  1:internal codec
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_codec_switch(int32_t codec_switch);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the tone state.
+
+  @param[out] p_codec_switch  which codec has switch.    
+
+  @retval  QL_ERR_OK Successful execution
+  @retval  QL_ERR_INVALID_ARG Failed execution.Invalid arguments
+  @retval  Others errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_codec_switch(int32_t *p_codec_switch);
+
+
+typedef struct ql_audio_tone_config_struct
+{
+    int32_t low_fre;
+    int32_t high_fre;
+    int32_t on_duration;
+    int32_t off_duration;
+    int32_t volume;
+    int32_t count;
+}ql_audio_tone_config_t;
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set tone enable state
+
+  @param[in] low_fre   low frequency, range: 100~4000
+  @param[in] high_fre  high frequency, range: 100~4000
+  @param[in] on_duration  tone play time,  unit is millisecond
+  @param[in] off_duration  tone pause time,  unit is millisecond
+  @param[in] volume  tone play volume, range: 0~5000
+  @param[in] count  tone play count
+
+  @return  QL_ERR_OK - Successful
+           QL_ERR_INVALID_ARG - Invalid arguments
+           Other errorcode defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_set_tone_enable_state(int32_t enable_state,ql_audio_tone_config_t *p_tone_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Get tone enable state
+
+  @param[out] p_enable_state  tone enable state,
+              QL_AUDIO_STATE_0: close, QL_AUDIO_STATE_1:open
+
+  @return  QL_ERR_OK - Successful
+           QL_ERR_INVALID_ARG - Invalid arguments
+           Other errorcode defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_get_tone_enable_state(int32_t *p_enable_state);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_audio_pcm.c b/mbtk/libql_lib_v2_rilv2/ql_audio_pcm.c
new file mode 100755
index 0000000..c98a335
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_audio_pcm.c
@@ -0,0 +1,729 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_audio_pcm.h
+  @brief playback or capture API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when         who          what, where, why
+  --------     ---          ----------------------------------------------------------
+  2021-11-03   dameng.lin     Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_AUDIO_PCM_H
+#define __QL_AUDIO_PCM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include "mbtk_log.h"
+#include "mbtk_audio2.h"
+#include "ql_v2/ql_type.h"
+#include "mbtk_ril_api.h"
+#include "ql_v2/ql_audio_cfg.h"
+
+typedef int ql_audio_handle_t;
+
+static const char *g_wav_file_name = NULL;
+static mbtk_ril_handle* call_info_handle = NULL;
+
+
+typedef enum QL_AUDIO_STREAM_FORMAT_ENUM
+{
+    QL_AUDIO_STREAM_FORMAT_PCM = 1,         /**< PCM*/
+    QL_AUDIO_STREAM_FORMAT_MP3,             /**< MP3*/
+    QL_AUDIO_STREAM_FORMAT_AMR,             /**< AMR*/
+    QL_AUDIO_STREAM_FORMAT_AMRNB,           /**< AMR-NB*/
+    QL_AUDIO_STREAM_FORMAT_AMRWB,           /**< AMR-WB*/
+}QL_AUDIO_STREAM_FORMAT_E;
+
+
+/**The structure of PCM configuration parameters*/
+typedef struct ql_audio_pcm_config_struct
+{
+    /**  Each sound card maintains a hardware buffer to store audio data. The hardware
+    *  buffer is divided into several periods. The sound card uses period as a unit to transmit data,
+    *  and one period stores some data frames.period_size sets the size of periods in hardware buffer.
+    *  When period_size is set to 0,it means that the period size is calculated by the bottom layer to
+    *  obtain a default value. If period_size is not 0, the recommended value is 128–960. The larger the
+    *  perod_size is, the larger the kernel overhead is
+    */
+    uint32_t period_size;
+    /**  period_count indicates the count of period that the data occupies, when the application reads data
+    *  from or writes data to the hardware buffer.The size of the data that the application reads from or
+    *  writes to the hardware buffer every time equals period_count multiplied by period_size. The hardware
+    *  buffer has a maximum of 8 periods by default. The recommended value of period_count is 1–3.
+    */
+    uint32_t period_count;
+    uint32_t num_channels;  /**< Number of channels. 1 Mono 2 Stereo*/
+    uint32_t sample_rate;   /**< Sampling rate. A PCM interface supports 8000 and 16000,and an I2s interface supports 48000.Unit:Hz*/
+    uint32_t pcm_format;        /**< PCM data format.Presently supports 2 only,which means 16-bit little endian format*/
+} ql_audio_pcm_config_t;
+
+#define QL_AUDIO_INVALID_HANDLE  ((ql_audio_handle_t)(void *)NULL)
+
+typedef enum
+{
+    QL_AUDIO_STREAM_DIRECTION_PLAYBACK = 0,
+    QL_AUDIO_STREAM_DIRECTION_CAPTURE,
+    QL_AUDIO_STREAM_DIRECTION_MAX
+}QL_AUDIO_STREAM_DIRECTION_E;
+
+
+/**The enumeration of the front end PCM device types*/
+typedef enum QL_AUDIO_FE_PCM_DEV_ENUM
+{
+    QL_AUDIO_FE_PCM_DEV_MIN = -1,
+    QL_AUDIO_FE_PCM_DEV_MULTIMEDIA1 = 0,    /**< The first PCM device available for general-purpose audio playback and capturing.*/
+	QL_AUDIO_FE_PCM_DEV_MULTIMEDIA2 = 1,    /**< The sencond PCM device available for general-purpose audio playback and capturing.*/
+	QL_AUDIO_FE_PCM_DEV_MULTIMEDIA3 = 2,    /**< The third PCM device available for general-purpose audio playback and capturing.*/
+	QL_AUDIO_FE_PCM_DEV_MAX
+} QL_AUDIO_FE_PCM_DEV_E;
+
+
+
+typedef enum QL_AUDIO_BE_DAI_ENUM
+{
+    QL_AUDIO_BE_DAI_MIN = -1,
+    QL_AUDIO_BE_DAI_PLAYBACK_PRI_PCM = 0,   /**< Play back audio to the first PCM interface.*/
+    QL_AUDIO_BE_DAI_PLAYBACK_VOICE_TX,      /**< play back audio to the voice call uplink*/
+    QL_AUDIO_BE_DAI_CAPTURE_PRI_PCM,        /**< Capture audio from the first PCM interface*/
+    QL_AUDIO_BE_DAI_CAPTURE_VOICE_UL,       /**< Capture voice stream from voice call uplink*/
+    QL_AUDIO_BE_DAI_CAPTURE_VOICE_DL,       /**< Capture voice stream from voice call downlink*/
+    QL_AUDIO_BE_DAI_MAX
+}QL_AUDIO_BE_DAI_E;
+
+#define QL_AUDIO_BE_DAI_MASK_PLAYBACK_PRI_PCM       (1 << QL_AUDIO_BE_DAI_PLAYBACK_PRI_PCM)
+#define QL_AUDIO_BE_DAI_MASK_PLAYBACK_VOICE_TX      (1 << QL_AUDIO_BE_DAI_PLAYBACK_VOICE_TX)
+#define QL_AUDIO_BE_DAI_MASK_CAPTURE_PRI_PCM        (1 << QL_AUDIO_BE_DAI_CAPTURE_PRI_PCM)
+#define QL_AUDIO_BE_DAI_MASK_CAPTURE_VOICE_UL       (1 << QL_AUDIO_BE_DAI_CAPTURE_VOICE_UL)
+#define QL_AUDIO_BE_DAI_MASK_CAPTURE_VOICE_DL       (1 << QL_AUDIO_BE_DAI_CAPTURE_VOICE_DL)
+
+/**The enumeration of audio playback state*/
+typedef enum  QL_AUDIO_PLAYBACK_STATE_ENUM
+{
+    QL_AUDIO_PLAYBACK_STATE_CLOSE = 0,      /**< Close*/
+    QL_AUDIO_PLAYBACK_STATE_OPEN,           /**< Open*/
+    QL_AUDIO_PLAYBACK_STATE_PREPARE,        /**< Ready*/
+    QL_AUDIO_PLAYBACK_STATE_PLAYING,        /**< Playing*/
+    QL_AUDIO_PLAYBACK_STATE_FINISHED,       /**< Finished*/
+    QL_AUDIO_PLAYBACK_STATE_PAUSE,          /**< Pause*/
+    QL_AUDIO_PLAYBACK_STATE_ERROR,          /**< Error*/
+} QL_AUDIO_PLAYBACK_STATE_E;
+
+/**The enumeration of audio capture state*/
+typedef enum QL_AUDIO_CAPTURE_STATE_ENUM
+{
+    QL_AUDIO_CAPTURE_STATE_CLOSE = 0,       /**< Close*/
+    QL_AUDIO_CAPTURE_STATE_OPEN,            /**< Open*/
+    QL_AUDIO_CAPTURE_STATE_PREPARE,         /**< Prepare*/
+    QL_AUDIO_CAPTURE_STATE_CAPTURING,       /**< Capturing*/
+    QL_AUDIO_CAPTURE_STATE_FINISHED,        /**< Finished*/
+    QL_AUDIO_CAPTURE_STATE_PAUSE,           /**< Pause*/
+    QL_AUDIO_CAPTURE_STATE_ERROR,           /**< Error*/
+} QL_AUDIO_CAPTURE_STATE_E;
+
+
+#define  QL_AUDIO_PLAYBACK_NONBLOCK  0
+#define  QL_AUDIO_PLAYBACK_BLOCK     1
+
+
+/**
+    @brief  The audio capturing state callback function
+    @param  handle Recording handle,which is the return value of ql_audio_capture_open().
+    @param  params Parameters carried by the callback function
+    @param  state  The current audio capturing state.
+*/
+typedef int (*ql_audio_capture_state_cb_f)(ql_audio_handle_t handle, void *params, QL_AUDIO_CAPTURE_STATE_E state);
+
+/**
+    @brief  The playback state callback function
+    @param  handle Playback handle, which is the return value of ql_audio_playback_open().
+    @param  params Parameters carried by the callback function.
+    @param  state  The current playback state.
+*/
+typedef int (*ql_audio_playback_state_cb_f)(ql_audio_handle_t handle, void *params, QL_AUDIO_PLAYBACK_STATE_E state);
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function opens the audio context for playback.
+
+  @param[in] fe_pcm_dev  Front end PCM device type. defined by QL_AUDIO_FE_PCM_DEV_E
+  @param[in] be_dai_mask  Backend digit audio interface mask, support follow:
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_PRI_PCM  Play back audio to the 1 st PCM interface
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_SEC_PCM  Play back audio to the 2 nd PCM interface
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_PRI_I2S  Play back audio to the 1 st I2S interface
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_SEC_I2S  Play back audio to the 2 nd I2S interface
+             QL_AUDIO_BE_DAI_MASK_PLAYBACK_VOICE_TX Play back audio to the voice call uplink
+
+  @retval  A_valid_handle   Successful execution.
+  @retval  QL_AUDIO_INVALID_HANDLE  Failed execution.Invalid handle
+  */
+/*-----------------------------------------------------------------------------------------------*/
+ql_audio_handle_t ql_audio_playback_open(QL_AUDIO_FE_PCM_DEV_E fe_pcm_dev, uint32_t be_dai_mask)
+{
+    if (fe_pcm_dev == QL_AUDIO_FE_PCM_DEV_MULTIMEDIA1 && be_dai_mask == QL_AUDIO_BE_DAI_MASK_PLAYBACK_PRI_PCM)
+    {
+        int init_result = mbtk_audio_pcm_init();
+
+        if (init_result != 0) {
+            LOGE("Error: mbtk_audio_pcm_init failed with error code %d\n", init_result);
+            if (audio_error_callback) {
+                audio_error_callback(init_result);
+            }
+            return QL_AUDIO_INVALID_HANDLE;
+        }
+    } else {
+        printf("Error: Unsupported PCM device or DAI mask\n");
+        return QL_AUDIO_INVALID_HANDLE;
+    }
+
+    return (ql_audio_handle_t)1;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function prepares for audio file playback.
+
+  @param[in] handle     The handle returned by ql_audio_playback_open().
+  @param[in] file_name  The name of the file to be played back.
+  @param[in] pcm_config  Pcm config, including sample rate, channel nums,
+             defined by ql_audio_pcm_config_t. Generally, it is NULL.
+  @param[in] playback_state_cb  Callback function to report the current playback state
+             The states defined by QL_AUDIO_PLAYBACK_STATE_E
+  @param[in] params Parameters carried by the callback function.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note   Before calling this function, call ql_audio_playback_open() first to obtain a handle.
+          If an audio file is expected to be played back, call this function first to prepare for
+          the playback and then ql_audio_playback_play() to start playback.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_file_prepare(ql_audio_handle_t handle,
+                                   const char *file_name,
+                                   ql_audio_pcm_config_t *pcm_config,
+                                   ql_audio_playback_state_cb_f playback_state_cb,
+                                   void *params)
+{
+    if (handle == QL_AUDIO_INVALID_HANDLE) {
+        LOGE("Error: Invalid handle\n");
+        if (audio_error_callback) {
+            audio_error_callback(-1);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if (file_name == NULL) {
+        LOGE("Error: File name is NULL\n");
+        if (audio_error_callback) {
+            audio_error_callback(-1);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    g_wav_file_name = file_name;
+
+    if (pcm_config != NULL) {
+        printf("Warning: PCM configuration provided but not supported\n");
+    } else {
+        LOGD("No PCM configuration provided\n");
+    }
+
+    if (playback_state_cb != NULL) {
+        printf("Warning: Playback state callback provided but not supported\n");
+    } else {
+        LOGD("No playback state callback provided\n");
+    }
+
+    LOGD("Audio file prepared for playback: %s\n", file_name);
+    return QL_ERR_OK;
+}
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function prepares for audio stream playback.
+
+  @param[in] handle  The API ql_audio_playback_open return results
+  @param[in] pcm_config  Pcm config, including sample rate, channel nums,
+             defined by ql_audio_pcm_config_t. If it is NULL, the API use defaule value.
+  @param[in] playback_state_cb  Callback function to report the current playback state.
+  @param[in] params  Parameters carried by the callback function.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note   Before calling this function, call ql_audio_playback_open() first to obtain a handle.
+          If an audio stream is expected to be played back, call this function first to prepare
+          for the audio stream playback and then ql_audio_playback_push_stream() to start playback.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_stream_prepare(ql_audio_handle_t handle,
+                                     ql_audio_pcm_config_t *pcm_config,
+                                     ql_audio_playback_state_cb_f playback_state_cb,
+                                     void *params);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function starts playback of the audio data.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Before calling this function, call ql_audio_playback_file_prepare() first to prepare the audio file
+            to be played back, otherwise the audio data cannot be played back successfully.This function also supports
+            playback of audio stream data. In this case, call ql_audio_playback_stream_prepare() first to prepare
+            the audio stream to be played back, then this function to start playback, and finally
+            ql_audio_playback_push_stream() to play back the audio stream in buffer.
+ */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_play(ql_audio_handle_t handle)
+{
+    if (handle == QL_AUDIO_INVALID_HANDLE) {
+        LOGE("Error: Invalid handle\n");
+        if (audio_error_callback) {
+            audio_error_callback(-1);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if (g_wav_file_name == NULL) {
+        LOGE("Error: No audio file prepared for playback\n");
+        if (audio_error_callback) {
+            audio_error_callback(-1);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    int err = mbtk_audio_wav_play_start(g_wav_file_name);
+    if (err != 0) {
+        LOGE("Error playing audio file: %d\n", err);
+        if (audio_error_callback) {
+            audio_error_callback(err);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    } else {
+        LOGD("Audio file playback started successfully\n");
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function plays back the audio stream in buffer.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+  @param[in] stream_buf  The buffer that stores the audio stream to be played back.
+  @param[in] buf_size  The size of the audio stream to be played back. Unit: Byte.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_push_stream(ql_audio_handle_t handle, void *stream_buf, uint32_t buf_size);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function pauses the audio playback.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_pause(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function resumes the audio playback.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_resume(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function stops the audio playback.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_stop(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function closes the audio context for playback.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @Note     After an audio playback ends, you must call this function to close the audio context,
+            otherwise subsequent call of ql_audio_playback_open() will fail.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_close(ql_audio_handle_t handle)
+{
+    if (handle == QL_AUDIO_INVALID_HANDLE) {
+        LOGE("Error: Invalid handle\n");
+        if (audio_error_callback) {
+            audio_error_callback(-1);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    int deinit_result = mbtk_audio_wav_deinit();
+    if (deinit_result != 0) {
+        LOGE("Error: mbtk_audio_wav_deinit failed with error code %d\n", deinit_result);
+        if (audio_error_callback) {
+            audio_error_callback(deinit_result);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    LOGD("Audio playback context closed successfully\n");
+    return QL_ERR_OK;
+}
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function gets the audio playback state.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+  @param[out] playback_state  the current audio playback state, defined by QL_AUDIO_PLAYBACK_STATE_E
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_get_state(ql_audio_handle_t handle, QL_AUDIO_PLAYBACK_STATE_E *playback_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function handles the call state changes.
+
+  @param[in] data     Pointer to the call information data.
+  @param[in] data_len Length of the call information data.
+
+  This function is a callback that processes different call states. When a call is waiting (MBTK_CLCC),
+  it pauses the audio playback. When a call is disconnected (MBTK_DISCONNECTED), it resumes the audio playback.
+  For other states, it logs the current call wait state.
+
+  @note The function uses mbtk_audio_wav_play_pause() and mbtk_audio_wav_play_resume() to control audio playback.
+        Error handling is performed by logging errors if the playback control functions fail.
+*/
+/*-----------------------------------------------------------------------------------------------*/
+static void call_state_handler(const void* data, int data_len)
+{
+    mbtk_call_info_t *reg = (mbtk_call_info_t *)data;
+    switch (reg->call_wait)
+    {
+        case MBTK_CLCC:
+            {
+                int result = mbtk_audio_wav_play_pause();
+                if (result != 0) {
+                    LOGE("Error: mbtk_audio_wav_play_pause failed with error code %d\n", result);
+                    if (audio_error_callback) {
+                        audio_error_callback(result);
+                    }
+                    return;
+                }
+                LOGD("Incoming call!\n");
+            }
+            break;
+        case MBTK_DISCONNECTED:
+            {
+                int result = mbtk_audio_wav_play_resume();
+                if (result != 0) {
+                    LOGE("Error: mbtk_audio_wav_play_resume failed with error code %d\n", result);
+                    if (audio_error_callback) {
+                        audio_error_callback(result);
+                    }
+                    return;
+                }
+                LOGD("Call disconnected!\n");
+            }
+            break;
+        default:
+            LOGD("RING: None call_wait = %d", reg->call_wait);
+            break;
+    }
+}
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function sets the block flag for audio playback.
+
+  @param[in] handle  The handle returned by ql_audio_playback_open().
+  @param[in] flags  block flag, including QL_AUDIO_PLAYBACK_NONBLOCK and QL_AUDIO_PLAYBACK_BLOCK
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_ARG   Illegal argument.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Call this function as per the function call sequence below, to make sure the audio playback can be blocked successfully.
+                1) ql_audio_playback_open()
+                2) ql_audio_playback_set_block_flag()
+                3) ql_audio_playback_file_prepare()
+                4) ql_audio_playback_play()
+            If the audio playback is blocked successfully by calling ql_audio_playback_set_block_flag(), then
+                1) If you dial a call or there is an incoming call during the audio playback, the playback will pause;
+                    after the call is hung up, the playback resumes automatically.
+                2) During a voice call, no function can be used to realize audio playback. In this case,
+                    the call of ql_auido_palyback_file_prepare() will fail, which means audio files cannot be played back.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_playback_set_block_flag(ql_audio_handle_t handle, uint8_t flags)
+{
+    if (handle == QL_AUDIO_INVALID_HANDLE) {
+        LOGE("Error: Invalid handle\n");
+        if (audio_error_callback) {
+            audio_error_callback(-1);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if (flags == QL_AUDIO_PLAYBACK_BLOCK) {
+        LOGD("Set to blocking mode\n");
+
+        if (call_info_handle == NULL) {
+            call_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+            if (call_info_handle) {
+                LOGD("Successfully created qser_voice_call_client_init\n");
+            } else {
+                LOGE("Failed to create qser_voice_call_client_init\n");
+                if (audio_error_callback) {
+                    audio_error_callback(-1);
+                }
+                return QL_ERR_SERVICE_NOT_READY;
+            }
+        }
+
+        int err = mbtk_call_state_change_cb_reg(call_state_handler);
+        if (err) {
+            LOGE("Error registering call state change callback: %d\n", err);
+            if (audio_error_callback) {
+                audio_error_callback(err);
+            }
+            return QL_ERR_SERVICE_NOT_READY;
+        }
+
+    } else if (flags == QL_AUDIO_PLAYBACK_NONBLOCK) {
+        LOGD("Set to non-blocking mode\n");
+    } else {
+        LOGE("Invalid flags parameter: %d\n", flags);
+        if (audio_error_callback) {
+            audio_error_callback(-1);
+        }
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    return QL_ERR_OK;
+}
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function opens the audio context for capturing.
+
+  @param[in] fe_pcm_dev     Front end PCM device type.
+  @param[in] be_dai_mask    Back end DAI mask,support follow:
+             QL_AUDIO_BE_DAI_MASK_CAPTURE_PRI_PCM
+             QL_AUDIO_BE_DAI_MASK_CAPTURE_VOICE_UL
+             QL_AUDIO_BE_DAI_MASK_CAPTURE_VOICE_DL
+
+@retval  A_valid_handle     Successful execution
+@retval  QL_AUDIO_INVALID_HANDLE    Failed execution.Invalid handle
+  */
+/*-----------------------------------------------------------------------------------------------*/
+ql_audio_handle_t ql_audio_capture_open(QL_AUDIO_FE_PCM_DEV_E fe_pcm_dev, uint32_t be_dai_mask);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function prepares for audio file capturing.
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+  @param[in] file_name  The name of the audio file to be captured.
+  @param[in] type  The format of the audio data in the audio file.
+  @param[in] pcm_config  Pcm config, including sample rate, channel nums,
+             defined by ql_audio_pcm_config_t, If it is NULL, the API use defaule value
+  @param[in] capture_state_cb   Callback function to report the current audio capturing state.
+  @param[in] params     Parameters carried by the callback function.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Before calling this function, call ql_audio_capture_open() first to obtain a handle.
+            If an audio file is expected to be captured, call this function first to prepare for the audio file
+            capturing and then ql_audio_capture_record() to start capturing.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_file_prepare(ql_audio_handle_t handle,
+                                  const char *file_name,
+                                  QL_AUDIO_STREAM_FORMAT_E type,
+                                  ql_audio_pcm_config_t *pcm_config,
+                                  ql_audio_capture_state_cb_f capture_state_cb,
+                                  void *params);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function prepares for audio stream capturing.
+
+  @param[in] handle  This function prepares for audio stream capturing.
+  @param[in] pcm_config     PCM configuration parameters.
+  @param[in] capture_state_cb   Callback function to report the current audio capturing state.
+  @param[in] params     Parameters carried by the callback function.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Before calling this function, call ql_audio_capture_open() first to obtain a handle.
+            If an audio stream is expected to be captured, call this function first to prepare for
+            the audio stream capturing and then ql_audio_capture_push_stream() to start capturing.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_stream_prepare(ql_audio_handle_t handle,
+                                    ql_audio_pcm_config_t *pcm_config,
+                                    ql_audio_capture_state_cb_f capture_state_cb,
+                                    void *params);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function starts to capture the audio data.
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  QL_ERR_INVALID_STATE     Failed execution. Invalid state.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note Before calling this function, call ql_audio_capture_file_prepare() first to prepare the audio
+        file to be captured, otherwise the audio data cannot be captured successfully.This function also
+        supports capturing of audio stream data. In this case, call ql_audio_capture_stream_prepare()
+        first to prepare the audio stream to be captured, then this function to start capturing,
+        and finally ql_audio_capture_pull_stream() to capture the audio stream in buffer.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_record(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function captures the audio stream data to the buffer.
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+  @param[out] stream_buf  The buffer that stores the audio stream data to be captured.
+  @param[in] buf_size  Buffer size. Unit: Byte.
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_pull_stream(ql_audio_handle_t handle, void *stream_buf, uint32_t buf_size);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function pauses the audio capturing.
+
+  @param[in] handle     The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_pause(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function resumes the audio capturing.
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_resume(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief    This function stops the audio capturing.
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+
+  @note     Calling this function will stop audio capturing regardless of whether the capturing is in
+            progress or paused,and the capturing cannot be resumed after it is stopped.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_stop(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function closes the audio context for capturing.
+
+  @param[in] handle  The handle returned by ql_audio_capture_open().
+
+  @retval  QL_ERR_OK    Successful execution.
+  @retval  QL_ERR_INVALID_HANDLE    Failed execution. Invalid handle.
+  @retval  Others   Failed execution. See ql_type.h for error codes.
+  @note     After audio capturing ends, you must call this function to close the audio context,
+            otherwise subsequent call of ql_audio_capture_open() will fail.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_audio_capture_close(ql_audio_handle_t handle);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief This function gets the current audio capturing state.
+
+  @param[in] handle     The handle returned by ql_audio_capture_open().
+  @param[out] capture_state  The current audio capturing state.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+void ql_audio_capture_get_state(ql_audio_handle_t handle, QL_AUDIO_CAPTURE_STATE_E *capture_state);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_cell_locator.c b/mbtk/libql_lib_v2_rilv2/ql_cell_locator.c
new file mode 100755
index 0000000..b7c0b95
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_cell_locator.c
@@ -0,0 +1,188 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file  ql_cell_locator.h
+  @brief cell_locator service API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20220810    sunshine     Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_CELL_LOCATOR_H__
+#define __QL_CELL_LOCATOR_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef unsigned short uint16_t;
+
+
+typedef struct 
+{
+    char *ptr;
+    //size_t len;
+} curl_rsp_msg_t;
+
+
+
+typedef struct
+{
+    double   latitude;
+    double   longitude;
+    double   altitude;
+} ql_inject_location_t;
+
+typedef struct
+{
+    /*longtitude*/
+    double lon;
+    /*latitude*/
+    double lat;
+    /*accuracy*/
+    unsigned short accuracy;
+
+    char err_msg[256];
+} ql_perform_rsp;
+
+typedef void (*ql_cell_locator_ind_cb_f)(void *msg);
+
+typedef void (*ql_cell_locator_error_cb_f)(int error);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the cell_locator client
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_init(void);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set locator query server and port, server length must be less than 255 bytes.
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_server(char *server, uint16_t port);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set locator query timeout, the value must between 1-300 [seconds]
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_timeout(uint16_t timeout);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set locator query token, token length must be 16 bytes. the token Used to verify that 
+         the client accessing the service is valid.
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_token(char *token);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Register cell_locator callback
+  @param[in] cb
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_ind_cb(ql_cell_locator_ind_cb_f cb);
+
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_set_service_error_cb(ql_cell_locator_error_cb_f cb);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize the  cell_locator client
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief cell_locator start
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_start(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief cell_locator stop
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_cell_locator_stop(void);
+
+int ql_cell_locator_perform(ql_perform_rsp *rsp_ptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_data_call.c b/mbtk/libql_lib_v2_rilv2/ql_data_call.c
new file mode 100755
index 0000000..0f18e77
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_data_call.c
@@ -0,0 +1,1621 @@
+#include "ql_type.h"
+#include "ql_data_call.h"
+#include "mbtk_info_api.h"
+
+typedef struct {
+    int apn_id;
+    ql_data_call_apn_config_t apn_info;
+} mbtk_data_call_apn_param_info_t;
+
+typedef struct {
+    QL_NET_DATA_CALL_RECONNECT_MODE_E reconnect_mode;
+    int time_num;
+    int time_list[QL_NET_MAX_RECONNECT_INTERVAL_LEN];
+    mbtk_data_call_apn_param_info_t *apn_param;     // Point to data_call_apn_param_list.
+} mbtk_data_call_param_info_t;
+
+typedef struct {
+    ql_data_call_item_t call_info;
+    int is_background;
+
+    ql_data_call_status_t call_state;
+
+    mbtk_data_call_param_info_t call_param_info;
+} mbtk_data_call_info_t;
+
+static mbtk_info_handle_t* ql_info_handle = NULL;
+static mbtk_data_call_info_t data_call_info[QL_NET_MAX_DATA_CALL_NUM];
+static mbtk_data_call_apn_param_info_t data_call_apn_param_list[QL_NET_MAX_DATA_CALL_NUM];
+static ql_data_call_service_error_cb_f data_call_service_error_cb = NULL;
+static ql_data_call_status_ind_cb_f data_call_status_ind_cb = NULL;
+
+static int call_index_get_by_call_id(int call_id)
+{
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id == call_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) {
+        return -1;
+    } else {
+        return i;
+    }
+}
+
+static int call_index_get_by_apn_id(int apn_id)
+{
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_param_info.apn_param &&
+            data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) {
+        return -1;
+    } else {
+        return i;
+    }
+}
+
+static void data_call_info_list_print()
+{
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id > 0) {
+            LOGD("CALL START : call_id - %d, call_name - %s, is_background - %d", data_call_info[i].call_info.call_id, data_call_info[i].call_info.call_name,
+                data_call_info[i].is_background);
+            LOGD("call_state : ip_ver - %d, call_status - %d, device - %s", data_call_info[i].call_state.ip_ver,
+            data_call_info[i].call_state.call_status, data_call_info[i].call_state.device);
+            LOGD("param_info : reconnect_mode - %d, time_num - %d", data_call_info[i].call_param_info.reconnect_mode,
+                data_call_info[i].call_param_info.time_num);
+            int j = 0;
+            while(j < data_call_info[i].call_param_info.time_num) {
+                LOGD("time_item[%d] - %d", j, data_call_info[i].call_param_info.time_list[j]);
+                j++;
+            }
+
+            if(data_call_info[i].call_param_info.apn_param) {
+                LOGD("apn_param : apn_id - %d, auth_pref - %d, ip_ver - %d, apn_name - %s, username - %s, password - %s", data_call_info[i].call_param_info.apn_param->apn_id,
+                    data_call_info[i].call_param_info.apn_param->apn_info.auth_pref,
+                    data_call_info[i].call_param_info.apn_param->apn_info.ip_ver,
+                    data_call_info[i].call_param_info.apn_param->apn_info.apn_name,
+                    data_call_info[i].call_param_info.apn_param->apn_info.username,
+                    data_call_info[i].call_param_info.apn_param->apn_info.password);
+            } else {
+                LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
+            }
+        }
+        i++;
+    }
+}
+
+static void data_call_info_item_print(int call_id)
+{
+    int i = call_index_get_by_call_id(call_id);
+    if(i >= 0) {
+        LOGD("CALL START : call_id - %d, call_name - %s, is_background - %d", data_call_info[i].call_info.call_id, data_call_info[i].call_info.call_name,
+            data_call_info[i].is_background);
+        LOGD("call_state : ip_ver - %d, call_status - %d, device - %s", data_call_info[i].call_state.ip_ver,
+        data_call_info[i].call_state.call_status, data_call_info[i].call_state.device);
+        LOGD("param_info : reconnect_mode - %d, time_num - %d", data_call_info[i].call_param_info.reconnect_mode,
+            data_call_info[i].call_param_info.time_num);
+        int j = 0;
+        while(j < data_call_info[i].call_param_info.time_num) {
+            LOGD("time_item[%d] - %d", j, data_call_info[i].call_param_info.time_list[j]);
+            j++;
+        }
+
+        if(data_call_info[i].call_param_info.apn_param) {
+            LOGD("apn_param : apn_id - %d, auth_pref - %d, ip_ver - %d, apn_name - %s, username - %s, password - %s", data_call_info[i].call_param_info.apn_param->apn_id,
+                data_call_info[i].call_param_info.apn_param->apn_info.auth_pref,
+                data_call_info[i].call_param_info.apn_param->apn_info.ip_ver,
+                data_call_info[i].call_param_info.apn_param->apn_info.apn_name,
+                data_call_info[i].call_param_info.apn_param->apn_info.username,
+                data_call_info[i].call_param_info.apn_param->apn_info.password);
+        } else {
+            LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
+        }
+    }
+}
+
+
+static void ril_server_state_cb(const void* data, int data_len)
+{
+    if(data != NULL && data_len == sizeof(int)) {
+        const int *state = (const int*)data;
+        if(*state) {
+            if(data_call_service_error_cb) {
+                data_call_service_error_cb(QL_ERR_ABORTED);
+            }
+        }
+    }
+}
+
+static void data_call_state_change_cb(const void* data, int data_len)
+{
+    LOGD("data_call_state_change_cb() start.");
+    if(data == NULL || data_len == 0)
+    {
+        return;
+    }
+
+    // data_call_info_print();
+
+    uint8 *net_data = NULL;
+    net_data = (uint8 *)data;
+
+    if(*net_data > 100 && *net_data < 200)
+    {
+        int apn_id = *net_data - 100;
+        if(apn_id <= QL_NET_MAX_DATA_CALL_NUM)
+        {
+            int i = 0;
+            while(i < QL_NET_MAX_DATA_CALL_NUM) {
+
+                if(data_call_info[i].call_param_info.apn_param) {
+                    if(data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
+                        break;
+                    } else {
+                        LOGD("call_id = %d, apn_id = %d", data_call_info[i].call_info.call_id,
+                            data_call_info[i].call_param_info.apn_param->apn_id);
+                    }
+                }
+                i++;
+            }
+
+            if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this apn_id.
+                LOGW("Unknown apn_id : %d", apn_id);
+                return;
+            } else {
+                QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+                if(data_call_status_ind_cb) {
+                    data_call_status_ind_cb(data_call_info[i].call_info.call_id, pre_call_status,
+                        &(data_call_info[i].call_state));
+                }
+            }
+        }
+        else
+        {
+            LOGE("[qser_data] cb fail,idx is %d.", apn_id);
+        }
+
+    }
+    else if(*net_data > 200 && *net_data < 220)
+    {
+        LOGE("[qser_data] cid[%d] is open.", *net_data - 200);
+    }
+    else if(*net_data > 220)
+    {
+        LOGE("[qser_data] cid[%d] is reopen.", *net_data - 220);
+        int apn_id = *net_data - 220;
+        if(apn_id <= QL_NET_MAX_DATA_CALL_NUM)
+        {
+            int i = 0;
+            while(i < QL_NET_MAX_DATA_CALL_NUM) {
+                if(data_call_info[i].call_param_info.apn_param
+                    && data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
+                    break;
+                }
+                i++;
+            }
+
+            if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this apn_id.
+                LOGW("Unknown apn_id : %d", apn_id);
+                return;
+            } else {
+                QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+                if(data_call_status_ind_cb) {
+                    data_call_status_ind_cb(data_call_info[i].call_info.call_id, pre_call_status,
+                        &(data_call_info[i].call_state));
+                }
+            }
+        }
+    }
+    else if(*net_data == 1)
+    {
+        LOGE("[qser_data] pdp is open.");
+    }
+    else
+    {
+        LOGE("[qser_data] unkonwn param [%d].", *net_data);
+    }
+}
+
+static int data_call_state_query(int call_id)
+{
+    int i = call_index_get_by_call_id(call_id);
+    if(i < 0) {
+        LOGE("Unknown call_id : %d", call_id);
+        return -1;
+    }
+
+    // Get network information.
+    mbtk_ipv4_info_t ipv4;
+    mbtk_ipv6_info_t ipv6;
+    QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
+    int ret = mbtk_data_call_state_get(ql_info_handle, data_call_info[i].call_param_info.apn_param->apn_id, &ipv4, &ipv6);
+    if(ret != 0)
+    {
+        LOGE("mbtk_data_call_state_get fail.[ret = %d]", ret);
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_ERROR;
+        return -1;
+    }
+    else
+    {
+        data_call_info[i].call_state.has_addr = ipv4.valid;
+        if(ipv4.valid)
+        {
+            if(inet_ntop(AF_INET, &(ipv4.IPAddr), data_call_info[i].call_state.addr.addr , QL_NET_MAX_ADDR_LEN) == NULL) {
+                LOGE("IPv4 error.");
+            } else {
+                LOGD("IPv4 : %s", data_call_info[i].call_state.addr.addr);
+            }
+
+            if(inet_ntop(AF_INET, &(ipv4.NetMask), data_call_info[i].call_state.addr.netmask , QL_NET_MAX_ADDR_LEN) == NULL) {
+                LOGE("NetMask error.");
+            } else {
+                LOGD("NetMask : %s", data_call_info[i].call_state.addr.netmask);
+            }
+
+            if(inet_ntop(AF_INET, &(ipv4.GateWay), data_call_info[i].call_state.addr.gateway , QL_NET_MAX_ADDR_LEN) == NULL) {
+                LOGE("GateWay error.");
+            } else {
+                LOGD("GateWay : %s", data_call_info[i].call_state.addr.gateway);
+            }
+
+            if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), data_call_info[i].call_state.addr.dnsp , QL_NET_MAX_ADDR_LEN) == NULL) {
+                LOGE("PrimaryDNS error.");
+            } else {
+                LOGD("PrimaryDNS : %s", data_call_info[i].call_state.addr.dnsp);
+            }
+
+            if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), data_call_info[i].call_state.addr.dnss , QL_NET_MAX_ADDR_LEN) == NULL) {
+                LOGE("SecondaryDNS error.");
+            } else {
+                LOGD("SecondaryDNS : %s", data_call_info[i].call_state.addr.dnss);
+            }
+        }
+
+        data_call_info[i].call_state.has_addr6 = ipv6.valid;
+        if(ipv6.valid)
+        {
+            if(ipv6_2_str(&(ipv6.IPV6Addr), data_call_info[i].call_state.addr6.addr)) {
+                LOGE("IPv6 error.");
+            } else {
+                LOGD("IPv6 : %s", data_call_info[i].call_state.addr6.addr);
+            }
+
+            if(ipv6_2_str(&(ipv6.NetMask), data_call_info[i].call_state.addr6.prefix)) {
+                LOGE("prefix error.");
+            } else {
+                LOGD("prefix : %s", data_call_info[i].call_state.addr6.prefix);
+            }
+
+            if(ipv6_2_str(&(ipv6.GateWay), data_call_info[i].call_state.addr6.gateway)) {
+                LOGE("GateWay error.");
+            } else {
+                LOGD("GateWay : %s", data_call_info[i].call_state.addr6.gateway);
+            }
+
+            if(ipv6_2_str(&(ipv6.PrimaryDNS), data_call_info[i].call_state.addr6.dnsp)) {
+                LOGE("PrimaryDNS error.");
+            } else {
+                LOGD("PrimaryDNS : %s", data_call_info[i].call_state.addr6.dnsp);
+            }
+
+            if(ipv6_2_str(&(ipv6.SecondaryDNS), data_call_info[i].call_state.addr6.dnsp)) {
+                LOGE("SecondaryDNS error.");
+            } else {
+                LOGD("SecondaryDNS : %s", data_call_info[i].call_state.addr6.dnsp);
+            }
+        }
+
+        pre_call_status = data_call_info[i].call_state.call_status;
+#if 1
+        if(data_call_info[i].call_state.ip_ver == QL_NET_IP_VER_V4V6) {
+            if(ipv4.valid && !ipv6.valid) {
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED;
+            } else if(!ipv4.valid && ipv6.valid) {
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED;
+            } else if(ipv4.valid && ipv6.valid) {
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+            } else {
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+            }
+        } else if(data_call_info[i].call_state.ip_ver == QL_NET_IP_VER_V4) {
+            if(ipv4.valid) {
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+            } else {
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+            }
+        } else if(data_call_info[i].call_state.ip_ver == QL_NET_IP_VER_V6) {
+            if(ipv6.valid) {
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+            } else {
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+            }
+        } else {
+            data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+        }
+#else
+        if(ipv4.valid && ipv6.valid) {
+            data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+        } else if(!ipv4.valid && ipv6.valid) {
+            data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED;
+        } else if(ipv4.valid && !ipv6.valid) {
+            data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED;
+        } else {
+            data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+        }
+#endif
+
+        if(data_call_status_ind_cb) {
+            data_call_status_ind_cb(call_id, pre_call_status,
+                &(data_call_info[i].call_state));
+        }
+    }
+
+    return 0;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call service
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_init(void)
+{
+    if(ql_info_handle == NULL)
+    {
+
+        mbtk_log_init("radio", "QL_DATA_CALL");
+
+        ql_info_handle = mbtk_info_handle_get();
+        if(ql_info_handle)
+        {
+            memset(&data_call_info, 0, sizeof(data_call_info));
+            memset(&data_call_apn_param_list, 0, sizeof(data_call_apn_param_list));
+            return QL_ERR_OK;
+        } else {
+            LOGE("mbtk_info_handle_get() fail.");
+            return QL_ERR_UNKNOWN;
+        }
+    } else {
+        return QL_ERR_UNKNOWN;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Create a data call instance
+  @param[in] call_id The unique identifier of the data call instance, specified by the user
+  @param[in] call_name Friendly data call name,  specified by the user
+  @param[in] is_background Whether the data call status is maintained by the data call service daemon.
+  If it is 0, the data call instance will be deleted after the data call process exits.
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_create(int call_id, const char *call_name, int is_background)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(call_id <= 0 || call_name == NULL || strlen(call_name) == 0
+        || strlen(call_name) > QL_NET_MAX_NAME_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id == 0) { // Not use.
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) { // data_call item full.
+        LOGW("data_call instance is full.");
+        return QL_ERR_UNKNOWN;
+    }
+
+    data_call_info[i].call_info.call_id = call_id;
+    memcpy(data_call_info[i].call_info.call_name, call_name, strlen(call_name));
+    data_call_info[i].call_state.call_id = call_id;
+    memcpy(data_call_info[i].call_state.call_name, call_name, strlen(call_name));
+
+    data_call_info[i].is_background = is_background;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Alloc for a data call configuration instance
+  @return
+  NULL - Not enough memory
+  Other - successful
+  */
+/*-----------------------------------------------------------------------------------------------*/
+ql_data_call_param_t *ql_data_call_param_alloc(void)
+{
+    ql_data_call_param_t *result = malloc(sizeof(mbtk_data_call_param_info_t));
+    if(result) {
+        memset(result, 0, sizeof(mbtk_data_call_param_info_t));
+    }
+
+    return result;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_init(ql_data_call_param_t *param)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    memset(info, 0, sizeof(mbtk_data_call_param_info_t));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Release the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_free(ql_data_call_param_t *param)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    free(param);
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Bind APN ID, range:1-16
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_id APN ID, range:1-16
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_apn_id(ql_data_call_param_t *param, int apn_id)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    // 1 - 7
+    if(param == NULL || apn_id <= 0 || apn_id > QL_NET_MAX_APN_ID) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_apn_param_list[i].apn_id == apn_id) {
+            break;
+        }
+        i++;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param != NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    if(i == QL_NET_MAX_DATA_CALL_NUM) {
+        LOGW("No found apn_id : %d.", apn_id);
+        // Found next empty apn item.
+        int j = 0;
+        while(j < QL_NET_MAX_DATA_CALL_NUM) {
+            if(data_call_apn_param_list[j].apn_id <= 0) {
+                break;
+            }
+            j++;
+        }
+        if(j == QL_NET_MAX_DATA_CALL_NUM) { // Full
+            return QL_ERR_UNKNOWN;
+        }
+
+        info->apn_param = &(data_call_apn_param_list[j]);
+        info->apn_param->apn_id = apn_id;
+    } else {
+        // Found apn_id
+        info->apn_param = &(data_call_apn_param_list[i]);
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN ID
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_apn_id(ql_data_call_param_t *param, int *apn_id)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || apn_id == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    *apn_id = info->apn_param->apn_id;
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN name
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_name APN name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_apn_name(ql_data_call_param_t *param, const char *apn_name)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || apn_name == NULL || strlen(apn_name) == 0
+        || strlen(apn_name) > QL_NET_MAX_APN_NAME_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(info->apn_param->apn_info.apn_name, apn_name, strlen(apn_name));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN name buffer
+  @param[in] buf_len APN name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_apn_name(ql_data_call_param_t *param, char *buf, int buf_len)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || buf == NULL || buf_len <= 0) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    if(strlen(info->apn_param->apn_info.apn_name) + 1 > buf_len) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(buf, info->apn_param->apn_info.apn_name, strlen(info->apn_param->apn_info.apn_name));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user name
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_name APN user name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_user_name(ql_data_call_param_t *param, const char *user_name)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || user_name == NULL || strlen(user_name) == 0
+        || strlen(user_name) > QL_NET_MAX_APN_USERNAME_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(info->apn_param->apn_info.username, user_name, strlen(user_name));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user name buffer
+  @param[in] buf_len APN user name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_user_name(ql_data_call_param_t *param, char *buf, int buf_len)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || buf == NULL || buf_len <= 0) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    if(strlen(info->apn_param->apn_info.username) + 1 > buf_len) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(buf, info->apn_param->apn_info.username, strlen(info->apn_param->apn_info.username));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user password
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_password APN user password
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_user_password(ql_data_call_param_t *param, const char *user_password)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || user_password == NULL || strlen(user_password) == 0
+        || strlen(user_password) > QL_NET_MAX_APN_PASSWORD_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(info->apn_param->apn_info.password, user_password, strlen(user_password));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user password from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user password buffer
+  @param[in] buf_len APN user password buffer size
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_user_password(ql_data_call_param_t *param, char *buf, int buf_len)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || buf == NULL || buf_len <= 0) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    if(strlen(info->apn_param->apn_info.password) + 1 > buf_len) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(buf, info->apn_param->apn_info.password, strlen(info->apn_param->apn_info.password));
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[in] auth_pref Defined by QL_DATA_CALL_AUTH_PREF_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_auth_pref(ql_data_call_param_t *param, int auth_pref)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    info->apn_param->apn_info.auth_pref = (QL_NET_AUTH_PREF_E)auth_pref;
+
+    return QL_ERR_OK;
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_data Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_auth_pref(ql_data_call_param_t *param, int *p_data)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || p_data == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    *p_data = info->apn_param->apn_info.auth_pref;
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call IP version
+  @param[in] param Point to the data call configuration instance
+  @param[in] ip_ver Defined by QL_NET_IP_VER_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_ip_version(ql_data_call_param_t *param, int ip_ver)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    info->apn_param->apn_info.ip_ver = (QL_NET_IP_VER_E)ip_ver;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get IP version from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_ver Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_ip_version(ql_data_call_param_t *param, int *p_ver)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || p_ver == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    *p_ver = info->apn_param->apn_info.ip_ver;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection mode
+  @param[in] param Point to the data call configuration instance
+  @param[in] mode Defined by QL_NET_DATA_CALL_RECONNECT_MODE_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_reconnect_mode(ql_data_call_param_t *param, int reconnect_mode)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    info->reconnect_mode = reconnect_mode;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection mode from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_mode Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_reconnect_mode(ql_data_call_param_t *param, int *p_mode)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || p_mode == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    *p_mode = info->reconnect_mode;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection interval
+  @param[in] param Point to the data call configuration instance
+  @param[in] time_list Interval time list in ms
+  @param[in] num Number of time list
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_reconnect_interval(ql_data_call_param_t *param, int *time_list, int num)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || time_list == NULL || num <= 0 || num > QL_NET_MAX_RECONNECT_INTERVAL_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    info->time_num = num;
+    memcpy(&(info->time_list), time_list, sizeof(int) * num);
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection interval from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] time_list Store return value
+  @param[in,out] p_num
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_reconnect_interval(ql_data_call_param_t *param, int *time_list, int *p_num)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || time_list == NULL || p_num == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    *p_num = info->time_num;
+    int i = 0;
+    for(; i < info->time_num; i++) {
+        *(time_list + i) = info->time_list[i];
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the specified data call instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_config(int call_id, ql_data_call_param_t *param)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id == call_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this call_id.
+        LOGW("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    memcpy(&(data_call_info[i].call_param_info), param, sizeof(mbtk_data_call_param_info_t));;
+
+    if(data_call_info[i].call_param_info.apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    snprintf(data_call_info[i].call_state.device, QL_NET_MAX_NAME_LEN, "ccinet%d",
+        data_call_info[i].call_param_info.apn_param->apn_id - 1);
+    data_call_info[i].call_state.ip_ver = data_call_info[i].call_param_info.apn_param->apn_info.ip_ver;
+    data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_IDLE;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the specified data call configuration instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_config(int call_id, ql_data_call_param_t *param)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id == call_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this call_id.
+        LOGW("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    memcpy(param, &(data_call_info[i].call_param_info), sizeof(mbtk_data_call_param_info_t));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Start data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_start(int call_id)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    int i = call_index_get_by_call_id(call_id);
+    if(i < 0) {
+        LOGE("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_info[i].call_param_info.apn_param == NULL) {
+        LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
+        return QL_ERR_UNKNOWN;
+    }
+
+    int ret = data_call_state_query(call_id);
+    if(ret) {
+        LOGE("data_call_state_query fail.");
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_IDLE;
+        // return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_info[i].call_state.call_status == QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED
+        || data_call_info[i].call_state.call_status == QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED
+        || data_call_info[i].call_state.call_status == QL_NET_DATA_CALL_STATUS_CONNECTED) {
+        LOGW("call_id %d has connected.", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    LOGD("Start Data Call : %d", call_id);
+    data_call_info_item_print(call_id);
+
+    // Set APN in the first.
+    mbtk_ip_type_enum ip_type;
+    switch(data_call_info[i].call_param_info.apn_param->apn_info.ip_ver) {
+        case QL_NET_IP_VER_V4:
+            ip_type = MBTK_IP_TYPE_IP;
+            break;
+        case QL_NET_IP_VER_V6:
+            ip_type = MBTK_IP_TYPE_IPV6;
+            break;
+        case QL_NET_IP_VER_V4V6:
+            ip_type = MBTK_IP_TYPE_IPV4V6;
+            break;
+        default:
+            LOGE("Unknown ip_ver.");
+            return QL_ERR_UNKNOWN;
+    }
+
+    char auth_type[64]={0};
+    switch(data_call_info[i].call_param_info.apn_param->apn_info.auth_pref) {
+        case QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED:
+            memcpy(auth_type,"NONE",strlen("NONE"));
+            break;
+        case QL_NET_AUTH_PREF_PAP_ONLY_ALLOWED:
+            memcpy(auth_type,"PAP",strlen("PAP"));
+            break;
+        case QL_NET_AUTH_PREF_CHAP_ONLY_ALLOWED:
+            memcpy(auth_type,"CHAP",strlen("CHAP"));
+            break;
+#if 0
+        case QL_NET_AUTH_PREF_PAP_CHAP_BOTH_ALLOWED:
+            apninfo.auth_proto = MBTK_APN_AUTH_PROTO_PAP_CHAP;
+            break;
+#endif
+        default:
+            LOGE("Unknown auth_pref.");
+            return QL_ERR_UNKNOWN;
+    }
+
+    ret = mbtk_apn_set(ql_info_handle, data_call_info[i].call_param_info.apn_param->apn_id, ip_type,
+                data_call_info[i].call_param_info.apn_param->apn_info.apn_name,
+                data_call_info[i].call_param_info.apn_param->apn_info.username,
+                data_call_info[i].call_param_info.apn_param->apn_info.password, auth_type);
+    if(ret) {
+        LOGE("mbtk_apn_set fail.");
+        return QL_ERR_UNKNOWN;
+    }
+
+    // Start data call.
+    int auto_conn_interval = 0;
+    QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
+    data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTING;
+    if(data_call_status_ind_cb) {
+        data_call_status_ind_cb(call_id, pre_call_status,
+            &(data_call_info[i].call_state));
+    }
+
+    if(data_call_info[i].call_param_info.reconnect_mode == QL_NET_DATA_CALL_RECONNECT_NORMAL
+        || data_call_info[i].call_param_info.reconnect_mode == QL_NET_DATA_CALL_RECONNECT_MODE_1
+        || data_call_info[i].call_param_info.reconnect_mode == QL_NET_DATA_CALL_RECONNECT_MODE_2) {
+        if(data_call_info[i].call_param_info.time_num > 0) {
+            auto_conn_interval = data_call_info[i].call_param_info.time_list[0];
+        }
+    } else {
+        auto_conn_interval = 0;
+    }
+
+    ret = mbtk_data_call_start(ql_info_handle, data_call_info[i].call_param_info.apn_param->apn_id, auto_conn_interval,
+                FALSE, 0);
+    if(ret) {
+        LOGE("mbtk_data_call_start fail.");
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_ERROR;
+        return QL_ERR_UNKNOWN;
+    }
+
+    ret = data_call_state_query(call_id);
+    if(ret) {
+        LOGE("data_call_state_query fail.");
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_ERROR;
+        return QL_ERR_UNKNOWN;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Stop data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_stop(int call_id)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id == call_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(data_call_info[i].call_param_info.apn_param) {
+        int ret = mbtk_data_call_stop(ql_info_handle, data_call_info[i].call_param_info.apn_param->apn_id, 15);
+        if(ret) {
+            LOGE("mbtk_data_call_stop() fail.");
+            return QL_ERR_UNKNOWN;
+        }
+    } else {
+        LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
+        return QL_ERR_UNKNOWN;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Delete a data call instance
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_delete(int call_id)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id == call_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this call_id.
+        LOGW("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_info[i].call_param_info.apn_param) {
+        memset(data_call_info[i].call_param_info.apn_param, 0, sizeof(mbtk_data_call_apn_param_info_t));
+    }
+    memset(&(data_call_info[i]), 0, sizeof(mbtk_data_call_info_t));
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the current data call instance list
+  @param[out] list Data call instance array
+  @param[in,out] list_len, in-> Data call instance array size, out->current data call instance number
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_list(ql_data_call_item_t *list, int *list_len)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(list == NULL || list_len == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    *list_len = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id > 0) {
+            memset(&(list[*list_len]), 0, sizeof(ql_data_call_item_t));
+            list[*list_len].call_id = data_call_info[i].call_info.call_id;
+            memcpy(list[*list_len].call_name, data_call_info[i].call_info.call_name,
+                strlen(data_call_info[i].call_info.call_name));
+
+            (*list_len)++;
+        }
+        i++;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the data call status
+  @param[in] call_id Specify a data call instance
+  @param[out] p_sta Point to status instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_status(int call_id, ql_data_call_status_t *p_sta)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(p_sta == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id == call_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this call_id.
+        LOGW("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    memcpy(p_sta, &(data_call_info[i].call_state), sizeof(ql_data_call_status_t));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Register data call status change event
+  @param[in] cb
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_status_ind_cb(ql_data_call_status_ind_cb_f cb)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_UNKNOWN;
+    } else {
+        if(mbtk_pdp_state_change_cb_reg(ql_info_handle, data_call_state_change_cb))
+        {
+            return QL_ERR_UNKNOWN;
+        }
+
+        data_call_status_ind_cb = cb;
+        return QL_ERR_OK;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set APN related configuration.If the apn does not exist, it is automatically created.
+  @param[in] apn_id APN ID, range:1-16
+  @param[in] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_apn_config(int apn_id, ql_data_call_apn_config_t *p_info)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(p_info == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_param_info.apn_param
+            && data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this apn_id.
+        LOGW("New apn_id : %d", apn_id);
+        // New data call param.
+        int j = 0;
+        while(j < QL_NET_MAX_DATA_CALL_NUM) {
+            if(data_call_apn_param_list[j].apn_id <= 0) {
+                break;
+            }
+            j++;
+        }
+
+        if(j == QL_NET_MAX_DATA_CALL_NUM) { // Full
+            LOGW("data_call_apn_param_list is full.");
+            return QL_ERR_UNKNOWN;
+        }
+
+        data_call_apn_param_list[j].apn_id = apn_id;
+        memcpy(&(data_call_apn_param_list[j].apn_info), p_info, sizeof(ql_data_call_apn_config_t));
+    } else {
+        memcpy(&(data_call_info[i].call_param_info.apn_param->apn_info), p_info, sizeof(ql_data_call_apn_config_t));
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set APN related configuration. If the apn does not exist, it is automatically created and
+  the default parameters are set.
+  @param[in] apn_id APN ID, range:1-16
+  @param[out] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_apn_config(int apn_id, ql_data_call_apn_config_t *p_info)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(p_info == NULL || p_info == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_param_info.apn_param
+            && data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this apn_id.
+        LOGE("Unknown apn_id : %d", apn_id);
+        return QL_ERR_UNKNOWN;
+    } else {
+        memcpy(p_info, &(data_call_info[i].call_param_info.apn_param->apn_info), sizeof(ql_data_call_apn_config_t));
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set APN related configuration,APN ID:1
+  @param[in] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_attach_apn_config(ql_data_call_apn_config_t *p_info)
+{
+    return ql_data_call_set_apn_config(1, p_info);
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally,
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_service_error_cb(ql_data_call_service_error_cb_f cb)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_UNKNOWN;
+    } else {
+        if(mbtk_ril_server_state_change_reg(ql_info_handle, ril_server_state_cb))
+        {
+            return QL_ERR_UNKNOWN;
+        }
+
+        data_call_service_error_cb = cb;
+        return QL_ERR_OK;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize the data call service
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_deinit(void)
+{
+    if(ql_info_handle == NULL)
+    {
+        return QL_ERR_UNKNOWN;
+    } else {
+        if(mbtk_info_handle_free(&ql_info_handle))
+        {
+            return QL_ERR_UNKNOWN;
+        }
+
+        return QL_ERR_OK;
+    }
+}
diff --git a/mbtk/libql_lib_v2_rilv2/ql_data_call_v1.c b/mbtk/libql_lib_v2_rilv2/ql_data_call_v1.c
new file mode 100755
index 0000000..4e3c905
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_data_call_v1.c
@@ -0,0 +1,1867 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "ql_type.h"
+#include "ql_data_call.h"
+#include "mbtk_ril_api.h"
+
+typedef struct {
+    int apn_id;
+    ql_data_call_apn_config_t apn_info;
+} mbtk_data_call_apn_param_info_t;
+
+typedef struct {
+    QL_NET_DATA_CALL_RECONNECT_MODE_E reconnect_mode;
+    int time_num;
+    int time_list[QL_NET_MAX_RECONNECT_INTERVAL_LEN];
+    mbtk_data_call_apn_param_info_t *apn_param;     // Point to data_call_apn_list.
+} mbtk_data_call_param_info_t;
+
+typedef struct {
+//    ql_data_call_item_t call_info;
+    int is_background;
+
+    ql_data_call_status_t call_state;
+
+    mbtk_data_call_param_info_t *param_info;
+} ql_data_call_info_t;
+
+static mbtk_ril_handle* ql_ril_handle = NULL;
+static ql_data_call_info_t data_call_info[QL_NET_MAX_DATA_CALL_NUM];
+static mbtk_data_call_apn_param_info_t data_call_apn_list[QL_NET_MAX_DATA_CALL_NUM];
+static ql_data_call_service_error_cb_f data_call_service_error_cb = NULL;
+static ql_data_call_status_ind_cb_f data_call_status_ind_cb = NULL;
+
+static int call_index_get_by_call_id(int call_id)
+{
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_state.call_id == call_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) {
+        return -1;
+    } else {
+        return i;
+    }
+}
+
+static int call_index_get_by_apn_id(int apn_id)
+{
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].param_info && data_call_info[i].param_info->apn_param
+            && data_call_info[i].param_info->apn_param->apn_id == apn_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) {
+        return -1;
+    } else {
+        return i;
+    }
+}
+
+#if 0
+static void data_call_info_list_print()
+{
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_info.call_id > 0) {
+            LOGD("CALL START : call_id - %d, call_name - %s, is_background - %d", data_call_info[i].call_info.call_id, data_call_info[i].call_info.call_name,
+                data_call_info[i].is_background);
+            LOGD("call_state : ip_ver - %d, call_status - %d, device - %s", data_call_info[i].call_state.ip_ver,
+            data_call_info[i].call_state.call_status, data_call_info[i].call_state.device);
+            LOGD("param_info : reconnect_mode - %d, time_num - %d", data_call_info[i].call_param_info.reconnect_mode,
+                data_call_info[i].call_param_info.time_num);
+            int j = 0;
+            while(j < data_call_info[i].call_param_info.time_num) {
+                LOGD("time_item[%d] - %d", j, data_call_info[i].call_param_info.time_list[j]);
+                j++;
+            }
+
+            if(data_call_info[i].call_param_info.apn_param) {
+                LOGD("apn_param : apn_id - %d, auth_pref - %d, ip_ver - %d, apn_name - %s, username - %s, password - %s", data_call_info[i].call_param_info.apn_param->apn_id,
+                    data_call_info[i].call_param_info.apn_param->apn_info.auth_pref,
+                    data_call_info[i].call_param_info.apn_param->apn_info.ip_ver,
+                    data_call_info[i].call_param_info.apn_param->apn_info.apn_name,
+                    data_call_info[i].call_param_info.apn_param->apn_info.username,
+                    data_call_info[i].call_param_info.apn_param->apn_info.password);
+            } else {
+                LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
+            }
+        }
+        i++;
+    }
+}
+
+
+static void data_call_info_item_print(int call_id)
+{
+    int i = call_index_get_by_call_id(call_id);
+    if(i >= 0) {
+        LOGD("CALL START : call_id - %d, call_name - %s, is_background - %d", data_call_info[i].call_info.call_id, data_call_info[i].call_info.call_name,
+            data_call_info[i].is_background);
+        LOGD("call_state : ip_ver - %d, call_status - %d, device - %s", data_call_info[i].call_state.ip_ver,
+        data_call_info[i].call_state.call_status, data_call_info[i].call_state.device);
+        LOGD("param_info : reconnect_mode - %d, time_num - %d", data_call_info[i].call_param_info.reconnect_mode,
+            data_call_info[i].call_param_info.time_num);
+        int j = 0;
+        while(j < data_call_info[i].call_param_info.time_num) {
+            LOGD("time_item[%d] - %d", j, data_call_info[i].call_param_info.time_list[j]);
+            j++;
+        }
+
+        if(data_call_info[i].call_param_info.apn_param) {
+            LOGD("apn_param : apn_id - %d, auth_pref - %d, ip_ver - %d, apn_name - %s, username - %s, password - %s", data_call_info[i].call_param_info.apn_param->apn_id,
+                data_call_info[i].call_param_info.apn_param->apn_info.auth_pref,
+                data_call_info[i].call_param_info.apn_param->apn_info.ip_ver,
+                data_call_info[i].call_param_info.apn_param->apn_info.apn_name,
+                data_call_info[i].call_param_info.apn_param->apn_info.username,
+                data_call_info[i].call_param_info.apn_param->apn_info.password);
+        } else {
+            LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
+        }
+    }
+}
+#endif
+
+
+static void ril_server_state_cb(const void* data, int data_len)
+{
+    if(data != NULL && data_len == sizeof(int)) {
+        const int *state = (const int*)data;
+        if(*state) {
+            if(data_call_service_error_cb) {
+                data_call_service_error_cb(QL_ERR_ABORTED);
+            }
+        }
+    }
+}
+
+static int data_call_status_update_by_ipv4v6(const mbtk_ip_info_t *ip_info, ql_data_call_status_t *p_sta)
+{
+    if(ip_info->ipv4.valid)
+    {
+        p_sta->has_addr = ip_info->ipv4.valid;
+        if(inet_ntop(AF_INET, &(ip_info->ipv4.IPAddr), p_sta->addr.addr , QL_NET_MAX_ADDR_LEN) == NULL) {
+            LOGE("IPv4 error.");
+        } else {
+            LOGD("IPv4 : %s", p_sta->addr.addr);
+        }
+
+        if(inet_ntop(AF_INET, &(ip_info->ipv4.NetMask), p_sta->addr.netmask , QL_NET_MAX_ADDR_LEN) == NULL) {
+            LOGE("NetMask error.");
+        } else {
+            LOGD("NetMask : %s", p_sta->addr.netmask);
+        }
+
+        if(inet_ntop(AF_INET, &(ip_info->ipv4.GateWay), p_sta->addr.gateway , QL_NET_MAX_ADDR_LEN) == NULL) {
+            LOGE("GateWay error.");
+        } else {
+            LOGD("GateWay : %s", p_sta->addr.gateway);
+        }
+
+        if(inet_ntop(AF_INET, &(ip_info->ipv4.PrimaryDNS), p_sta->addr.dnsp , QL_NET_MAX_ADDR_LEN) == NULL) {
+            LOGE("PrimaryDNS error.");
+        } else {
+            LOGD("PrimaryDNS : %s", p_sta->addr.dnsp);
+        }
+
+        if(inet_ntop(AF_INET, &(ip_info->ipv4.SecondaryDNS), p_sta->addr.dnss , QL_NET_MAX_ADDR_LEN) == NULL) {
+            LOGE("SecondaryDNS error.");
+        } else {
+            LOGD("SecondaryDNS : %s", p_sta->addr.dnss);
+        }
+    }
+
+    if(ip_info->ipv6.valid)
+    {
+        p_sta->has_addr6 = ip_info->ipv6.valid;
+        if(ipv6_2_str(&(ip_info->ipv6.IPV6Addr), p_sta->addr6.addr)) {
+            LOGE("IPv6 error.");
+        } else {
+            LOGD("IPv6 : %s", p_sta->addr6.addr);
+        }
+
+        if(ipv6_2_str(&(ip_info->ipv6.NetMask), p_sta->addr6.prefix)) {
+            LOGE("prefix error.");
+        } else {
+            LOGD("prefix : %s", p_sta->addr6.prefix);
+        }
+
+        if(ipv6_2_str(&(ip_info->ipv6.GateWay), p_sta->addr6.gateway)) {
+            LOGE("GateWay error.");
+        } else {
+            LOGD("GateWay : %s", p_sta->addr6.gateway);
+        }
+
+        if(ipv6_2_str(&(ip_info->ipv6.PrimaryDNS), p_sta->addr6.dnsp)) {
+            LOGE("PrimaryDNS error.");
+        } else {
+            LOGD("PrimaryDNS : %s", p_sta->addr6.dnsp);
+        }
+
+        if(ipv6_2_str(&(ip_info->ipv6.SecondaryDNS), p_sta->addr6.dnsp)) {
+            LOGE("SecondaryDNS error.");
+        } else {
+            LOGD("SecondaryDNS : %s", p_sta->addr6.dnsp);
+        }
+    }
+
+#if 1
+    if(p_sta->ip_ver == QL_NET_IP_VER_V4V6) {
+        if(ip_info->ipv4.valid && !ip_info->ipv6.valid) {
+            p_sta->call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED;
+        } else if(!ip_info->ipv4.valid && ip_info->ipv6.valid) {
+            p_sta->call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED;
+        } else if(ip_info->ipv4.valid && ip_info->ipv6.valid) {
+            p_sta->call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+        } else {
+            p_sta->call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+        }
+    } else if(p_sta->ip_ver == QL_NET_IP_VER_V4) {
+        if(ip_info->ipv4.valid) {
+            p_sta->call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+        } else {
+            p_sta->call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+        }
+    } else if(p_sta->ip_ver == QL_NET_IP_VER_V6) {
+        if(ip_info->ipv6.valid) {
+            p_sta->call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+        } else {
+            p_sta->call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+        }
+    }
+#else
+    if(ipv4.valid && ipv6.valid) {
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+    } else if(!ipv4.valid && ipv6.valid) {
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED;
+    } else if(ipv4.valid && !ipv6.valid) {
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED;
+    } else {
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+    }
+
+    if(data_call_status_ind_cb) {
+        data_call_status_ind_cb(call_id, pre_call_status,
+            &(data_call_info[i].call_state));
+    }
+#endif
+
+    return 0;
+}
+
+
+static void data_call_state_change_cb(const void* data, int data_len)
+{
+    LOGD("data_call_state_change_cb() start.");
+    if(data == NULL || data_len == 0)
+    {
+        return;
+    }
+
+    mbtk_ril_pdp_state_info_t *pdp_info = (mbtk_ril_pdp_state_info_t*)data;
+    if(pdp_info->action) { // Connect
+        LOGE("cid[%d] is open.", pdp_info->cid);
+        int i = call_index_get_by_apn_id(pdp_info->cid);;
+        if(i < 0) { // No found this apn_id.
+            LOGW("Unknown apn_id : %d", pdp_info->cid);
+            return;
+        } else {
+            QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
+            data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+            data_call_status_update_by_ipv4v6(&(pdp_info->ip_info) ,&data_call_info[i].call_state);
+            if(data_call_status_ind_cb) {
+                data_call_status_ind_cb(data_call_info[i].call_state.call_id, pre_call_status,
+                    &(data_call_info[i].call_state));
+            }
+        }
+    } else { // Disconnect
+        int apn_id = pdp_info->cid;
+        if(apn_id <= QL_NET_MAX_DATA_CALL_NUM)
+        {
+            int i = call_index_get_by_apn_id(apn_id);
+            if(i < 0) { // No found this apn_id.
+                LOGW("Unknown apn_id : %d", apn_id);
+                return;
+            } else {
+                QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+
+                // Delete IP
+                data_call_info[i].call_state.has_addr = 0;
+                memset(&(data_call_info[i].call_state.addr), 0, sizeof(ql_net_addr_t));
+                data_call_info[i].call_state.has_addr6 = 0;
+                memset(&(data_call_info[i].call_state.addr6), 0, sizeof(ql_net_addr6_t));
+                if(data_call_status_ind_cb) {
+                    data_call_status_ind_cb(data_call_info[i].call_state.call_id, pre_call_status,
+                        &(data_call_info[i].call_state));
+                }
+            }
+        }
+        else
+        {
+            LOGE("[qser_data] cb fail,idx is %d.", apn_id);
+        }
+    }
+
+#if 0
+
+    uint8 *net_data = NULL;
+    net_data = (uint8 *)data;
+
+    if(*net_data > 100 && *net_data < 200) // Disconnect
+    {
+        int apn_id = *net_data - 100;
+        if(apn_id <= QL_NET_MAX_DATA_CALL_NUM)
+        {
+            int i = call_index_get_by_apn_id(apn_id);
+            if(i < 0) { // No found this apn_id.
+                LOGW("Unknown apn_id : %d", apn_id);
+                return;
+            } else {
+                QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
+
+                // Delete IP
+                data_call_info[i].call_state.has_addr = 0;
+                memset(&(data_call_info[i].call_state.addr), 0, sizeof(ql_net_addr_t));
+                data_call_info[i].call_state.has_addr6 = 0;
+                memset(&(data_call_info[i].call_state.addr6), 0, sizeof(ql_net_addr6_t));
+                if(data_call_status_ind_cb) {
+                    data_call_status_ind_cb(data_call_info[i].call_state.call_id, pre_call_status,
+                        &(data_call_info[i].call_state));
+                }
+            }
+        }
+        else
+        {
+            LOGE("[qser_data] cb fail,idx is %d.", apn_id);
+        }
+
+    }
+    else if(*net_data > 200) // Connect
+    {
+        LOGE("[qser_data] cid[%d] is reopen.", *net_data - 220);
+        int apn_id;
+        if(*net_data > 220)
+        {
+            apn_id = *net_data - 220;
+        } else {
+            apn_id = *net_data - 200;
+        }
+
+        if(apn_id <= QL_NET_MAX_DATA_CALL_NUM)
+        {
+            int i = call_index_get_by_apn_id(apn_id);;
+            if(i < 0) { // No found this apn_id.
+                LOGW("Unknown apn_id : %d", apn_id);
+                return;
+            } else {
+                QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
+                data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
+
+                mbtk_pdp_act_info_t *act_info = (mbtk_pdp_act_info_t*)data;
+                data_call_status_update_by_ipv4v6(&(act_info->ipv4), &(act_info->ipv6),&data_call_info[i].call_state);
+
+                if(data_call_status_ind_cb) {
+                    data_call_status_ind_cb(data_call_info[i].call_state.call_id, pre_call_status,
+                        &(data_call_info[i].call_state));
+                }
+            }
+        }
+    }
+    else if(*net_data == 1)
+    {
+        LOGE("[qser_data] pdp is open.");
+    }
+    else
+    {
+        LOGE("[qser_data] unkonwn param [%d].", *net_data);
+    }
+#endif
+}
+
+static int data_call_state_query(int apn_id, ql_data_call_status_t *p_sta)
+{
+    // Get network information.
+    mbtk_ip_info_t ip_info;
+    int ret = mbtk_data_call_state_get(ql_ril_handle, apn_id, &ip_info);
+    if(ret != 0)
+    {
+        LOGE("mbtk_data_call_state_get fail.[ret = %d]", ret);
+        return -1;
+    }
+    else
+    {
+        return data_call_status_update_by_ipv4v6(&ip_info, p_sta);
+    }
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call service
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_init(void)
+{
+    if(ql_ril_handle == NULL)
+    {
+
+        mbtk_log_init("radio", "QL_DATA_CALL");
+
+        ql_ril_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+        if(ql_ril_handle)
+        {
+            memset(&data_call_info, 0, sizeof(data_call_info));
+            memset(&data_call_apn_list, 0, sizeof(data_call_apn_list));
+
+            // Get all APN list.
+            mbtk_apn_info_array_t apn_list;
+            memset(&apn_list, 0, sizeof(mbtk_apn_info_array_t));
+            mbtk_ril_err_enum ret = mbtk_apn_get(ql_ril_handle, &apn_list);
+            if(ret) {
+                LOGE("mbtk_apn_get fail:%d", ret);
+                return QL_ERR_UNKNOWN;
+            } else {
+                int i = 0;
+                while(i < apn_list.num) {
+                    data_call_apn_list[i].apn_id = apn_list.apns[i].cid;
+                    switch(apn_list.apns[i].ip_type) {
+                        case MBTK_IP_TYPE_IP:
+                            data_call_apn_list[i].apn_info.ip_ver = QL_NET_IP_VER_V4;
+                            break;
+                        case MBTK_IP_TYPE_IPV6:
+                            data_call_apn_list[i].apn_info.ip_ver = QL_NET_IP_VER_V6;
+                            break;
+                        case MBTK_IP_TYPE_IPV4V6:
+                            data_call_apn_list[i].apn_info.ip_ver = QL_NET_IP_VER_V4V6;
+                            break;
+                        default:
+                            LOGE("Unknown ip_ver.");
+                            return QL_ERR_UNKNOWN;
+                    }
+
+                    if(apn_list.apns[i].auth == MBTK_APN_AUTH_PROTO_NONE) {
+                        data_call_apn_list[i].apn_info.auth_pref = QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED;
+                    } else if(apn_list.apns[i].auth == MBTK_APN_AUTH_PROTO_PAP) {
+                        data_call_apn_list[i].apn_info.auth_pref = QL_NET_AUTH_PREF_PAP_ONLY_ALLOWED;
+                    } else if(apn_list.apns[i].auth == MBTK_APN_AUTH_PROTO_CHAP) {
+                        data_call_apn_list[i].apn_info.auth_pref = QL_NET_AUTH_PREF_CHAP_ONLY_ALLOWED;
+                    } else { // Default is "NONE"
+                        data_call_apn_list[i].apn_info.auth_pref = QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED;
+                    }
+
+                    if(strlen((char*)apn_list.apns[i].apn) > 0)
+                        memcpy(data_call_apn_list[i].apn_info.apn_name, apn_list.apns[i].apn, strlen((char*)apn_list.apns[i].apn));
+
+                    if(strlen((char*)apn_list.apns[i].user) > 0)
+                        memcpy(data_call_apn_list[i].apn_info.username, apn_list.apns[i].user, strlen((char*)apn_list.apns[i].user));
+
+                    if(strlen((char*)apn_list.apns[i].pass) > 0)
+                        memcpy(data_call_apn_list[i].apn_info.password, apn_list.apns[i].pass, strlen((char*)apn_list.apns[i].pass));
+
+                    i++;
+                }
+                return QL_ERR_OK;
+            }
+        } else {
+            LOGE("mbtk_info_handle_get() fail.");
+            return QL_ERR_UNKNOWN;
+        }
+    } else {
+        return QL_ERR_UNKNOWN;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Create a data call instance
+  @param[in] call_id The unique identifier of the data call instance, specified by the user
+  @param[in] call_name Friendly data call name,  specified by the user
+  @param[in] is_background Whether the data call status is maintained by the data call service daemon.
+  If it is 0, the data call instance will be deleted after the data call process exits.
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_create(int call_id, const char *call_name, int is_background)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(call_id <= 0 || call_name == NULL || strlen(call_name) == 0
+        || strlen(call_name) > QL_NET_MAX_NAME_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_state.call_id == 0) { // Not use.
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) { // data_call item full.
+        LOGW("data_call instance is full.");
+        return QL_ERR_UNKNOWN;
+    }
+
+    data_call_info[i].call_state.call_id = call_id;
+    memcpy(data_call_info[i].call_state.call_name, call_name, strlen(call_name));
+    data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CREATED;
+
+    data_call_info[i].is_background = is_background;
+    data_call_info[i].param_info = NULL;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Alloc for a data call configuration instance
+  @return
+  NULL - Not enough memory
+  Other - successful
+  */
+/*-----------------------------------------------------------------------------------------------*/
+ql_data_call_param_t *ql_data_call_param_alloc(void)
+{
+    ql_data_call_param_t *result = (ql_data_call_param_t*)malloc(sizeof(mbtk_data_call_param_info_t));
+    if(result) {
+        memset(result, 0, sizeof(mbtk_data_call_param_info_t));
+    }
+
+    return result;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_init(ql_data_call_param_t *param)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    memset(info, 0, sizeof(mbtk_data_call_param_info_t));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Release the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_free(ql_data_call_param_t *param)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    free(param);
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Bind APN ID, range:1-16
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_id APN ID, range:1-16
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_apn_id(ql_data_call_param_t *param, int apn_id)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    // 1 - 7
+    if(param == NULL || apn_id <= 0 || apn_id > QL_NET_MAX_APN_ID) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_apn_list[i].apn_id == apn_id) {
+            break;
+        }
+        i++;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param != NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    if(i == QL_NET_MAX_DATA_CALL_NUM) {
+        LOGW("No found apn_id : %d.", apn_id);
+        // Found next empty apn item.
+        int j = 0;
+        while(j < QL_NET_MAX_DATA_CALL_NUM) {
+            if(data_call_apn_list[j].apn_id <= 0) {
+                break;
+            }
+            j++;
+        }
+        if(j == QL_NET_MAX_DATA_CALL_NUM) { // Full
+            return QL_ERR_UNKNOWN;
+        }
+
+        info->apn_param = &(data_call_apn_list[j]);
+        info->apn_param->apn_id = apn_id;
+    } else {
+        // Found apn_id
+        info->apn_param = &(data_call_apn_list[i]);
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN ID
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_apn_id(ql_data_call_param_t *param, int *apn_id)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || apn_id == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    *apn_id = info->apn_param->apn_id;
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN name
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_name APN name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_apn_name(ql_data_call_param_t *param, const char *apn_name)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || apn_name == NULL || strlen(apn_name) == 0
+        || strlen(apn_name) > QL_NET_MAX_APN_NAME_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(info->apn_param->apn_info.apn_name, apn_name, strlen(apn_name));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN name buffer
+  @param[in] buf_len APN name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_apn_name(ql_data_call_param_t *param, char *buf, int buf_len)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || buf == NULL || buf_len <= 0) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    if(strlen(info->apn_param->apn_info.apn_name) + 1 > buf_len) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(buf, info->apn_param->apn_info.apn_name, strlen(info->apn_param->apn_info.apn_name));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user name
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_name APN user name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_user_name(ql_data_call_param_t *param, const char *user_name)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || user_name == NULL || strlen(user_name) == 0
+        || strlen(user_name) > QL_NET_MAX_APN_USERNAME_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(info->apn_param->apn_info.username, user_name, strlen(user_name));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user name buffer
+  @param[in] buf_len APN user name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_user_name(ql_data_call_param_t *param, char *buf, int buf_len)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || buf == NULL || buf_len <= 0) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    if(strlen(info->apn_param->apn_info.username) + 1 > buf_len) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(buf, info->apn_param->apn_info.username, strlen(info->apn_param->apn_info.username));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user password
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_password APN user password
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_user_password(ql_data_call_param_t *param, const char *user_password)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || user_password == NULL || strlen(user_password) == 0
+        || strlen(user_password) > QL_NET_MAX_APN_PASSWORD_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(info->apn_param->apn_info.password, user_password, strlen(user_password));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user password from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user password buffer
+  @param[in] buf_len APN user password buffer size
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_user_password(ql_data_call_param_t *param, char *buf, int buf_len)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || buf == NULL || buf_len <= 0) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    if(strlen(info->apn_param->apn_info.password) + 1 > buf_len) {
+        return QL_ERR_INVALID_ARG;
+    }
+    memcpy(buf, info->apn_param->apn_info.password, strlen(info->apn_param->apn_info.password));
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[in] auth_pref Defined by QL_DATA_CALL_AUTH_PREF_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_auth_pref(ql_data_call_param_t *param, int auth_pref)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    info->apn_param->apn_info.auth_pref = (QL_NET_AUTH_PREF_E)auth_pref;
+
+    return QL_ERR_OK;
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_data Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_auth_pref(ql_data_call_param_t *param, int *p_data)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || p_data == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    *p_data = info->apn_param->apn_info.auth_pref;
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call IP version
+  @param[in] param Point to the data call configuration instance
+  @param[in] ip_ver Defined by QL_NET_IP_VER_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_ip_version(ql_data_call_param_t *param, int ip_ver)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    info->apn_param->apn_info.ip_ver = (QL_NET_IP_VER_E)ip_ver;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get IP version from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_ver Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_ip_version(ql_data_call_param_t *param, int *p_ver)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || p_ver == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    if(info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+    *p_ver = info->apn_param->apn_info.ip_ver;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection mode
+  @param[in] param Point to the data call configuration instance
+  @param[in] mode Defined by QL_NET_DATA_CALL_RECONNECT_MODE_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_reconnect_mode(ql_data_call_param_t *param, int reconnect_mode)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    info->reconnect_mode = reconnect_mode;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection mode from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_mode Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_reconnect_mode(ql_data_call_param_t *param, int *p_mode)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || p_mode == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    *p_mode = info->reconnect_mode;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection interval
+  @param[in] param Point to the data call configuration instance
+  @param[in] time_list Interval time list in ms
+  @param[in] num Number of time list
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_set_reconnect_interval(ql_data_call_param_t *param, int *time_list, int num)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || time_list == NULL || num <= 0 || num > QL_NET_MAX_RECONNECT_INTERVAL_LEN) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    info->time_num = num;
+    memcpy(&(info->time_list), time_list, sizeof(int) * num);
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection interval from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] time_list Store return value
+  @param[in,out] p_num
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_param_get_reconnect_interval(ql_data_call_param_t *param, int *time_list, int *p_num)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL || time_list == NULL || p_num == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
+    *p_num = info->time_num;
+    int i = 0;
+    for(; i < info->time_num; i++) {
+        *(time_list + i) = info->time_list[i];
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the specified data call instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_config(int call_id, ql_data_call_param_t *param)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = call_index_get_by_call_id(call_id);
+    if(i < 0) {
+        LOGE("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    data_call_info[i].param_info = memdup(param, sizeof(mbtk_data_call_param_info_t));
+
+    if(data_call_info[i].param_info->apn_param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    snprintf(data_call_info[i].call_state.device, QL_NET_MAX_NAME_LEN, "ccinet%d",
+        data_call_info[i].param_info->apn_param->apn_id - 1);
+    data_call_info[i].call_state.ip_ver = data_call_info[i].param_info->apn_param->apn_info.ip_ver;
+
+    mbtk_apn_info_t apn_info;
+    memset(&apn_info, 0, sizeof(mbtk_apn_info_t));
+    // Set APN.
+    switch(data_call_info[i].param_info->apn_param->apn_info.ip_ver) {
+        case QL_NET_IP_VER_V4:
+            apn_info.ip_type = MBTK_IP_TYPE_IP;
+            break;
+        case QL_NET_IP_VER_V6:
+            apn_info.ip_type = MBTK_IP_TYPE_IPV6;
+            break;
+        case QL_NET_IP_VER_V4V6:
+            apn_info.ip_type = MBTK_IP_TYPE_IPV4V6;
+            break;
+        default:
+            LOGE("Unknown ip_ver.");
+            return QL_ERR_UNKNOWN;
+    }
+
+    switch(data_call_info[i].param_info->apn_param->apn_info.auth_pref) {
+        case QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED:
+            apn_info.auth = MBTK_APN_AUTH_PROTO_NONE;
+            break;
+        case QL_NET_AUTH_PREF_PAP_ONLY_ALLOWED:
+            apn_info.auth = MBTK_APN_AUTH_PROTO_PAP;
+            break;
+        case QL_NET_AUTH_PREF_CHAP_ONLY_ALLOWED:
+            apn_info.auth = MBTK_APN_AUTH_PROTO_CHAP;
+            break;
+#if 0
+        case QL_NET_AUTH_PREF_PAP_CHAP_BOTH_ALLOWED:
+            apninfo.auth_proto = MBTK_APN_AUTH_PROTO_PAP_CHAP;
+            break;
+#endif
+        default:
+            LOGE("Unknown auth_pref.");
+            return QL_ERR_UNKNOWN;
+    }
+
+    /*
+        data_call_info[i].param_info->apn_param->apn_id, ip_type,
+                data_call_info[i].param_info->apn_param->apn_info.apn_name,
+                data_call_info[i].param_info->apn_param->apn_info.username,
+                data_call_info[i].param_info->apn_param->apn_info.password, auth_type
+    */
+    apn_info.cid = (mbtk_ril_cid_enum)data_call_info[i].param_info->apn_param->apn_id;
+    apn_info.auto_save = (uint8)1;
+    apn_info.auto_boot_call = (uint8)0;
+    apn_info.def_route = (uint8)0;
+    apn_info.as_dns = (uint8)0;
+
+    if(strlen(data_call_info[i].param_info->apn_param->apn_info.apn_name) > 0) {
+        memcpy(apn_info.apn, data_call_info[i].param_info->apn_param->apn_info.apn_name,
+            strlen(data_call_info[i].param_info->apn_param->apn_info.apn_name));
+    }
+
+    if(strlen(data_call_info[i].param_info->apn_param->apn_info.username) > 0) {
+        memcpy(apn_info.user, data_call_info[i].param_info->apn_param->apn_info.username,
+            strlen(data_call_info[i].param_info->apn_param->apn_info.username));
+    }
+
+    if(strlen(data_call_info[i].param_info->apn_param->apn_info.password) > 0) {
+        memcpy(apn_info.pass, data_call_info[i].param_info->apn_param->apn_info.password,
+            strlen(data_call_info[i].param_info->apn_param->apn_info.password));
+    }
+
+    mbtk_ril_err_enum ret = mbtk_apn_set(ql_ril_handle, &apn_info);
+    if(ret) {
+        LOGE("mbtk_apn_set fail : %d", ret);
+        return QL_ERR_UNKNOWN;
+    } else {
+        return QL_ERR_OK;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the specified data call configuration instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_config(int call_id, ql_data_call_param_t *param)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(param == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = call_index_get_by_call_id(call_id);
+    if(i < 0) {
+        LOGE("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_info[i].param_info == NULL)
+    {
+        LOGE("param_info is NULL");
+        return QL_ERR_FAILED;
+    }
+    
+    memcpy(param, data_call_info[i].param_info, sizeof(mbtk_data_call_param_info_t));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Start data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_start(int call_id)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    int i = call_index_get_by_call_id(call_id);
+    if(i < 0) {
+        LOGE("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_info[i].param_info == NULL) {
+        LOGE("data_call_info[i].param_info is NULL.");
+        return QL_ERR_UNKNOWN;
+    }
+
+    int ret = data_call_state_query(data_call_info[i].param_info->apn_param->apn_id, &(data_call_info[i].call_state));
+    if(ret) {
+        LOGE("data_call_state_query fail.");
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_IDLE;
+        // return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_info[i].call_state.call_status == QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED
+        || data_call_info[i].call_state.call_status == QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED
+        || data_call_info[i].call_state.call_status == QL_NET_DATA_CALL_STATUS_CONNECTED) {
+        LOGW("call_id %d has connected.", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    LOGD("Start Data Call : %d", call_id);
+    // data_call_info_item_print(call_id);
+
+    // Start data call.
+//    int auto_conn_interval = 0;
+    QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
+    data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTING;
+    if(data_call_status_ind_cb) {
+        data_call_status_ind_cb(call_id, pre_call_status, &data_call_info[i].call_state);
+    }
+
+#if 0
+    if(data_call_info[i].param_info->reconnect_mode == QL_NET_DATA_CALL_RECONNECT_NORMAL
+        || data_call_info[i].param_info->reconnect_mode == QL_NET_DATA_CALL_RECONNECT_MODE_1
+        || data_call_info[i].param_info->reconnect_mode == QL_NET_DATA_CALL_RECONNECT_MODE_2) {
+        if(data_call_info[i].param_info->time_num > 0) {
+            auto_conn_interval = data_call_info[i].param_info->time_list[0];
+        }
+    } else {
+        auto_conn_interval = 0;
+    }
+#endif
+
+/*
+mbtk_ril_err_enum mbtk_data_call_start(mbtk_ril_handle* handle,
+mbtk_ril_cid_enum cid,
+mbtk_data_call_item_state_enum auto_boot_call,
+            mbtk_data_call_item_state_enum def_route, mbtk_data_call_item_state_enum as_dns,
+            int *retry_interval, int retry_interval_num,
+            int timeout, mbtk_ip_info_t *rsp_info);
+*/
+
+    mbtk_ip_info_t rsp_info;
+    memset(&rsp_info, 0, sizeof(mbtk_ip_info_t));
+    ret = mbtk_data_call_start(ql_ril_handle,
+            (mbtk_ril_cid_enum)data_call_info[i].param_info->apn_param->apn_id,
+            MBTK_DATA_CALL_ITEM_STATE_NON, MBTK_DATA_CALL_ITEM_STATE_NON, MBTK_DATA_CALL_ITEM_STATE_NON,
+            data_call_info[i].param_info->time_list, data_call_info[i].param_info->time_num,
+            0, &rsp_info);
+    if(ret) {
+        LOGE("mbtk_data_call_start fail.");
+        pre_call_status = data_call_info[i].call_state.call_status;
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_ERROR;
+        if(data_call_status_ind_cb) {
+            data_call_status_ind_cb(call_id, pre_call_status, &data_call_info[i].call_state);
+        }
+        return QL_ERR_UNKNOWN;
+    }
+
+    pre_call_status = data_call_info[i].call_state.call_status;
+    ret = data_call_status_update_by_ipv4v6(&rsp_info, &data_call_info[i].call_state);
+    if(ret) {
+        LOGE("data_call_status_update_by_ipv4v6() fail.");
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_ERROR;
+        if(data_call_status_ind_cb) {
+            data_call_status_ind_cb(call_id, pre_call_status, &data_call_info[i].call_state);
+        }
+        return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_status_ind_cb) {
+        data_call_status_ind_cb(call_id, pre_call_status, &data_call_info[i].call_state);
+    }
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Stop data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_stop(int call_id)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    int i = call_index_get_by_call_id(call_id);
+    if(i < 0) {
+        LOGE("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_info[i].param_info == NULL) {
+        LOGE("data_call_info[i].param_info is NULL.");
+        return QL_ERR_UNKNOWN;
+    }
+
+    int ret = mbtk_data_call_stop(ql_ril_handle, data_call_info[i].param_info->apn_param->apn_id, 15);
+    if(ret) {
+        LOGE("mbtk_data_call_stop() fail.");
+        return QL_ERR_UNKNOWN;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Delete a data call instance
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_delete(int call_id)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    int i = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_state.call_id == call_id) {
+            break;
+        }
+        i++;
+    }
+
+    if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this call_id.
+        LOGW("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_info[i].param_info) {
+        free(data_call_info[i].param_info);
+        data_call_info[i].param_info = NULL;
+    }
+    memset(&(data_call_info[i]), 0, sizeof(ql_data_call_info_t));
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the current data call instance list
+  @param[out] list Data call instance array
+  @param[in,out] list_len, in-> Data call instance array size, out->current data call instance number
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_list(ql_data_call_item_t *list, int *list_len)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(list == NULL || list_len == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int i = 0;
+    *list_len = 0;
+    while(i < QL_NET_MAX_DATA_CALL_NUM) {
+        if(data_call_info[i].call_state.call_id > 0) {
+            memset(&(list[*list_len]), 0, sizeof(ql_data_call_item_t));
+            list[*list_len].call_id = data_call_info[i].call_state.call_id;
+            memcpy(list[*list_len].call_name, data_call_info[i].call_state.call_name,
+                strlen(data_call_info[i].call_state.call_name));
+
+            (*list_len)++;
+        }
+        i++;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the data call status
+  @param[in] call_id Specify a data call instance
+  @param[out] p_sta Point to status instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_status(int call_id, ql_data_call_status_t *p_sta)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    int i = call_index_get_by_call_id(call_id);
+    if(i < 0) {
+        LOGE("Unknown call_id : %d", call_id);
+        return QL_ERR_UNKNOWN;
+    }
+
+    if(data_call_info[i].param_info == NULL || p_sta == NULL) {
+        LOGE("data_call_info[i].param_info is NULL.");
+        return QL_ERR_UNKNOWN;
+    }
+
+    int ret = data_call_state_query(data_call_info[i].param_info->apn_param->apn_id, &(data_call_info[i].call_state));
+    if(ret) {
+        LOGE("data_call_state_query fail.");
+        data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_IDLE;
+        memcpy(p_sta, &(data_call_info[i].call_state), sizeof(ql_data_call_status_t));
+        return QL_ERR_UNKNOWN;
+    } else {
+        memcpy(p_sta, &(data_call_info[i].call_state), sizeof(ql_data_call_status_t));
+        return QL_ERR_OK;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Register data call status change event
+  @param[in] cb
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_status_ind_cb(ql_data_call_status_ind_cb_f cb)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_UNKNOWN;
+    } else {
+        if(mbtk_pdp_state_change_cb_reg(data_call_state_change_cb))
+        {
+            return QL_ERR_UNKNOWN;
+        }
+
+        data_call_status_ind_cb = cb;
+        return QL_ERR_OK;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set APN related configuration.If the apn does not exist, it is automatically created.
+  @param[in] apn_id APN ID, range:1-16
+  @param[in] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_apn_config(int apn_id, ql_data_call_apn_config_t *p_info)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(p_info == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_apn_info_t apn_info;
+    memset(&apn_info, 0, sizeof(mbtk_apn_info_t));
+    // Set APN.
+    switch(p_info->ip_ver) {
+        case QL_NET_IP_VER_V4:
+            apn_info.ip_type = MBTK_IP_TYPE_IP;
+            break;
+        case QL_NET_IP_VER_V6:
+            apn_info.ip_type = MBTK_IP_TYPE_IPV6;
+            break;
+        case QL_NET_IP_VER_V4V6:
+            apn_info.ip_type = MBTK_IP_TYPE_IPV4V6;
+            break;
+        default:
+            LOGE("Unknown ip_ver.");
+            return QL_ERR_UNKNOWN;
+    }
+
+    switch(p_info->auth_pref) {
+        case QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED:
+            apn_info.auth = MBTK_APN_AUTH_PROTO_NONE;
+            break;
+        case QL_NET_AUTH_PREF_PAP_ONLY_ALLOWED:
+            apn_info.auth = MBTK_APN_AUTH_PROTO_PAP;
+            break;
+        case QL_NET_AUTH_PREF_CHAP_ONLY_ALLOWED:
+            apn_info.auth = MBTK_APN_AUTH_PROTO_CHAP;
+            break;
+#if 0
+        case QL_NET_AUTH_PREF_PAP_CHAP_BOTH_ALLOWED:
+            apninfo.auth_proto = MBTK_APN_AUTH_PROTO_PAP_CHAP;
+            break;
+#endif
+        default:
+            LOGE("Unknown auth_pref.");
+            return QL_ERR_UNKNOWN;
+    }
+
+    /*
+        data_call_info[i].param_info->apn_param->apn_id, ip_type,
+                data_call_info[i].param_info->apn_param->apn_info.apn_name,
+                data_call_info[i].param_info->apn_param->apn_info.username,
+                data_call_info[i].param_info->apn_param->apn_info.password, auth_type
+    */
+    apn_info.cid = (mbtk_ril_cid_enum)apn_id;
+    apn_info.auto_save = (uint8)1;
+    apn_info.auto_boot_call = (uint8)0;
+    apn_info.def_route = (uint8)0;
+    apn_info.as_dns = (uint8)0;
+
+    if(strlen(p_info->apn_name) > 0) {
+        memcpy(apn_info.apn, p_info->apn_name, strlen(p_info->apn_name));
+    }
+
+    if(strlen(p_info->username) > 0) {
+        memcpy(apn_info.user, p_info->username, strlen(p_info->username));
+    }
+
+    if(strlen(p_info->password) > 0) {
+        memcpy(apn_info.pass, p_info->password, strlen(p_info->password));
+    }
+
+    mbtk_ril_err_enum ret = mbtk_apn_set(ql_ril_handle, &apn_info);
+    if(ret) {
+        LOGE("mbtk_apn_set fail : %d", ret);
+        return QL_ERR_UNKNOWN;
+    } else {
+        return QL_ERR_OK;
+    }
+
+    if(ret) {
+        LOGE("mbtk_apn_set fail.");
+        return QL_ERR_UNKNOWN;
+    } else {
+
+        // Save to data_call_apn_list
+        int i = 0;
+        while(i < QL_NET_MAX_DATA_CALL_NUM) {
+            if(data_call_info[i].param_info && data_call_info[i].param_info->apn_param
+                && data_call_info[i].param_info->apn_param->apn_id == apn_id) {
+                break;
+            }
+            i++;
+        }
+
+        if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this apn_id.
+            LOGW("New apn_id : %d", apn_id);
+            // New data call param.
+            int j = 0;
+            while(j < QL_NET_MAX_DATA_CALL_NUM) {
+                if(data_call_apn_list[j].apn_id <= 0) {
+                    break;
+                }
+                j++;
+            }
+
+            if(j == QL_NET_MAX_DATA_CALL_NUM) { // Full
+                LOGW("data_call_apn_param_list is full.");
+                return QL_ERR_UNKNOWN;
+            }
+
+            data_call_apn_list[j].apn_id = apn_id;
+            memcpy(&(data_call_apn_list[j].apn_info), p_info, sizeof(ql_data_call_apn_config_t));
+        } else {
+            memcpy(&(data_call_info[i].param_info->apn_param->apn_info), p_info, sizeof(ql_data_call_apn_config_t));
+        }
+
+
+        return QL_ERR_OK;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set APN related configuration. If the apn does not exist, it is automatically created and
+  the default parameters are set.
+  @param[in] apn_id APN ID, range:1-16
+  @param[out] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_get_apn_config(int apn_id, ql_data_call_apn_config_t *p_info)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_SERVICE_NOT_READY;
+    }
+
+    if(p_info == NULL) {
+        return QL_ERR_INVALID_ARG;
+    }
+
+    memset(p_info, 0, sizeof(ql_data_call_apn_config_t));
+
+    mbtk_apn_info_array_t apns;
+    memset(&apns, 0, sizeof(mbtk_apn_info_array_t));
+    int ret = mbtk_apn_get(ql_ril_handle, &apns);
+    if(ret) {
+        LOGE("mbtk_apn_get fail.");
+        return QL_ERR_UNKNOWN;
+    } else {
+        int i = 0;
+        while(i < apns.num) {
+            if(apns.apns[i].cid == apn_id)
+                break;
+            i++;
+        }
+        if(i == apns.num) {
+            LOGE("No found apn_id : %d", apn_id);
+            return QL_ERR_UNKNOWN;
+        }
+
+        switch(apns.apns[i].ip_type) {
+            case MBTK_IP_TYPE_IP:
+                p_info->ip_ver = QL_NET_IP_VER_V4;
+                break;
+            case MBTK_IP_TYPE_IPV6:
+                p_info->ip_ver = QL_NET_IP_VER_V6;
+                break;
+            case MBTK_IP_TYPE_IPV4V6:
+                p_info->ip_ver = QL_NET_IP_VER_V4V6;
+                break;
+            default:
+                LOGE("Unknown ip_ver.");
+                return QL_ERR_UNKNOWN;
+        }
+
+        if(apns.apns[i].auth == MBTK_APN_AUTH_PROTO_NONE) {
+            p_info->auth_pref = QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED;
+        } else if(apns.apns[i].auth == MBTK_APN_AUTH_PROTO_PAP) {
+            p_info->auth_pref = QL_NET_AUTH_PREF_PAP_ONLY_ALLOWED;
+        } else if(apns.apns[i].auth == MBTK_APN_AUTH_PROTO_CHAP) {
+            p_info->auth_pref = QL_NET_AUTH_PREF_CHAP_ONLY_ALLOWED;
+        } else {
+            LOGE("Unknown auth_pref : %s", apns.apns[i].auth);
+            return QL_ERR_UNKNOWN;
+        }
+
+        if(strlen((char*)apns.apns[i].apn) > 0)
+            memcpy(p_info->apn_name, apns.apns[i].apn, strlen((char*)apns.apns[i].apn));
+
+        if(strlen((char*)apns.apns[i].user) > 0)
+            memcpy(p_info->username, apns.apns[i].user, strlen((char*)apns.apns[i].user));
+
+        if(strlen((char*)apns.apns[i].pass) > 0)
+            memcpy(p_info->password, apns.apns[i].pass, strlen((char*)apns.apns[i].pass));
+
+        return QL_ERR_OK;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set APN related configuration,APN ID:1
+  @param[in] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_attach_apn_config(ql_data_call_apn_config_t *p_info)
+{
+    return ql_data_call_set_apn_config(1, p_info);
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally,
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_set_service_error_cb(ql_data_call_service_error_cb_f cb)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_UNKNOWN;
+    } else {
+        if(mbtk_ril_ser_state_change_cb_reg(ril_server_state_cb))
+        {
+            return QL_ERR_UNKNOWN;
+        }
+
+        data_call_service_error_cb = cb;
+        return QL_ERR_OK;
+    }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize the data call service
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_data_call_deinit(void)
+{
+    if(ql_ril_handle == NULL)
+    {
+        return QL_ERR_UNKNOWN;
+    } else {
+        if(mbtk_ril_close(MBTK_AT_PORT_DEF))
+        {
+            return QL_ERR_UNKNOWN;
+        }
+
+        return QL_ERR_OK;
+    }
+}
diff --git a/mbtk/libql_lib_v2_rilv2/ql_dm.c b/mbtk/libql_lib_v2_rilv2/ql_dm.c
new file mode 100755
index 0000000..867c4fd
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_dm.c
@@ -0,0 +1,882 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_dm.h 
+  @brief device management API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200316   stan.li      Optimize the ql_dm_get_modem_state interface
+  20191224   stan.li      Add radio on/off API
+  20190625   stan.li      Created .
+-------------------------------------------------------------------------------------------------*/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <pthread.h>
+
+#include "mbtk_ril_api.h"
+#include "ql_type.h"
+#include "ql_dm.h"
+
+
+
+#define LYNQ_AIR_PLANE_MODE_ON      4    //at+cfun = 4
+#define LYNQ_AIR_PLANE_MODE_OFF     1   // at+cfun = 1
+
+
+#define MBTK_RILD_ERR      -1
+#define IMEI_VALID          1
+
+static mbtk_ril_handle* ql_info_handle = NULL;
+static mbtk_ril_handle* g_md_version_handle = NULL;
+
+static ql_dm_air_plane_mode_ind_cb g_air_plane_mode_cb = NULL;
+static ql_dm_service_error_cb_f global_dm_error_cb = NULL;
+static ql_dm_modem_state_ind_cb global_dm_modem_cb = NULL;
+
+
+static pthread_t g_air_plane_mode_thread;
+static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;
+static bool g_thread_running = false;
+
+
+static void mbtk_send_singnal()
+{
+    pthread_mutex_lock(&g_mutex);
+    pthread_cond_signal(&g_cond);
+    pthread_mutex_unlock(&g_mutex);
+
+}
+
+static void mbtk_dm_set_service_error_func(const void* data,int data_len)
+{
+    if(data !=NULL && data_len == sizeof(int))
+    {
+        const int *state = (const int*)(data);
+        if(*state)
+        {
+            if(global_dm_error_cb)
+            {
+                global_dm_error_cb(MBTK_RILD_ERR);
+            }
+
+        }
+    }
+        
+}
+
+static void mbtk_modem_state_change_cb(const void* data, int data_len)
+{
+    uint8 *ptr = (uint8*)data;
+    if(global_dm_modem_cb)
+    {
+        global_dm_modem_cb(*ptr);
+    }
+    
+}
+
+void* air_plane_mode_monitor(void* arg) 
+{
+    int ql_info = 0;
+    int ret = -1;
+    mbtk_radio_state_enum mbtk_info;
+
+    while (g_thread_running) 
+    {
+        pthread_mutex_lock(&g_mutex);
+        pthread_cond_wait(&g_cond, &g_mutex); 
+        ret = mbtk_radio_state_get(ql_info_handle, &mbtk_info);
+        if (ret != 0)
+        {
+            LOGE("mbtk_radio_state_get fail.");
+            return NULL;
+        }
+        
+        if(mbtk_info == LYNQ_AIR_PLANE_MODE_OFF)
+        {
+            ql_info = QL_DM_AIR_PLANE_MODE_OFF;
+        }
+        
+        if(mbtk_info == LYNQ_AIR_PLANE_MODE_ON)
+        {
+            ql_info = QL_DM_AIR_PLANE_MODE_ON;
+        }
+        
+        if(mbtk_info != LYNQ_AIR_PLANE_MODE_OFF && mbtk_info !=LYNQ_AIR_PLANE_MODE_ON)
+        {
+            
+            ql_info = QL_DM_AIR_PLANE_MODE_UNKNOWN;
+        }
+       
+        if(g_air_plane_mode_cb) 
+        {
+            
+            g_air_plane_mode_cb(ql_info);
+        }
+
+        pthread_mutex_unlock(&g_mutex);
+    }
+
+    return NULL;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize DM service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the DM service was successfully intialized.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+int ql_dm_init(void)
+{
+    
+    if(ql_info_handle == NULL)
+    {
+
+        mbtk_log_init("syslog", "QL_DM");
+
+        ql_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+        if(ql_info_handle)
+        {
+           
+            return QL_ERR_OK;
+        } 
+        else 
+        {
+            LOGE("mbtk_info_handle_get() fail.");
+            return QL_ERR_FAILED;
+        }
+
+     }
+     else
+     {
+        LOGE("No need init again");
+        return QL_ERR_FAILED;
+     }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Denitialize DM service.
+  @return Whether the DM service was successfully deintialized.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_deinit(void)
+{
+    if(ql_info_handle)
+    {
+    
+        int ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if(ret != 0) 
+        {
+            LOGE("mbtk_info_handle_free fail.");
+            return QL_ERR_FAILED;
+        }
+        else 
+        {
+            LOGI("mbtk_info_handle_free success");
+            return QL_ERR_OK;
+        }
+    }
+    else
+    {
+        LOGE("DM not inited.");
+        return QL_ERR_NOT_INIT;
+    }
+   
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device software version.
+  @param[out] soft_ver Return software version
+  @param[in] soft_ver_len The length of soft_ver
+  @return Whether to successfully get the software version
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+int ql_dm_get_software_version(char *soft_ver, int soft_ver_len)
+{
+
+    int ret = -1;
+    if(soft_ver == NULL || soft_ver_len <= 0)
+    {
+         LOGE("Bad parameters  ");
+         return QL_ERR_FAILED;
+    }
+    if(ql_info_handle != NULL)
+    {
+    
+        ret = mbtk_version_get(ql_info_handle,soft_ver);
+        if(ret != 0)
+        {
+            LOGE("ql_dm_get_software_version  error.");
+            return QL_ERR_FAILED;
+        }
+    }
+    else
+    {
+        mbtk_ril_handle* mbtk_info_handle = NULL;
+        mbtk_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+        if(mbtk_info_handle == NULL)
+        {
+            LOGE("mbtk_info_handle_get fail.");
+            return QL_ERR_FAILED;
+        }
+        ret = mbtk_version_get(mbtk_info_handle,soft_ver);
+        if(ret != 0)
+        {
+            LOGE("ql_dm_get_software_version  error.");
+            
+        }
+        ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if(ret != 0) 
+        {
+            LOGE("mbtk_info_handle_free fail.");
+            return QL_ERR_FAILED;
+        }
+        
+    }
+    return QL_ERR_OK;
+    
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem state.
+  @details QL_DM_MODEM_STATE_ONLINE,if modem starts normally.
+  @details QL_DM_MODEM_STATE_OFFLINE,in modem starts abnormally.
+  @details QL_DM_MODEM_STATE_UNKNOWN,unknown error.
+  @param[out] modem_state The state of modem
+  @return Whether to successfully get the modem state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_modem_state(QL_DM_MODEM_STATE_TYPE_E *modem_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register modem state event.
+  @param[in] cb_func modem state indication callback function
+  @return Whether the modem state event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+int ql_dm_set_modem_state_change_ind_cb(ql_dm_modem_state_ind_cb cb_func)
+{
+    
+        int ret =-1;
+        
+        global_dm_modem_cb = cb_func;
+        
+        if(ql_info_handle != NULL)
+        {
+            
+            ret = mbtk_radio_state_change_cb_reg(mbtk_modem_state_change_cb);
+            if(ret != 0)
+            {
+                LOGE("call mbtk_radio_state_change_cb_reg failed");
+                return QL_ERR_FAILED;
+            }
+        }
+        else 
+        {
+            if(g_md_version_handle == NULL)
+            {
+                g_md_version_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+                if(g_md_version_handle == NULL)
+                {
+                    LOGE("g_md_version_handle get fail.");
+                    return QL_ERR_FAILED;
+                }
+            }
+            
+            ret = mbtk_radio_state_change_cb_reg(mbtk_modem_state_change_cb);
+            if(ret != 0)
+            {
+                
+                ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+                if(ret < 0) 
+                {
+                    LOGE("mbtk_info_handle_free fail.");
+                    return QL_ERR_FAILED;
+                }
+                
+                LOGE("call mbtk_radio_state_change_cb_reg failed");
+                return QL_ERR_FAILED;
+            }
+            
+        }
+        
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get module temperature.
+  @param[out] temperature The current temperature
+  @return Whether to successfully get the temperature
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_temperature(float *temperature);
+
+    
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device serial numbers.
+  @param[out] p_info Pointer that point to ql_dm_device_serial_numbers_info_t
+  @return Whether to successfully get the serial numbers
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_device_serial_numbers(ql_dm_device_serial_numbers_info_t *p_info)
+{
+    int ret = -1;
+    if(ql_info_handle == NULL )
+    {
+        LOGE("DM no init");
+        return QL_ERR_NOT_INIT;
+    }
+    
+    ret = mbtk_imei_get(ql_info_handle, p_info->imei);
+    if(ret != 0) 
+    {
+        LOGE("Error : %d\n", ret);
+        return QL_ERR_FAILED;
+    } 
+    if(strlen(p_info->imei) > 0)
+    {
+        p_info->imei_valid = IMEI_VALID;
+    }
+
+
+    return QL_ERR_OK;
+  
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device firmware revision identification.
+  @param[out] firmware_rev_id Return device firmware revision id
+  @param[in] firmware_rev_id_len The length of firmware_rev_id
+  @return Whether to successfully get the firmware revision id
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_device_firmware_rev_id(char *firmware_rev_id, int firmware_rev_id_len)
+{
+    int ret = -1;
+    
+    if(ql_info_handle == NULL)
+    {
+        LOGE("DM no init");
+        return QL_ERR_NOT_INIT;
+    }
+    
+    //ret = mbtk_get_modem_version(ql_info_handle, (void *)firmware_rev_id);
+    //mbtk_v2 do not have function
+    ret = -1;
+    if(ret < 0)
+    {
+        LOGE("get modem version failed");
+        return QL_ERR_FAILED;
+    }
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get air plane mode.
+  @param[out] p_info Pointer that point to QL_DM_AIR_PLANE_MODE_TYPE_E
+  @return Whether to successfully get the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_air_plane_mode(QL_DM_AIR_PLANE_MODE_TYPE_E *p_info)
+{
+    
+    int ret = -1;
+    mbtk_radio_state_enum tmp_rf;
+    if(ql_info_handle == NULL)
+    {
+        LOGE("DM no init");
+        return QL_ERR_NOT_INIT;
+    }
+    ret = mbtk_radio_state_get(ql_info_handle, &tmp_rf);
+    if (ret != 0)
+    {
+        LOGE("mbtk_radio_state_get fail.");
+        return QL_ERR_FAILED;
+    }
+    if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
+    {
+        *p_info = QL_DM_AIR_PLANE_MODE_OFF;
+    }
+    else if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
+    {
+        *p_info = QL_DM_AIR_PLANE_MODE_ON;
+    }
+        
+    return 0;
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set air plane mode.
+  @param[in] air_plane_mode 1:ON, 2:OFF
+  @return Whether to successfully set the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+
+int ql_dm_set_air_plane_mode(QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode)
+{
+    mbtk_radio_state_enum radio = MBTK_RADIO_STATE_MINI_FUNC;
+    int reset = 0;
+    int rf_mode = -1;
+    int ret = -1;
+    
+    if(ql_info_handle == NULL)
+    {
+        LOGE("DM no init");
+        return QL_ERR_NOT_INIT;
+    }
+    if(air_plane_mode == QL_DM_AIR_PLANE_MODE_ON)
+    {
+        rf_mode = LYNQ_AIR_PLANE_MODE_ON;
+    }
+    
+    if(air_plane_mode == QL_DM_AIR_PLANE_MODE_OFF)
+    {
+        rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
+
+    }
+    
+    if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF) 
+    {
+        LOGE("Input mode is error!");
+        return QL_ERR_OP_UNSUPPORTED;
+    }
+
+    
+    ret = mbtk_radio_state_set(ql_info_handle, radio, reset);
+    if(ret != 0)
+    {
+        LOGE("ql_dm_set_air_plane_mode failed");
+    }
+    mbtk_send_singnal();
+    return QL_ERR_OK;
+
+
+}
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register air plane mode event.
+  @param[in] cb_func Air plane mode indication callback function
+  @return Whether the air plane mode event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+int ql_dm_set_air_plane_mode_ind_cb(ql_dm_air_plane_mode_ind_cb cb_func) 
+{
+    if(ql_info_handle == NULL)
+    {
+        LOGE("No init ");
+        return QL_ERR_NOT_INIT;
+    }
+    
+    g_air_plane_mode_cb = cb_func;
+
+    if (!g_thread_running) 
+    {
+        g_thread_running = true;
+        if (pthread_create(&g_air_plane_mode_thread, NULL, air_plane_mode_monitor, NULL) != 0) 
+        {
+            LOGE("Failed to create air plane mode monitor thread");
+            g_thread_running = false;
+            return QL_ERR_FAILED;
+        }
+    }
+    
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get cpu occupancy.
+  @param[out] cpu_occupancy The percentage of cpu occupancy
+  @return Whether to successfully get the cpu occupancy
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_cpu_occupancy(float *cpu_occupancy);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get mem usage.
+  @param[out] mem_use The percentage of mem usage
+  @return Whether to successfully get the memory usage
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_mem_usage(float *mem_use);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get NV item value.
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[out] nv_item_value The NV value buf of nv_item_name
+  param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully get the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len, 
+        int *nv_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set NV item value.
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[in] nv_item_value The NV value of nv_item_name
+  @param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully set the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len, 
+        int *nv_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio on, its function is the same as at+cfun=1.
+  @return Whether to successfully set the radio on
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_radio_on(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio off, its function is the same as at+cfun=0.
+  @return Whether to successfully set the radio off
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_radio_off(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem mem and CPU utilization.
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_modem_cpu_occupancy(float *cpu_occupancy);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem mem utilization.
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_modem_mem_usage(float *mem_use);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS enable state
+  @param[out] enable The enable state of QOOS
+  @return Whether to successfully get the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_qoos_enable(char *enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS enable state
+  @param[in] enable The enable state of QOOS
+  @return Whether to successfully set the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_qoos_enable(char enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS configuration
+  @param[out] config The configuration of QOOS
+  @return Whether to successfully get the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_dm_get_qoos_config(ql_dm_qoos_config_t *config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS configuration
+  @param[in] config The configuration of QOOS
+  @return Whether to successfully set the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_dm_set_qoos_config(ql_dm_qoos_config_t config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get MSSR(Modem SubSysem Reset) level.
+  @param[out] p_level The MSSR level
+  @return Whether to successfully get the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_mssr_level(int *p_level);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set MSSR(Modem SubSysem Reset) level.
+  @param[in] level The MSSR level
+  @return Whether to successfully set the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_mssr_level(int level);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  bind subscription 
+  @param[in] sub_type subscription type 
+  @return Whether to successfully bind subscription.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_bind_subscription(QL_DM_BIND_SUB_TYPE_E sub_type);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_service_error_cb(ql_dm_service_error_cb_f cb)
+{
+    int ret = -1;
+    if(ql_info_handle == NULL)
+    {
+        LOGE("DM no init ");
+        return QL_ERR_NOT_INIT;
+
+    }
+    global_dm_error_cb = cb;
+    ret = mbtk_ril_ser_state_change_cb_reg(mbtk_dm_set_service_error_func);
+    if(ret != 0)
+    {
+        LOGE("call mbtk_ril_server_state_change_reg failed");
+        return QL_ERR_FAILED;
+    }
+    
+    return QL_ERR_OK;
+}
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get module the last time shutdown reason 
+  @param[out] shutdown_reason the shutdown reason
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_shutdown_reason(QL_DM_SHUTDOWN_REASON_E *shutdown_reason);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get module this time bootup reason 
+  @param[out] bootup_reason the bootup reason
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_bootup_reason(QL_DM_BOOT_UP_REASON_E *bootup_reason);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set oos config 
+  @param[out] oos param
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_qoos_config(int p1, int p2, int p3);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief get oos config 
+  @param[out] oos param
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_qoos_config(int *p1, int *p2, int *p3);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set oos enable 
+  @param[out] oos param
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_qoos_enable(char enable);
+#ifdef __cplusplus
+}
+#endif
+
+
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_ecall.c b/mbtk/libql_lib_v2_rilv2/ql_ecall.c
new file mode 100755
index 0000000..0d77b7d
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_ecall.c
Binary files differ
diff --git a/mbtk/libql_lib_v2_rilv2/ql_fota.c b/mbtk/libql_lib_v2_rilv2/ql_fota.c
new file mode 100755
index 0000000..ebcd03c
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_fota.c
@@ -0,0 +1,123 @@
+/**  
+  @file
+  ql_fota.h
+
+  @brief
+  This file provides the definitions for device, and declares the 
+  API functions.
+
+*/
+/*============================================================================
+  Copyright (c) 2017 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+ =============================================================================*/
+/*===========================================================================
+
+                        EDIT HISTORY FOR MODULE
+
+This section contains comments describing changes made to the module.
+Notice that changes are listed in reverse chronological order.
+
+
+WHEN        WHO            WHAT, WHERE, WHY
+----------  ------------   ----------------------------------------------------
+25/11/2021  jessie.lei      create
+=============================================================================*/
+#ifndef __QL_FOTA_H__
+#define __QL_FOTA_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "fota_info.h"
+
+/*
+ * callback function define, used to get upgrade state and rate of process
+ */
+typedef int(*ql_fota_cb_f)(int state, int percent);
+
+
+/*******************************************************************************
+* @brief fota initialize
+  @param 
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_init(void);
+
+
+/*******************************************************************************
+* @brief fota de-initialize
+  @param 
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_deinit(void);
+
+
+/*******************************************************************************
+* @brief set fota callback
+  @param 
+    cb: callback function
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_set_cb(ql_fota_cb_f cb);
+
+
+/*******************************************************************************
+* @brief fota initialize
+  @param 
+    otasize: The OTA firmware size
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_start(unsigned int otasize);
+
+
+/*******************************************************************************
+* @brief write fota firmware data
+  @param 
+    buffer: The buffer 
+    size  : Data length in buffer
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_write(unsigned char *buffer, unsigned int size);
+
+
+/*******************************************************************************
+* @brief get fota state
+  @param 
+    state: fota state, refer to fota_state_t
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_get_state(fota_state_t *state);
+
+
+/*******************************************************************************
+* @brief set fota state
+  @param 
+    state: fota state, refer to fota_state_t
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_set_state(fota_state_t state);
+
+
+/*******************************************************************************
+* @brief finish fota process
+  @param 
+  @return 
+        if success return 0, else return -1
+ *******************************************************************************/
+int ql_fota_done(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //__QL_FOTA_H__
diff --git a/mbtk/libql_lib_v2_rilv2/ql_fota_api.c b/mbtk/libql_lib_v2_rilv2/ql_fota_api.c
new file mode 100755
index 0000000..9b833da
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_fota_api.c
@@ -0,0 +1,133 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "ql_fota_api.h"
+#include "mbtk_type.h"
+#include "mbtk_fota.h"
+#include "mbtk_log.h"
+#include "mbtk_utils.h"
+
+unsigned int Process_flag = 0;
+char addr_buf[128]={0};
+int segment_size =0;
+
+#define StatFunc(x,y) stat(x,y)
+
+int funstat(  char *filename)
+{
+    int ret = 0;
+    struct stat tmep_s;
+
+    memset(&tmep_s, 0, sizeof(stat));
+    ret = StatFunc(filename, &tmep_s);
+
+    if (ret)
+    {
+        LOGE("stat %s failed! error_code: %s", filename ,strerror(errno));
+        return -1;
+    }
+
+    if (tmep_s.st_size > 0)
+    {
+        segment_size = tmep_s.st_size;
+    }
+
+    return 0;
+}
+
+
+int ql_fota_cb(int status, int percent)
+{
+    LOGE("%d: percent: %d%%\n", percent/10, percent);
+    Process_flag = percent;
+    return 0;
+}
+
+int ql_abfota_start_update(const char *package_path)
+{
+    LOGI("%s, %d", __FUNCTION__, __LINE__);
+    int ret = 0;
+    int len = 0;
+
+    ret = mbtk_fota_init(ql_fota_cb);
+    if (ret)
+    {
+        LOGE("ql_abfota_start_update init fail");
+        return -1;
+    }
+
+    memset(addr_buf, 0, sizeof(addr_buf));
+    sprintf(addr_buf, "%supdata.bin", package_path);
+    len = strlen(addr_buf);
+    if (len > 127)
+    {
+        LOGE("ql_abfota_start_update get package_path fail");
+        return -1;
+    }
+
+    if(strncmp(addr_buf, "http", 4) == 0)
+    {
+        segment_size = 62914560;
+        ret = mbtk_fota_fw_write_by_url(addr_buf, segment_size,10, 600);
+    }
+    else
+    {
+        /*获取升级文件的大小*/
+        ret = funstat(addr_buf);
+        if (ret)
+        {
+            LOGE("ql_abfota_start_update get segment_size fail");
+            return -1;
+        }
+
+        LOGI("addr_buf:%s, segment_size:%d", addr_buf, segment_size);
+        ret = mbtk_fota_fw_write(addr_buf, segment_size);
+    }
+
+    if (ret)
+    {
+        LOGE("ql_abfota_start_update fail");
+        return -1;
+    }
+
+    mbtk_system("sync");
+
+    return 0;
+}
+
+int ql_abfota_get_update_status(update_info_t * update_info)
+{
+    int fota_t;
+
+    fota_t = mbtk_fota_status();
+
+    if (fota_t == 3)
+    {
+        update_info->ota_state = UPDATE;
+        update_info->percentage = Process_flag;
+        update_info->exit_code = E_UPDATE_PACKAGE_NOEXIST;
+    }
+    else if (fota_t == 4)
+    {
+        update_info->ota_state = WRITEDONE;
+        update_info->percentage = Process_flag;
+        update_info->exit_code = E_NO_ERROR;
+    }
+    else if (fota_t == 5)
+    {
+        update_info->ota_state = FAILED;
+        update_info->percentage = Process_flag;
+        update_info->exit_code = E_WRITE_SEG_FAILED;
+    }
+    else if (fota_t == -1)
+    {
+        LOGE("ql_abfota_get_update_status fail");
+        return -1;
+    }
+
+    return 0;
+}
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_fota_common.c b/mbtk/libql_lib_v2_rilv2/ql_fota_common.c
new file mode 100755
index 0000000..1a0cb90
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_fota_common.c
@@ -0,0 +1,48 @@
+
+/**
+  @file
+  ql_fota_common.h
+
+  @brief
+  This file provides the definitions for common functions, and declares the
+  common functions.
+
+*/
+/*============================================================================
+  Copyright (c) 2017 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+ =============================================================================*/
+/*===========================================================================
+
+                        EDIT HISTORY FOR MODULE
+
+This section contains comments describing changes made to the module.
+Notice that changes are listed in reverse chronological order.
+
+
+WHEN        WHO            WHAT, WHERE, WHY
+----------  ------------   ----------------------------------------------------
+23/08/2019  Nebula.li      create
+=============================================================================*/
+
+#ifndef __QL_FOTA_COMMON_H
+#define __QL_FOTA_COMMON_H
+
+#include <stdint.h>
+
+#define QL_OTAD_CLIENT_INIT_CNT_MAX  20
+
+#define QL_OTAD_SEND_MSG_TIMEOUT     (3 * 1000)
+
+typedef void (*ql_otad_service_error_cb_f)(int error);
+
+int ql_otad_client_init(void);
+int ql_otad_client_release(void);
+int ql_otad_send_msg_sync(int32_t msg_id, 
+                          void *p_req_msg_data,
+                          uint32_t req_msg_data_len,
+                          void *p_resp_msg_data,
+                          uint32_t resp_msg_data_len,
+                          uint32_t timeout);
+
+#endif  /* __QL_FOTA_COMMON_H */
diff --git a/mbtk/libql_lib_v2_rilv2/ql_gnss.c b/mbtk/libql_lib_v2_rilv2/ql_gnss.c
new file mode 100755
index 0000000..85322e3
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_gnss.c
@@ -0,0 +1,879 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_gnss.c
+  @brief SIM service API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+
+#include "ql_type.h"
+#include "ql_gnss.h"
+#include "mbtk_type.h"
+#include "mbtk_gnss.h"
+#include "mbtk_log.h"
+
+/*----------------------------------------------DEFINE-------------------------------------------*/
+#define QL_GNSS_LOGE LOGE
+#define QL_GNSS_LOGD LOGD
+
+#define QL_GNSS_TIMEOUT 5
+#define QL_GNSS_NMEA_SIZE_MAX 128
+#define QL_GNSS_AGPS_URL_SIZE_MAX 128
+
+#define QL_AGNSS_DOWNLOAD_TIMEPUT 60
+#define QL_AGNSS_INJECT_TIMEOUT 20
+
+#define QL_AGNSS_URL_PATH "http://uagnss.allystar.com:80/ephemeris/"
+
+#define QL_AGNSS_EPH_GPS                "HD_GPS.hdb"
+#define QL_AGNSS_EPH_BDS                "HD_BDS.hdb"
+#define QL_AGNSS_EPH_GLO                "HD_GLO.hdb"
+#define QL_AGNSS_EPH_GAL                "HD_GAL.hdb"
+#define QL_AGNSS_EPH_QZS                "HD_QZS.hdb"
+#define QL_AGNSS_EPH_GPS_BDS            "HD_GPS_BDS.hdb"
+#define QL_AGNSS_EPH_GPS_GLO            "HD_GPS_GLO.hdb"
+#define QL_AGNSS_EPH_GPS_GAL            "HD_GPS_GAL.hdb"
+#define QL_AGNSS_EPH_GPS_QZSS           "HD_GPS_QZSS.hdb"
+
+/*----------------------------------------------DEFINE-------------------------------------------*/
+
+/*----------------------------------------------ENUM---------------------------------------------*/
+typedef enum {
+    QL_GNSS_INIT_STOP  = 0,
+    QL_GNSS_INIT_START,
+}ql_gnss_init_enum;
+
+/*----------------------------------------------ENUM---------------------------------------------*/
+
+/*----------------------------------------------STRUCT-------------------------------------------*/
+typedef struct {
+    ql_gnss_init_enum  status;
+    ql_gnss_ind_cb_f   ind_cb;
+    ql_gnss_error_cb_f server_cb;
+    time_t             timestamp;
+}ql_gnss_info_handle_t;
+
+/*----------------------------------------------STRUCT-------------------------------------------*/
+
+/*----------------------------------------------GLOBAL VARIABLE----------------------------------*/
+extern long timezone;
+
+/*----------------------------------------------GLOBAL VARIABLE----------------------------------*/
+
+/*----------------------------------------------GLOBAL STATIC VARIABLE---------------------------*/
+static ql_gnss_info_handle_t* gnss_handle = NULL;
+
+/*----------------------------------------------GLOBAL STATIC VARIABLE---------------------------*/
+
+/*----------------------------------------------GNSS FUNCTION-------------------------------------*/
+static time_t ql_get_timestamp(char *time)
+{
+    char tmp_char[4] = {0};
+    struct tm tmp_time;
+
+    memset(&tmp_time, 0, sizeof(struct tm));
+    memset(tmp_char, 0, sizeof(tmp_char));
+    memcpy(tmp_char, &time[4], 2);
+    tmp_time.tm_sec = atoi(tmp_char);
+
+    memcpy(tmp_char, &time[2], 2);
+    tmp_time.tm_min = atoi(tmp_char);
+
+    memcpy(tmp_char, &time[0], 2);
+    tmp_time.tm_hour = atoi(tmp_char);
+
+    memcpy(tmp_char, &time[6], 2);
+    tmp_time.tm_mday = atoi(tmp_char);
+
+    memcpy(tmp_char, &time[8], 2);
+    tmp_time.tm_mon = atoi(tmp_char) - 1;
+
+    memcpy(tmp_char, &time[10], 2);
+    tmp_time.tm_year = 100 + atoi(tmp_char);
+
+    time_t _t = mktime(&tmp_time);
+    tzset();
+    _t = _t - timezone;
+
+    return _t;
+}
+
+static time_t ql_get_gnss_time_sec(char *data, int data_len)
+{
+//    int i = 0, num = 0;
+    char* previous_p = data;
+    char* current_p = NULL;
+    int current_get_num = 0;
+    char time[15] = {0};
+
+    //$GNRMC,024142.000,A,3039.364421,N,10403.417935,E,0.051,0.00,030124,,E,A*00
+
+    do
+    {
+        current_p = strchr(previous_p, ',');
+        if(current_p != NULL)
+        {
+            current_get_num++;
+            if(current_get_num == 2)
+            {
+                if(previous_p != current_p)
+                {
+                    memcpy(time, previous_p, 6);
+                    //QL_GNSS_LOGE("[%s] time:%s.", __func__, time);
+                }
+                else
+                {
+                    gnss_handle->timestamp = 0;
+                    return 0;
+                }
+            }
+
+            if(current_get_num == 10)
+            {
+                if(previous_p != current_p)
+                {
+                    memcpy(time + 6, previous_p, 6);
+                    //QL_GNSS_LOGE("[%s] date + time:%s.", __func__, time);
+                    break;
+                }
+                else
+                {
+                    gnss_handle->timestamp = 0;
+                    return 0;
+                }
+            }
+
+            if(current_p + 1 <= data + data_len)
+            {
+                previous_p = current_p + 1;
+            }
+            else
+            {
+                QL_GNSS_LOGE("[%s] data out of range.", __func__);
+                gnss_handle->timestamp = 0;
+                return 0;
+            }
+        }
+    }while(current_p != NULL);
+
+    gnss_handle->timestamp = ql_get_timestamp(time);
+
+    return gnss_handle->timestamp;
+}
+
+static void ql_gnss_callback(uint32 ind_type, const void* data, uint32 data_len)
+{
+    if(data == NULL || data_len <= 0)
+    {
+        QL_GNSS_LOGE("[%s] data is NULL.", __func__);
+        return;
+    }
+
+    if(gnss_handle->ind_cb != NULL)
+    {
+        if(ind_type == MBTK_GNSS_IND_NMEA)
+        {
+            nmea_srv_ind_msg nmea_msg = {0};
+            memset(&nmea_msg, 0x0, sizeof(nmea_srv_ind_msg));
+            nmea_msg.msg_id = QL_GNSS_NMEA_MSG;
+            if(data_len <= QL_GNSS_NMEA_SIZE_MAX)
+            {
+                memcpy(nmea_msg.nmea_sentence, (const char *)data, data_len);
+            }
+            else
+            {
+                QL_GNSS_LOGE("[%s] data too long. %s", __func__, (char*)data);
+                return;
+            }
+
+            if(NULL != strstr((char*)data, "RMC"))
+            {
+                nmea_msg.time = ql_get_gnss_time_sec(nmea_msg.nmea_sentence, data_len);
+            }
+            else
+            {
+                nmea_msg.time = gnss_handle->timestamp;
+            }
+
+            gnss_handle->ind_cb((void*)&nmea_msg);
+        }
+        else
+        {
+            QL_GNSS_LOGE("[%s] Unknown IND : %d.", __func__, ind_type);
+        }
+    }
+
+}
+
+/*----------------------------------------------GNSS FUNCTION-------------------------------------*/
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the gnss client
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_init(void)
+{
+    if(NULL == gnss_handle)
+    {
+        gnss_handle = (ql_gnss_info_handle_t*)malloc(sizeof(ql_gnss_info_handle_t));
+        if(NULL == gnss_handle)
+        {
+            QL_GNSS_LOGE("[%s] gnss handle malloc fail.", __func__);
+            return QL_ERR_FAILED;
+        }
+
+        gnss_err_enum ret = mbtk_gnss_init(ql_gnss_callback);
+        if(ret == GNSS_ERR_OK)
+        {
+            gnss_handle->status = QL_GNSS_INIT_STOP;
+            ret = mbtk_gnss_ind_set(MBTK_GNSS_IND_NMEA, QL_GNSS_TIMEOUT);
+            if(ret != GNSS_ERR_OK)
+            {
+                QL_GNSS_LOGE("[%s] gnss ind set fail.[%d]", __func__, ret);
+                goto error_2;
+            }
+        }
+        else
+        {
+            QL_GNSS_LOGE("[%s] gnss init fail.[%d]", __func__, ret);
+            goto error_1;
+        }
+
+        gnss_handle->ind_cb = NULL;
+        gnss_handle->server_cb = NULL;
+        gnss_handle->timestamp = 0;
+    }
+
+    return QL_ERR_OK;
+error_2:
+    if(gnss_handle->status == QL_GNSS_INIT_START)
+    {
+        mbtk_gnss_deinit();
+        gnss_handle->status = QL_GNSS_INIT_STOP;
+    }
+error_1:
+    if(gnss_handle)
+    {
+        free(gnss_handle);
+        gnss_handle = NULL;
+    }
+    return QL_ERR_FAILED;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize the  gnss client
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_deinit(void)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    gnss_handle->timestamp = 0;
+    gnss_handle->server_cb = NULL;
+    gnss_handle->ind_cb = NULL;
+
+    gnss_err_enum ret = mbtk_gnss_deinit();
+    if(ret == GNSS_ERR_OK)
+    {
+        gnss_handle->status = QL_GNSS_INIT_STOP;
+    }
+    else
+    {
+        QL_GNSS_LOGE("[%s] gnss init fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    free(gnss_handle);
+    gnss_handle = NULL;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Start gnss
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_start(void)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    ret = mbtk_gnss_open(255, QL_GNSS_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[%s] gnss open fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    gnss_handle->status = QL_GNSS_INIT_START;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Stop gnss
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_stop(void)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    ret = mbtk_gnss_close(QL_GNSS_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[%s] gnss close fail.[%d]", ret);
+        return QL_ERR_FAILED;
+    }
+
+    gnss_handle->status = QL_GNSS_INIT_STOP;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss start mode
+  @param[in] mask Gnss start mode
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_start_mode(QL_GNSS_START_MODE_E mask)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    char param_buf[32] = {0};
+//    int  length = 0;
+    int  mode = 0;
+
+    if(mask == QL_GNSS_COLD_START)
+    {
+        mode = 3;
+    }
+    else if(mask == QL_GNSS_WARM_START)
+    {
+        mode = 2;
+    }
+    else if(mask == QL_GNSS_HOT_START)
+    {
+        mode = 1;
+    }
+    else
+    {
+        QL_GNSS_LOGE("[%s] mask error.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    snprintf(param_buf, 32, "$RESET,%d", mode);
+    ret = mbtk_gnss_setting(param_buf, QL_GNSS_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[%s] gnss setting fail.[%d]", __func__);
+        return QL_ERR_FAILED;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get gnss nmea
+  @param[in] nmea_str
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_qgpsgnmea(nmeasrc_sentences *nmea_str)
+{
+    UNUSED(nmea_str);
+
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss qgpscfg
+  @param[in] enable
+  @param[in] str
+  @param[in] len
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_qgpscfg(uint32_t enable, char *str, uint32_t len)
+{
+    UNUSED(enable);
+    UNUSED(str);
+    UNUSED(len);
+
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get engine state
+  @param[out] state  on/ff
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_get_engine_state(QL_GNSS_ENGINE_STATE_E *state)
+{
+    UNUSED(state);
+
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set Constellation .
+  @param[in] mask  GPS/GLO/BDS/GAL/QZSS/SBAS
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_constellation(QL_GNSS_CONSTELLATION_MASK_E mask)
+{
+    UNUSED(mask);
+
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get Constellation
+  @param[out] mask   GPS/GLO/BDS/GAL/QZSS/SBAS
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_get_constellation(QL_GNSS_CONSTELLATION_MASK_E *mask)
+{
+    UNUSED(mask);
+
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set nmea type
+  @param[in] mask type
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_nmea_type(uint32_t mask)
+{
+    UNUSED(mask);
+
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get nmea version
+  @param[out] version nmea version
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_get_nmea_version(QL_GNSS_NMEA_VERSION_ID_E *version)
+{
+    UNUSED(version);
+
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set nmea version
+  @param[in] version nmea version
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_nmea_version(QL_GNSS_NMEA_VERSION_ID_E version)
+{
+    UNUSED(version);
+
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss agnss mode
+  @param[in] mask Gnss agnss mode
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_agnss_mode(uint32_t mask)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    char eph_file[32] = {0};
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    char write_buff[512] = {0};
+//    int write_length = 0;
+
+    if((mask & QL_GNSS_EPH_DATA_GPS) == mask)
+    {
+        memcpy(eph_file, QL_AGNSS_EPH_GPS, strlen(QL_AGNSS_EPH_GPS));
+    }
+    else if((mask & QL_GNSS_EPH_DATA_BDS) == mask)
+    {
+        memcpy(eph_file, QL_AGNSS_EPH_BDS, strlen(QL_AGNSS_EPH_BDS));
+    }
+    else if((mask & QL_GNSS_EPH_DATA_GLO) == mask)
+    {
+        memcpy(eph_file, QL_AGNSS_EPH_GLO, strlen(QL_AGNSS_EPH_GLO));
+    }
+    else if((mask & QL_GNSS_EPH_DATA_GAL) == mask)
+    {
+        memcpy(eph_file, QL_AGNSS_EPH_GAL, strlen(QL_AGNSS_EPH_GAL));
+    }
+    else if((mask & QL_GNSS_EPH_DATA_QZSS) == mask)
+    {
+        memcpy(eph_file, QL_AGNSS_EPH_QZS, strlen(QL_AGNSS_EPH_QZS));
+    }
+    else if((mask & (QL_GNSS_EPH_DATA_GPS | QL_GNSS_EPH_DATA_BDS)) == mask)
+    {
+        memcpy(eph_file, QL_AGNSS_EPH_GPS_BDS, strlen(QL_AGNSS_EPH_GPS_BDS));
+    }
+    else if((mask & (QL_GNSS_EPH_DATA_GPS | QL_GNSS_EPH_DATA_GLO)) == mask)
+    {
+        memcpy(eph_file, QL_AGNSS_EPH_GPS_GLO, strlen(QL_AGNSS_EPH_GPS_GLO));
+    }
+    else if((mask & (QL_GNSS_EPH_DATA_GPS | QL_GNSS_EPH_DATA_GAL)) == mask)
+    {
+        memcpy(eph_file, QL_AGNSS_EPH_GPS_GAL, strlen(QL_AGNSS_EPH_GPS_GAL));
+    }
+    else if((mask & (QL_GNSS_EPH_DATA_GPS | QL_GNSS_EPH_DATA_QZSS)) == mask)
+    {
+        memcpy(eph_file, QL_AGNSS_EPH_GPS_QZSS, strlen(QL_AGNSS_EPH_GPS_QZSS));
+    }
+    else
+    {
+        QL_GNSS_LOGE("[%s] unknown mask.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    snprintf(write_buff, 512, "$AGPSCFG,%s%s,NULL,NULL", QL_AGNSS_URL_PATH, eph_file);
+    ret = mbtk_gnss_setting(write_buff, QL_GNSS_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[%s] gnss setting fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Inject  agnss data
+  @param[in] data agnss data
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_inject_agnss_data(void)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    gnss_err_enum ret = GNSS_ERR_UNKNOWN;
+    ret = mbtk_gnss_eph_download(QL_AGNSS_DOWNLOAD_TIMEPUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[%s] gnss eph download fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    ret = mbtk_gnss_eph_inject(QL_AGNSS_INJECT_TIMEOUT);
+    if(ret != GNSS_ERR_OK)
+    {
+        LOGE("[%s] gnss eph inject fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Inject UTC time to GNSS Engine.
+  @param[in] timestamp ,unit: ms
+  @return Whether to successfully Start Gnss
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_FAILED  Start Gnss Failed
+  @retval Other error code defined by ql_gnss.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_inject_utc_time(uint64_t timestamp)
+{
+    UNUSED(timestamp);
+
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss suspend
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_suspend(void)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set gnss resume
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_resume(void)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Register gnss callback
+  @param[in] cb
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_ind_cb(ql_gnss_ind_cb_f cb)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    gnss_handle->ind_cb = cb;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally,
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_gnss_set_service_error_cb(ql_gnss_error_cb_f cb)
+{
+    if(NULL == gnss_handle)
+    {
+        QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    gnss_handle->server_cb = cb;
+
+    return QL_ERR_OK;
+}
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_gpio.c b/mbtk/libql_lib_v2_rilv2/ql_gpio.c
new file mode 100755
index 0000000..83149b2
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_gpio.c
@@ -0,0 +1,129 @@
+#include "ql_gpio.h"
+#include "mbtk_gpio.h"
+#include "mbtk_log.h"
+#include "mbtk_type.h"
+
+#include <errno.h>
+
+int ql_gpio_init(ENUM_PINNAME       pin_name, 
+                 ENUM_PIN_DIRECTION  dir, 
+                 ENUM_PIN_LEVEL      level, 
+                 ENUM_PIN_PULLSEL    pull_sel
+                 )
+{
+    if(pull_sel != PINPULLSEL_DISABLE)
+    {
+        LOGE("[ql_gpio_init] pull_sel fail.");
+        return RES_BAD_PARAMETER;
+    }
+
+    if(dir == PINDIRECTION_IN)
+    {
+        dir = MBTK_GPIO_DIRECT_IN;
+    }
+    else if(dir == PINDIRECTION_OUT)
+    {
+        dir = MBTK_GPIO_DIRECT_OUT;
+    }
+    else
+    {
+        dir = MBTK_GPIO_DIRECT_UNKNOWN;
+        LOGE("[ql_gpio_init] direction fail.");
+        return RES_BAD_PARAMETER;
+    }
+
+    if(level != PINLEVEL_LOW && level != PINLEVEL_HIGH)
+    {
+        LOGE("[ql_gpio_init] level fail.");
+        return RES_BAD_PARAMETER;
+    }
+
+    if(mbtk_gpio_export(pin_name))
+    {
+        LOGE("[ql_gpio_init]gpio_export fail.");
+        return RES_IO_ERROR;
+    }
+
+    if(mbtk_gpio_direct_set(pin_name, dir))
+    {
+        LOGE("[ql_gpio_init]gpio_direct_set fail.");
+        return RES_IO_ERROR;
+    }
+
+    if(mbtk_gpio_value_set_2(pin_name, level))
+    {
+        LOGE("[ql_gpio_init]gpio_value_set fail.");
+        return RES_IO_ERROR;
+    }
+
+    return RES_OK;
+}
+
+int ql_gpio_set_level(ENUM_PINNAME pin_name, ENUM_PIN_LEVEL level)
+{
+    if(level != PINLEVEL_LOW && level != PINLEVEL_HIGH)
+    {
+        LOGE("[ql_gpio_set_level] level fail.");
+        return RES_BAD_PARAMETER;
+    }
+
+    if(mbtk_gpio_value_set_2(pin_name, level) != 0)
+    {
+        LOGE("[ql_gpio_set_level]gpio_value_set fail.");
+        return RES_IO_ERROR;
+    }
+
+    return RES_OK;
+}
+
+int ql_gpio_get_level(ENUM_PINNAME pin_name)
+{
+    int ret;
+
+    ret = mbtk_gpio_value_get(pin_name);
+    if (ret == -1)
+    {
+        LOGE("[ql_gpio_set_level]gpio_value_set fail.");
+        return RES_IO_ERROR;
+    }
+
+    return ret;
+}
+
+int ql_gpio_set_direction(ENUM_PINNAME pin_name, ENUM_PIN_DIRECTION dir)
+{
+    if(dir == PINDIRECTION_IN)
+    {
+        dir = MBTK_GPIO_DIRECT_IN;
+    }
+    else if(dir == PINDIRECTION_OUT)
+    {
+        dir = MBTK_GPIO_DIRECT_OUT;
+    }
+    else
+    {
+        dir = MBTK_GPIO_DIRECT_UNKNOWN;
+        LOGE("[ql_gpio_init] direction fail.");
+        return RES_BAD_PARAMETER;
+    }
+
+    if(mbtk_gpio_direct_set(pin_name, dir))
+    {
+        LOGE("[ql_gpio_set_direction]gpio_direct_set fail.");
+        return RES_IO_ERROR;
+    }
+
+    return RES_OK;
+}
+
+int ql_gpio_uninit(ENUM_PINNAME pin_name)
+{
+    if(mbtk_gpio_unexport(pin_name))
+    {
+        LOGE("[ql_gpio_uninit]gpio_unexport fail.");
+        return RES_IO_ERROR;
+    }
+
+    return RES_OK;
+}
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_gpio_internal.c b/mbtk/libql_lib_v2_rilv2/ql_gpio_internal.c
new file mode 100755
index 0000000..a00a3c0
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_gpio_internal.c
@@ -0,0 +1,335 @@
+#ifndef __QL_GPIO_INTERNAL_H

+#define __QL_GPIO_INTERNAL_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#include "ql_gpio.h"

+

+typedef enum{

+    INTERNAL_BEGIN = -1,

+    INTERNAL_GPIO_10 = 10,

+    INTERNAL_GPIO_11 = 11,

+    INTERNAL_GPIO_19 = 19,

+    INTERNAL_GPIO_21 = 21,

+    INTERNAL_GPIO_22 = 22,

+    INTERNAL_GPIO_23 = 23,

+    INTERNAL_GPIO_24 = 24,

+    INTERNAL_GPIO_25 = 25,

+    INTERNAL_GPIO_26 = 26,

+    INTERNAL_GPIO_27 = 27,

+    INTERNAL_GPIO_31 = 31,

+    INTERNAL_GPIO_32 = 32,

+    INTERNAL_GPIO_33 = 33,

+    INTERNAL_GPIO_34 = 34,

+    INTERNAL_GPIO_35 = 35,

+    INTERNAL_GPIO_36 = 36,

+    INTERNAL_GPIO_37 = 37,

+    INTERNAL_GPIO_38 = 38,

+    INTERNAL_GPIO_39 = 39,

+    INTERNAL_GPIO_40 = 40,

+    INTERNAL_GPIO_43 = 43,

+    INTERNAL_GPIO_48 = 48,

+    INTERNAL_GPIO_49 = 49,

+    INTERNAL_GPIO_50 = 50,

+    INTERNAL_GPIO_51 = 51,

+    INTERNAL_GPIO_52 = 52,

+    INTERNAL_GPIO_53 = 53,

+    INTERNAL_GPIO_54 = 54,

+    INTERNAL_GPIO_55 = 55,

+    INTERNAL_GPIO_56 = 56,

+    INTERNAL_GPIO_57 = 57,

+    INTERNAL_GPIO_58 = 58,

+    INTERNAL_GPIO_59 = 59,

+    INTERNAL_GPIO_99 = 99,

+    INTERNAL_GPIO_117 = 117,

+    INTERNAL_GPIO_118 = 118,

+    INTERNAL_GPIO_119 = 119,

+    INTERNAL_GPIO_120 = 120,

+    INTERNAL_GPIO_122 = 122,

+    INTERNAL_GPIO_123 = 123,

+    INTERNAL_GPIO_126 = 126,

+    INTERNAL_END = 127

+}INTERNAL_ENUM_PINNAME;

+

+

+/*****************************************************************

+* Function:     __ql_gpio_init 

+* 

+* Description:

+*               This function enables the GPIO function of the specified pin,

+*               and initialize the configurations, including direction,

+*               level and pull selection.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*               dir:

+*                   The initial direction of GPIO, one value of ENUM_PIN_DIRECTION.

+*               level:

+*                   The initial level of GPIO, one value of ENUM_PIN_LEVEL. 

+*               pullSel:

+*                   Pull selection, one value of ENUM_PIN_PULLSEL.

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_init(INTERNAL_ENUM_PINNAME       pin_name, 

+                 ENUM_PIN_DIRECTION  dir, 

+                 ENUM_PIN_LEVEL      level, 

+                 ENUM_PIN_PULLSEL    pull_sel

+                 );

+

+/*****************************************************************

+* Function:     __ql_gpio_base_init 

+* 

+* Description:

+*               This function enables the GPIO function of the specified pin.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*            

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*****************************************************************/

+int __ql_gpio_base_init(INTERNAL_ENUM_PINNAME pin_name );

+

+/*****************************************************************

+* Function:     __ql_gpio_set_level 

+* 

+* Description:

+*               This function sets the level of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*               level:

+*                   The initial level of GPIO, one value of ENUM_PIN_LEVEL. 

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_set_level(INTERNAL_ENUM_PINNAME pin_name, ENUM_PIN_LEVEL level);

+

+/*****************************************************************

+* Function:     __ql_gpio_get_level 

+* 

+* Description:

+*               This function gets the level of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+* Return:        

+*               The level value of the specified GPIO, which is 

+*               nonnegative integer.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.

+*****************************************************************/

+int __ql_gpio_get_level(INTERNAL_ENUM_PINNAME pin_name);

+

+/*****************************************************************

+* Function:     __ql_gpio_set_direction 

+* 

+* Description:

+*               This function sets the direction of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*               dir:

+*                   The initial direction of GPIO, one value of ENUM_PIN_DIRECTION.

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_set_direction(INTERNAL_ENUM_PINNAME pin_name, ENUM_PIN_DIRECTION dir);

+

+/*****************************************************************

+* Function:     __ql_gpio_get_direction 

+* 

+* Description:

+*               This function gets the direction of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+* Return:        

+*               0  INPUT

+*               1  OUTPUT

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_get_direction(INTERNAL_ENUM_PINNAME pin_name);

+

+

+/*****************************************************************

+* Function:     __ql_gpio_set_pull_selection 

+* 

+* Description:

+*               This function sets the pull selection of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+*               ENUM_PIN_PULLSEL:

+*                   Pull selection, one value of ENUM_PIN_PULLSEL.

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_set_pull_selection(INTERNAL_ENUM_PINNAME pin_name, ENUM_PIN_PULLSEL pull_sel);

+

+/*****************************************************************

+* Function:     __ql_gpio_get_pull_selection 

+* 

+* Description:

+*               This function gets the pull selection of the specified GPIO.

+*

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+* Return:        

+*               0   no pull

+*               1   pull down

+*               3   pull up

+*****************************************************************/

+int __ql_gpio_get_pull_selection(INTERNAL_ENUM_PINNAME pin_name);

+

+/*****************************************************************

+* Function:     __ql_gpio_uninit 

+* 

+* Description:

+*               This function releases the specified GPIO that was 

+*               initialized by calling ql_gpio_init() previously.

+*               After releasing, the GPIO can be used for other purpose.

+* Parameters:

+*               pin_name:

+*                   Pin name, one value of INTERNAL_ENUM_PINNAME.

+* Return:        

+*               RES_OK, this function succeeds.

+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid. 

+*               RES_IO_ERR, the function failed

+*               other place. For example this GPIO has been using as EINT.

+*****************************************************************/

+int __ql_gpio_uninit(INTERNAL_ENUM_PINNAME pin_name);

+

+//------------------------------------------------------------------------------

+/*

+* Function:     __ql_eint_enable 

+* 

+* Description:

+*               Set the interrupt sense mode, and enable interrupt. 

+*

+* Parameters:

+*               eint_pin_name:

+*                   EINT pin name, one value of INTERNAL_ENUM_PINNAME that has 

+*                   the interrupt function.

+*

+*               eint_type:

+*                   Interrupt type, level-triggered or edge-triggered.

+*                   Now, only edge-triggered interrupt is supported.

+*

+*               eint_callback:

+*                   call back function

+*

+* Return:        

+*               RES_OK, this function succeeds.

+*               else failed to execute the function. 

+*/

+//------------------------------------------------------------------------------

+int __ql_eint_enable(INTERNAL_ENUM_PINNAME eint_pin_name, ENUM_EINT_TYPE eint_type, ql_eint_callback eint_callback);

+

+

+//------------------------------------------------------------------------------

+/*

+* Function:     __ql_eint_disable 

+* 

+* Description:

+*               Disable the interrupt sense. 

+*

+* Parameters:

+*               eint_pin_name:

+*                   EINT pin name, one value of INTERNAL_ENUM_PINNAME that has 

+*                   the interrupt function.

+*

+* Return:        

+*               RES_OK, this function succeeds.

+*               else failed to execute the function. 

+*/

+//------------------------------------------------------------------------------

+int __ql_eint_disable(INTERNAL_ENUM_PINNAME eint_pin_name);

+

+

+/*-----------------------------------------------------------------------------------------------*/

+/**

+Function:     __ql_set_gpio_function 

+* 

+* Description:

+*             set pin function. 

+*

+* Parameters:

+*            pin_name:

+*            EINT pin name, one value of INTERNAL_ENUM_PINNAME.

+*		 func:

+*		 pin function,value range from 0 to 7

+*

+* Return:        

+*               RES_OK, this function succeeds.

+*               else failed to execute the function. 

+*/

+/*-----------------------------------------------------------------------------------------------*/

+int __ql_set_gpio_function(INTERNAL_ENUM_PINNAME pin_name,unsigned int func);

+

+

+/*-----------------------------------------------------------------------------------------------*/

+/*Function:     __ql_get_gpio_function 

+* 

+* Description:

+*               get pin function. 

+*

+* Parameters:

+*               pin_name:

+*               EINT pin name, one value of INTERNAL_ENUM_PINNAME.

+*

+* Return:        

+*               return 0-7, this function succeeds.

+*               else failed to execute the function. 

+*/

+/*-----------------------------------------------------------------------------------------------*/

+int __ql_get_gpio_function(INTERNAL_ENUM_PINNAME pin_name);

+

+/*-----------------------------------------------------------------------------------------------*/

+/*Function:     __ql_check_pin_function_status 

+* 

+* Description:

+*               Check whether the pin is gpio function. 

+*

+* Parameters:

+*               pin_name:

+*               EINT pin name, one value of INTERNAL_ENUM_PINNAME.

+*

+* Return:        

+*               return 1, this pin is gpio function.

+*               return 0, this pin is not gpio function. 

+*		     else failed to execute the function.

+*/

+/*-----------------------------------------------------------------------------------------------*/

+int __ql_check_pin_function_status(INTERNAL_ENUM_PINNAME  pin_name);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif

diff --git a/mbtk/libql_lib_v2_rilv2/ql_lanhost.c b/mbtk/libql_lib_v2_rilv2/ql_lanhost.c
new file mode 100755
index 0000000..66f28dd
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_lanhost.c
@@ -0,0 +1,105 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_lanhost.h 
+  @brief LANHOST API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20191016   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_LANHOST_H__
+#define __QL_LANHOST_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "ql_net_common.h"
+
+
+typedef void (*ql_lanhost_ind_cb_f)(QL_LANHOST_EVENT_TYPE_E event_type, ql_lanhost_t *p_host);
+
+typedef void (*ql_lanhost_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Initialize the lanhost service
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get all lanhost list, the maximum of lanhost is defined by QL_NET_MAX_LANHOST_NUM 
+  @param[out] list Lanhost array
+  @param[in,out] list_len, in-> array size, out->current instance number
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_get_list(ql_lanhost_t *list, int *list_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Register lanhost status change event
+  @param[in] cb 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_set_ind_cb(ql_lanhost_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_set_service_error_cb(ql_lanhost_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitialize the lanhost service 
+  @return 
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_lanhost_deinit(void);
+
+#ifdef __cplusplus
+} 
+#endif
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_lpm.c b/mbtk/libql_lib_v2_rilv2/ql_lpm.c
new file mode 100755
index 0000000..0c767a2
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_lpm.c
@@ -0,0 +1,24 @@
+#include "ql_lpm.h"
+#include "mbtk_lpm.h"
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+
+int ql_lpm_init(ql_lpm_handler_t ql_lpm_handler)
+{
+    if(mbtk_lpm_init((mbtk_lpm_handler_t)ql_lpm_handler))
+    {
+        LOGE("ql_lpm_init fail");
+        return -1;
+    }
+
+    return 0;
+}
+
+int ql_lpm_deinit(void)
+{
+    mbtk_lpm_deinit();
+
+    return 0;
+}
+
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_ms_data_call.c b/mbtk/libql_lib_v2_rilv2/ql_ms_data_call.c
new file mode 100755
index 0000000..02d45fe
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_ms_data_call.c
@@ -0,0 +1,495 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_data_call.h
+  @brief Data service API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20181024   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_MS_DATA_CALL_H__
+#define __QL_MS_DATA_CALL_H__
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "ql_data_call.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call service
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Create a data call instance
+  @param[in] call_id The unique identifier of the data call instance, specified by the user
+  @param[in] call_name Friendly data call name,  specified by the user
+  @param[in] is_background Whether the data call status is maintained by the data call service daemon.
+  If it is 0, the data call instance will be deleted after the data call process exits.
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_create(int call_id, const char *call_name, int is_background);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Alloc for a data call configuration instance
+  @return
+  NULL - Not enough memory
+  Other - successful
+  */
+/*-----------------------------------------------------------------------------------------------*/
+ql_data_call_param_t *ql_ms_data_call_param_alloc(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_init(ql_data_call_param_t *param);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Release the data call configuration instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_free(ql_data_call_param_t *param);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Bind APN ID, range:1-16
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_id APN ID, range:1-16
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_apn_id(ql_data_call_param_t *param, int apn_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN ID
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_apn_id(ql_data_call_param_t *param, int *apn_id);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN name
+  @param[in] param Point to the data call configuration instance
+  @param[in] apn_name APN name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_apn_name(ql_data_call_param_t *param, const char *apn_name);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN name buffer
+  @param[in] buf_len APN name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_apn_name(ql_data_call_param_t *param, char *buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user name
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_name APN user name
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_user_name(ql_data_call_param_t *param, const char *user_name);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user name from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user name buffer
+  @param[in] buf_len APN user name buffer size
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_user_name(ql_data_call_param_t *param, char *buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure APN user password
+  @param[in] param Point to the data call configuration instance
+  @param[in] user_password APN user password
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_user_password(ql_data_call_param_t *param, const char *user_password);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get APN user password from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] buf APN user password buffer
+  @param[in] buf_len APN user password buffer size
+  @return
+  QL_ERR_OK - Not enough memory
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_user_password(ql_data_call_param_t *param, char *buf, int buf_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[in] auth_pref Defined by QL_DATA_CALL_AUTH_PREF_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_auth_pref(ql_data_call_param_t *param, int auth_pref);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call authentication method
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_data Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_auth_pref(ql_data_call_param_t *param, int *p_data);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call IP version
+  @param[in] param Point to the data call configuration instance
+  @param[in] ip_ver Defined by QL_NET_IP_VER_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_ip_version(ql_data_call_param_t *param, int ip_ver);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get IP version from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_ver Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_ip_version(ql_data_call_param_t *param, int *p_ver);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection mode
+  @param[in] param Point to the data call configuration instance
+  @param[in] mode Defined by QL_NET_DATA_CALL_RECONNECT_MODE_E
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_reconnect_mode(ql_data_call_param_t *param, int reconnect_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection mode from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_mode Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_reconnect_mode(ql_data_call_param_t *param, int *p_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call auto reconnection interval
+  @param[in] param Point to the data call configuration instance
+  @param[in] time_list Interval time list in ms
+  @param[in] num Number of time list
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_reconnect_interval(ql_data_call_param_t *param, int *time_list, int num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get auto reconnection interval from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] time_list Store return value
+  @param[in,out] p_num
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_reconnect_interval(ql_data_call_param_t *param, int *time_list, int *p_num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the data call sim id
+  @param[in] param Point to the data call configuration instance
+  @param[in] sim_id Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_set_sim_id(ql_data_call_param_t *param, int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the data call sim id from configuration instance
+  @param[in] param Point to the data call configuration instance
+  @param[out] p_sim_id Store return value
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_param_get_sim_id(ql_data_call_param_t *param, int *p_sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Configure the specified data call instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_config(int call_id, ql_data_call_param_t *param);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the specified data call configuration instance
+  @param[in] call_id Specify a data call instance
+  @param[in] param Point to the data call configuration instance
+  @return
+  QL_ERR_OK - Successful
+  QL_ERR_INVALID_ARG - Invalid arguments
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_get_config(int call_id, ql_data_call_param_t *param);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Start data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_start(int call_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Stop data call
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_stop(int call_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Delete a data call instance
+  @param[in] call_id Specify a data call instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_delete(int call_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the current data call instance list
+  @param[out] list Data call instance array
+  @param[in,out] list_len, in-> Data call instance array size, out->current data call instance number
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_get_list(ql_data_call_item_t *list, int *list_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get the data call status
+  @param[in] call_id Specify a data call instance
+  @param[out] p_sta Point to status instance
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_get_status(int call_id, ql_data_call_status_t *p_sta);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Register data call status change event
+  @param[in] cb
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_set_status_ind_cb(ql_data_call_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Set APN related configuration.If the apn does not exist, it is automatically created.
+  @param[in] sim_id SIM ID, range:1-2
+  @param[in] apn_id APN ID, range:1-16
+  @param[in] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_set_apn_config(int sim_id, int apn_id, ql_data_call_apn_config_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Set APN related configuration. If the apn does not exist, it is automatically created and
+  the default parameters are set.
+  @param[in] sim_id SIM ID, range:1-2
+  @param[in] apn_id APN ID, range:1-16
+  @param[out] p_info APN configuration
+  @return
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_get_apn_config(int sim_id, int apn_id, ql_data_call_apn_config_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally,
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_set_service_error_cb(ql_data_call_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize the data call service
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_data_call_deinit(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_ms_dm.c b/mbtk/libql_lib_v2_rilv2/ql_ms_dm.c
new file mode 100755
index 0000000..b25c38f
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_ms_dm.c
@@ -0,0 +1,436 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_dm.h 
+  @brief device management API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2021 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200316   stan.li      Optimize the ql_dm_get_modem_state interface
+  20191224   stan.li      Add radio on/off API
+  20190625   stan.li      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_MS_DM_H__
+#define __QL_MS_DM_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ql_type.h"
+#include "ql_dm.h"
+
+typedef void (*ql_ms_dm_air_plane_mode_ind_cb)(int sim_id, QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode);
+typedef void (*ql_ms_dm_modem_state_ind_cb)(int statue);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize DM service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the DM service was successfully intialized.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_init(void);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Deinitialize DM service.
+  @return Whether the DM service was successfully deintialized.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_deinit(void);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device software version. 
+  @param[out] soft_ver Return software version
+  @param[in] soft_ver_len The length of soft_ver
+  @return Whether to successfully get the software version
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_software_version(char *soft_ver, int soft_ver_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem state.
+  @details QL_DM_MODEM_STATE_ONLINE,if modem starts normally.
+  @details QL_DM_MODEM_STATE_OFFLINE,in modem starts abnormally.
+  @details QL_DM_MODEM_STATE_UNKNOWN,unknown error. 
+  @param[out] modem_state The state of modem
+  @return Whether to successfully get the modem state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_modem_state(QL_DM_MODEM_STATE_TYPE_E *modem_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register modem state event. 
+  @param[in] cb_func modem state indication callback function
+  @return Whether the modem state event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_modem_state_change_ind_cb(ql_dm_modem_state_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get module temperature. 
+  @param[out] temperature The current temperature
+  @return Whether to successfully get the temperature
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_temperature(float *temperature);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device serial numbers. 
+  @param[out] p_info Pointer that point to ql_dm_device_serial_numbers_info_t
+  @return Whether to successfully get the serial numbers
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_device_serial_numbers(ql_dm_device_serial_numbers_info_t *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device firmware revision identification. 
+  @param[out] firmware_rev_id Return device firmware revision id
+  @param[in] firmware_rev_id_len The length of firmware_rev_id
+  @return Whether to successfully get the firmware revision id
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_device_firmware_rev_id(char *firmware_rev_id, int firmware_rev_id_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get air plane mode. 
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to QL_DM_AIR_PLANE_MODE_TYPE_E
+  @return Whether to successfully get the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_air_plane_mode(int sim_id, QL_DM_AIR_PLANE_MODE_TYPE_E *p_info);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set air plane mode. 
+  @param[in] sim id number
+  @param[in] air_plane_mode 1:ON, 2:OFF
+  @return Whether to successfully set the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_air_plane_mode(int sim_id, QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register air plane mode event.
+  @param[in] sim_id Sim id number
+  @param[in] cb_func Air plane mode indication callback function
+  @return Whether the air plane mode event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_air_plane_mode_ind_cb(int sim_id, ql_ms_dm_air_plane_mode_ind_cb cb_func);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get cpu occupancy. 
+  @param[out] cpu_occupancy The percentage of cpu occupancy
+  @return Whether to successfully get the cpu occupancy
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_cpu_occupancy(float *cpu_occupancy);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get mem usage. 
+  @param[out] mem_use The percentage of mem usage
+  @return Whether to successfully get the memory usage
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_mem_usage(float *mem_use);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get NV item value. 
+  @param[in] sim id number
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[out] nv_item_value The nv value buf of nv_item_name
+  param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully get the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len,  int *nv_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set NV item value. 
+  @param[in] sim id number
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[in] nv_item_value The NV value of nv_item_name
+  @param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully set the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len, int *nv_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio on, its function is the same as at+cfun=1. 
+  @param[in] sim id number
+  @return Whether to successfully set the radio on
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_radio_on(int sim_id);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio off, its function is the same as at+cfun=0. 
+  @param[in] sim id number
+  @return Whether to successfully set the radio off
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_radio_off(int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem CPU utilization. 
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_modem_cpu_occupancy(float *cpu_occupancy);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem mem utilization. 
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_modem_mem_usage(float *mem_use);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS enable state 
+  @param[in] sim id number
+  @param[out] enable The enable state of QOOS
+  @return Whether to successfully get the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_qoos_enable(int sim_id, QL_DM_QOOS_ENABLE_TYPE_E *enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS enable state 
+  @param[in] sim id number
+  @param[in] enable The enable state of QOOS
+  @return Whether to successfully set the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_qoos_enable(int sim_id, QL_DM_QOOS_ENABLE_TYPE_E enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS configuration 
+  @param[in] sim id number
+  @param[out] config The configuration of QOOS
+  @return Whether to successfully get the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_qoos_config(int sim_id, ql_dm_qoos_config_t *config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS configuration 
+  @param[in] sim id number
+  @param[in] config The configuration of QOOS
+  @return Whether to successfully set the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_qoos_config(int sim_id, char enable ,int p1, int p2, int p3);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get MSSR(Modem SubSysem Reset) level. 
+  @param[out] p_level The MSSR level
+  @return Whether to successfully get the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_get_mssr_level(int *p_level);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set MSSR(Modem SubSysem Reset) level. 
+  @param[in] level The MSSR level
+  @return Whether to successfully set the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_mssr_level(int level);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_dm_set_service_error_cb(ql_dm_service_error_cb_f cb);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_ms_nw.c b/mbtk/libql_lib_v2_rilv2/ql_ms_nw.c
new file mode 100755
index 0000000..4ff5463
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_ms_nw.c
@@ -0,0 +1,459 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_ms_nw.h 
+  @brief network registration service API, support Dual Sim Dual Active(DSDA).
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2021 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200518   rambo.shan   Add WEA and ETWS alert indication.
+  20191225   stan.li      Modify function description.
+  20191202   stan.li      change the name of ql_nw_pref_nwmode_roming_info_t
+  20190528   stan.li      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_MS_NW_H__
+#define __QL_MS_NW_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ql_type.h"
+#include "ql_nw.h"
+
+typedef void (*ql_ms_nw_voice_reg_ind_cb)(int sim_id, ql_nw_reg_status_info_t *p_info);
+
+typedef void (*ql_ms_nw_data_reg_ind_cb)(int sim_id, ql_nw_reg_status_info_t *p_info);
+
+typedef void (*ql_ms_nw_signal_strength_ind_cb)(int sim_id, ql_nw_signal_strength_info_t *p_info, QL_NW_SIGNAL_STRENGTH_LEVEL_E level);
+
+typedef void (*ql_ms_nw_cell_access_status_ind_cb)(int sim_id, QL_NW_CELL_ACCESS_STATE_TYPE_E status);
+
+typedef void (*ql_ms_nw_nitz_time_update_ind_cb)(int sim_id, ql_nw_nitz_time_info_t *p_info);
+
+typedef void (*ql_ms_nw_network_scan_async_cb)(int sim_id, int async_index, ql_nw_scan_result_list_info_t *p_info);
+
+typedef void (*ql_ms_nw_wea_reg_ind_cb)(int sim_id, ql_nw_wea_alert_info_t *p_info);
+
+typedef void (*ql_ms_nw_etws_reg_ind_cb)(int sim_id, ql_nw_etws_alert_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize NW service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the NW service was successfully intialized.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes NW service.
+  @return Whether the NW service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief scan network status.
+  @param[in] sim id number
+  @param[out] async_index The index of request msg
+  @param[in] async_cb The callback function of request msg
+  @return Whether to successfully trigger the network scan operation
+  @retval QL_ERR_OK  successful
+  @retval QL_ERR_NOT_INIT  uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY  service is not ready
+  @retval QL_ERR_INVALID_ARG  Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_network_scan(int sim_id, int *async_index, ql_ms_nw_network_scan_async_cb async_cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set power mode.
+  @param[in] sim id number
+  @param[in] lower_mode, defined by QL_NW_LOWER_POWER_MASK_XXX
+  @return Whether to successfully set the power mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_power_mode(int sim_id, uint8_t lower_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set perferred NW mode and roaming indicator.
+  @param[in] sim id number
+  @param[in] p_info Pointer that point to ql_nw_pref_nwmode_roaming_info_t
+  @return Whether to successfully set nwmode and roaming
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_pref_nwmode_roaming(int sim_id, ql_nw_pref_nwmode_roaming_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get perferred NW mode and roaming indicator.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_pref_nwmode_roaming_info_t 
+  @return Whether to successfully get nwmode and roaming
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_pref_nwmode_roaming(int sim_id, ql_nw_pref_nwmode_roaming_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get mobile operator name.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_mobile_operator_name_info_t
+  @return Whether to successfully get the mobile operator name
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_mobile_operator_name(int sim_id, ql_nw_mobile_operator_name_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get cell information.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_cell_info_t
+  @return Whether to successfully get the cell information
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_cell_info(int sim_id, ql_nw_cell_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get voice registration status.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_reg_status_info_t
+  @return Whether to successfully get the voice registration status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_voice_reg_status(int sim_id, ql_nw_reg_status_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get data registration status.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_reg_status_info_t
+  @return Whether to successfully get the data registration status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_data_reg_status(int sim_id, ql_nw_reg_status_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get current signal strength.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_signal_strength_info_t
+  @param[out] p_level: signal strength level
+  @return Whether to successfully get the signal strength
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_signal_strength(int sim_id, ql_nw_signal_strength_info_t *p_info, QL_NW_SIGNAL_STRENGTH_LEVEL_E* p_level);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get current cell acccess status.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to QL_NW_CELL_ACCESS_STATE_TYPE_E
+  @return Whether to successfully get the cell access status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_cell_access_status(int sim_id, QL_NW_CELL_ACCESS_STATE_TYPE_E *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get network time.
+  @param[in] sim id number
+  @param[out] p_info Pointer that point to ql_nw_nitz_time_info_t 
+  @return Whether to successfully get the network time
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_nitz_time_info(int sim_id, ql_nw_nitz_time_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register voice registration event.
+  @param[in] sim id number
+  @param[in] cb_func Voice registration indication callback function
+  @return Whether the voice registration event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+ */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_voice_reg_ind_cb(int sim_id, ql_ms_nw_voice_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register data registration event.
+  @param[in] sim id number
+  @param[in] cb_func Data registration indication callback function
+  @return Whether the data registration event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_data_reg_ind_cb(int sim_id, ql_ms_nw_data_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register signal strength event.
+  @param[in] sim id number
+  @param[in] cb_func Signal strength indication callback function
+  @return Whether the signal strength event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_signal_strength_ind_cb(int sim_id, ql_ms_nw_signal_strength_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register cell access status event.
+  @param[in] sim id number
+  @param[in] cb_func Cell access status indication callback function
+  @return Whether the cell access status event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_cell_access_status_ind_cb(int sim_id, ql_ms_nw_cell_access_status_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register network time event.
+  @param[in] sim id number
+  @param[in] cb_func nitz time update indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_nitz_time_update_ind_cb(int sim_id, ql_ms_nw_nitz_time_update_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register wea alert event.
+  @param[in] sim id number
+  @param[in] cb_func wea alert indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_wea_alert_ind_cb(int sim_id, ql_ms_nw_wea_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register etws alert event.
+  @param[in] sim id number
+  @param[in] cb_func etws alert indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_etws_alert_ind_cb(int sim_id, ql_ms_nw_etws_reg_ind_cb cb_func);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set wea alert config.
+  @param[in] sim id number
+  @param[in] item Items to set.
+  @param[in] p_info Pointer that point to ql_nw_wea_config_t.
+  @return Whether to successfully set the wea config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_wea_config(int sim_id, int item, ql_nw_wea_config_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets wea config.
+  @param[in] sim id number
+  @param[out] p_config wea config.
+  @return Whether the wea config was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_wea_config(int sim_id, ql_nw_wea_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set etws alert config.
+  @param[in] sim id number
+  @param[in] etws config.
+  @return Whether to successfully set the etws config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_etws_config(int sim_id, uint8_t enable_etws);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get etws alert config.
+  @param[in] sim id number
+  @param[out] p_enable_etws Pointer.
+  @return Whether to successfully set the etws config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_etws_config(int sim_id, uint8_t* p_enable_etws);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get high capability subscription.
+  @param[in] sim id number
+  @param[out] p_high_cap pointer that point to QL_NW_BIND_SUB_TYPE_E
+  @return Whether the high capability subscription was successfully obtained.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_get_high_cap_sub(QL_NW_BIND_SUB_TYPE_E *p_high_cap);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set the SIM card index that can uniquely register to the 5G network. 
+  the main difference between high and non-high capability subscription is that high capability 
+  subscription can register to 5G network while non-high capability subscription can only 
+  register to LTE or GSM.
+  @param[in] sim id number
+  @param[in] high_cap high capability subscription 
+  @return Whether to successfully set the high capability subscription.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_high_cap_sub(QL_NW_BIND_SUB_TYPE_E high_cap);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] sim id number
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_nw_set_service_error_cb(ql_nw_service_error_cb_f cb);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_ms_sim.c b/mbtk/libql_lib_v2_rilv2/ql_ms_sim.c
new file mode 100755
index 0000000..01dc771
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_ms_sim.c
@@ -0,0 +1,369 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_ms_sim.h 
+  @brief subscriber identity module service API, support Dual Sim Dual Active(DSDA). 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2021 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200720   solomon.cui  Created .
+-------------------------------------------------------------------------------------------------*/
+#ifndef __QL_MS_SIM_H__
+#define __QL_MS_SIM_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ql_type.h"
+#include "ql_sim.h"
+
+typedef void (*ql_ms_sim_card_status_cb_f)(int sim_id, ql_sim_card_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Initializes SIM service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the SIM service was intialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Deinitializes SIM service.
+  @return Whether the SIM service was deintialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets the IMSI (for 3GPP) or IMSI_M (for 3GPP2) from the SIM in ASCII form.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [out] imsi Buffer to fill IMSI data.
+  @param [in] imsi_len Buffer length.
+  @return Whether the IMSI was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_imsi(int sim_id, QL_SIM_APP_TYPE_E app_type, char *imsi, int imsi_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the Integrated Circuit Card ID (ICCID) stored on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [out] iccid Buffer to fill ICCID data.
+  @param [in] iccid_len Buffer length.
+  @return Whether the ICCID was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_iccid(int sim_id, char *iccid, int iccid_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the device phone number stored on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [out] phone_num Buffer to fill phone number.
+  @param [in] phone_num_len Buffer length.
+  @return Whether the phone number was successfully retrieved.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_phone_num(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                          char *phone_num, int phone_num_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the preferred operators stored on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] list Buffer to hold operators
+  @note This function is only supported by 3GPP applications.
+  @return Whether the preferred operators were successfully retrieved.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_operators(int sim_id, ql_sim_operator_list_t *list);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Enables the PIN on an application.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] pin_value PIN value. NULL terminated.
+  @return Whether the PIN was successfully enabled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_enable_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Disables the PIN on an application.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] pin_value PIN value. NULL terminated.
+  @return Whether the PIN was successfully disabled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_disable_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Verifies the PIN value of an application.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] pin_value PIN value. NULL terminated.
+  @note PIN must be enabled before calling this function.
+  @return Whether the PIN was successfully verified.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_verify_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Changes the PIN value of an application.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] old_pin_value Old PIN value. NULL terminated.
+  @param [in] new_pin_value New PIN value. NULL terminated.
+  @return Whether the PIN was successfully changed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_change_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *old_pin_value, const char *new_pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Unblocks a blocked PIN using the PUK code.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pin PIN to be used.
+  @param [in] puk_value PUK value.  NULL terminated.
+  @param [in] pin_value New PIN value.  NULL terminated.
+  @note The user must pass PUK1 to unblock PIN1 or PUK2 to unblock PIN2.
+  @return Whether the PIN was successfully unblocked.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_unblock_pin(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                             QL_SIM_PIN_E pin, const char *puk_value, const char *pin_value);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the card info stored on a card.
+  @param [in] sim_id sim_id to be used.
+  @param [out] p_info Pointer of ql_ms_sim_card_info_t.
+  @return Whether the card info was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_card_info(int sim_id, ql_sim_card_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Reads data from a specific file on a specified application on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [inout] p_file Pointer of ql_ms_sim_file_t.
+  @return Whether the file was successfully read.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_read_file(int sim_id, QL_SIM_APP_TYPE_E app_type, ql_sim_file_t *p_file);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Writes data to a specific file on a specified application on the card. 
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] p_file Pointer of ql_ms_sim_file_t
+  @note The type of file is determined by the record number field,
+    which indicates a transparent file when zero and a record-based file otherwise.
+  @return Whether the file was successfully written.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_write_file(int sim_id, QL_SIM_APP_TYPE_E app_type, ql_sim_file_t *p_file);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the info of a specific file on a specified application on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [inout] p_info Pointer of ql_ms_sim_file_info_t.
+  @return Whether the file info was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_get_file_info(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                                 ql_sim_file_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Reads phone book on a specified application on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Spplication type.
+  @param [in] pb_path Phone book path. NULL terminated.
+  @param [in] record_idx Record index to read. Starts from 1.
+  @param [out] p_record Pointer of ql_ms_sim_phone_book_record_t.
+  @return Whether the phone book record was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_read_phone_book(int sim_id, QL_SIM_APP_TYPE_E app_type,
+                                    const char *pb_path, uint8_t record_idx,
+                                    ql_sim_phone_book_record_t *p_record);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Writes phone book on a specified application on the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] app_type Application type.
+  @param [in] pb_path Phone book path. NULL terminated.
+  @param [in] record_idx Record index to write. Starts from 1.
+  @param [in] p_record Pointer of ql_ms_sim_phone_book_record_t.
+  @note If p_record->name[0] = 0 and p_record->number[0] = 0, record will be deleted.
+  @return Whether the phone book record was successfully saved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_write_phone_book(int sim_id, QL_SIM_APP_TYPE_E app_type, 
+                                    const char *pb_path, uint8_t record_idx,
+                                    ql_sim_phone_book_record_t *p_record);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Opens a logical channel on a UICC card.
+  @param [in] sim_id sim_id to be used.
+  @param [out] channel_id Channel opened.
+  @return Whether the logical channel was successfully opened.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_open_logical_channel(int sim_id, uint8_t *channel_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Closes a logical channel on a UICC card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] channel_id Channel to be closed.
+  @return Whether the logical channel was successfully closed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_close_logical_channel(int sim_id, uint8_t channel_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sends an APDU to the card.
+  @param [in] sim_id sim_id to be used.
+  @param [in] channel_id Channel to be used.
+  @param [inout] p_apdu Pointer of ql_ms_sim_apdu_t.
+  @note You must call ql_ms_sim_open_logical_channel before sending an APDU.
+  @return Whether the APDU was successfully sent.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_send_apdu(int sim_id, uint8_t channel_id, ql_sim_apdu_t *p_apdu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets SIM card status callback handler
+  @param [in] sim_id sim_id to be used.
+  @param[in] cb call back handler.
+  @return Whether the card status callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_set_card_status_cb(int sim_id, ql_ms_sim_card_status_cb_f cb);
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sim_set_service_error_cb(ql_sim_service_error_cb_f cb);
+
+int ql_ms_sim_switch_slot(int sim_id, QL_SIM_PHY_SLOT_E phy_slot);
+int ql_ms_sim_get_active_slots(int sim_id, ql_sim_active_slots_t *p_active_slots);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_ms_sms.c b/mbtk/libql_lib_v2_rilv2/ql_ms_sms.c
new file mode 100755
index 0000000..c4f90c4
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_ms_sms.c
@@ -0,0 +1,206 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_ms_sms.h 
+  @brief short message service API, support Dual Sim Dual Active(DSDA). 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2021 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  2021069   Stan.li       Created.
+-------------------------------------------------------------------------------------------------*/
+#ifndef __QL_MS_SMS_H__
+#define __QL_MS_SMS_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ql_type.h"
+#include "ql_sms.h"
+
+
+typedef void (*ql_ms_sms_msg_async_cb_f)(int sim_id, int id, int result);
+typedef void (*ql_ms_sms_msg_recv_cb_f)(int sim_id, ql_sms_msg_t *p_msg, ql_sms_timestamp_t *timestamp,
+                                             ql_sms_user_data_head_t *head);
+typedef void (*ql_ms_sms_pdu_async_cb_f)(int sim_id, int id, int result);
+typedef void (*ql_ms_sms_pdu_recv_cb_f)(int sim_id, ql_sms_pdu_t *p_pdu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Initializes SMS service.
+  @return Whether the SMS service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes SMS service.
+  @return Whether the SMS service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets the service center address.
+  @param[in] sim id number
+  @param[in] addr service center address.
+  @param[in] len  service center address length.
+  @return Whether the service center address was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_set_service_center_addr(int sim_id, char *addr, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets the service center address.
+  @param[in] sim id number
+  @param[out] addr service center address.
+  @param[in] len  service center address length.
+  @return Whether the service center address was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_get_service_center_addr(int sim_id, char *addr, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends message synchronously.
+  @param[in] sim id number
+  @param[in] p_msg pointer to ql_ms_sms_msg_t.
+  @return Whether the message was successfully sent synchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_send_msg(int sim_id, ql_sms_msg_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends message asynchronously.
+  @param[in] sim id number
+  @param[in] p_msg  pointer to ql_ms_sms_msg_t
+  @param[out] id    id for this async operation
+  @param[in] cb     async callback
+  @return Whether the message was successfully sent asynchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_send_msg_async(int sim_id, ql_sms_msg_t *p_msg, int *id, ql_ms_sms_msg_async_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets SMS message reception callback hanlder.
+  @param[in] sim id number
+  @param[in] cb message reception callback handler.
+  @return Whether the message reception callback hanlder was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_set_msg_recv_cb(int sim_id, ql_ms_sms_msg_recv_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends PDU synchronously.
+  @param[in] sim id number
+  @param[in] p_pdu SMS PDU.
+  @return Whether the PDU was successfully sent synchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_send_pdu(int sim_id, ql_sms_pdu_t *p_pdu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends PDU asynchronously.
+  @param[in] sim id number
+  @param[in] p_pdu sms pdu.
+  @param[out] id id for this async operation.
+  @param[in] cb async callback.
+  @return Whether the PDU was successfully sent asynchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_send_pdu_async(int sim_id, ql_sms_pdu_t *p_pdu, int *id, ql_ms_sms_pdu_async_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets SMS PDU reception callback hanlder.
+  @param[in] sim id number
+  @param[in] cb PDU reception callback handler.
+  @return Whether the PDU reception callback hanlder was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_set_pdu_recv_cb(int sim_id, ql_ms_sms_pdu_recv_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_sms_set_service_error_cb(ql_sms_service_error_cb_f cb);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_ms_voice.c b/mbtk/libql_lib_v2_rilv2/ql_ms_voice.c
new file mode 100755
index 0000000..54707e5
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_ms_voice.c
@@ -0,0 +1,428 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_ms_voice.h 
+  @brief Voice service DSDA API. 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20210622   Rambo.shan   Created, Added Voice DSDA API.
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_MS_VOICE_H__
+#define __QL_MS_VOICE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include "ql_voice.h"
+
+typedef void (*ql_ms_voice_ecall_status_cb_f)(int sim_id, uint32_t id, 
+                                                   QL_VOICE_ECALL_MSD_TRANS_STATUS_E status);
+
+typedef void (*ql_ms_voice_ecall_event_cb_f)(int sim_id, ql_voice_ecall_event_t *p_event);
+
+typedef void (*ql_ms_voice_call_cb_f)(int sim_id, ql_voice_record_array_t *p_arr);
+
+/** voice dtmf event callback */
+typedef void (*ql_ms_voice_dtmf_cb_f)(int sim_id, uint32_t id, QL_VOICE_DTMF_EVENT_E event, 
+                                        char *digits, int len); /**< len: length of digits */
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Initializes voice service.
+  @return Whether the voice service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes voice service.
+  @return Whether the voice service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Dials a call.
+  @param[in] num    phone number to dial.
+  @param[in] len    length of phone number, should be less than 
+                    or euqnal to QL_VOICE_MAX_PHONE_NUMBER.
+  @param[out] id    call id.
+  @return Whether a voice call was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_dial(int sim_id, char *num, int len, uint32_t *id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Cancels dialing with given id.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully cancelled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_cancel_dial(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  hangup all dialing.
+  @return Whether all voice call were successfully hangup.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_hangup_all(int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Answers the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully answered.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_answer(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Hangs up the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_hangup(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Holds the call when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully held.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_hold(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Releases the call from hold when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully unheld.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_unhold(int sim_id, uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets call records.
+  @param[in] p_arr  pointer to ql_voice_record_array_t.
+  @return Whether the call records were successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_get_records(int sim_id, ql_voice_record_array_t *p_arr);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Registers or Unregisters forwarding.
+  @param[in] reg    0 - unregister, 1 - register.
+  @param[in] cond   forwarding condition.
+  @param[in] num    phone number.
+  @param[in] len    length of phone numebr.
+  @return Whether the voice call forward was registered or unregistered successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_forwarding(int sim_id, int reg, QL_VOICE_FW_COND_E cond, char *num, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets forwarding status.
+  @param[in]  cond      forwarding condition.
+  @param[out] p_status  pointer to ql_voice_fw_status_t.
+  @return Whether the voice call forward status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_get_forwarding_status(int sim_id, QL_VOICE_FW_COND_E cond, ql_voice_fw_status_t *p_status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Enables or disables call waiting.
+  @param[in] enable 0 - disable, other - enable.
+  @return Whether the voice call waiting was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_waiting(int sim_id, int enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets call waiting status.
+  @param[out] enabled 0 - waiting is disabled, 1 - waiting is enabled.
+  @return Whether the voice call waiting status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_get_waiting_status(int sim_id, int *enabled);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Enables or disables auto answer.
+  @param[in] enable 0 - disable, other - enable.
+  @param[in] sec    wait this `sec' seconds before auto answer.
+  @return Whether the voice call autoanswer was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_autoanswer(int sim_id, int enable, uint32_t sec);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends a DTMF(Dual Tone Multi Frequency) character over the call ID.
+  @param[in] id call id returned from dial.
+  @param[in] c DTMF character to be sent. Valid DTMF characters are 0-9, A-D, '*', '#'.
+  @return Whether a DTMF character was successfully sent.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_send_dtmf_char(int sim_id, uint32_t id, char c);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets voice call callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_set_call_cb(int sim_id, ql_ms_voice_call_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets voice dtmf callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call DTMF repcetion callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_set_dtmf_cb(int sim_id, ql_ms_voice_dtmf_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Dials eCall.
+  @param[in] p_info eCall info.
+  @return Whether a eCall was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_dial(int sim_id, ql_voice_ecall_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Hangs up eCall.
+  @return Whether the eCall was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_hangup(int sim_id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Updates eCall MSD.
+  @param[in] msd Minimum Set of Data.
+  @param[in] msd_len Length of Minimum Set of Data.
+  @return Whether the eCall MSD was successfully updated.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_update_msd(int sim_id, const uint8_t *msd, uint32_t msd_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Pushes eCall MSD.
+  @param[out] state eCall state.
+  @return Whether the eCall MSD was successfully pushed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_push_msd(int sim_id, QL_VOICE_ECALL_STATE_E *state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets eCall config.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_get_config(int sim_id, ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall config.
+  @param[in] item Items to set.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_set_config(int sim_id, int item, ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall event callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall event callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_set_event_cb(int sim_id, ql_ms_voice_ecall_event_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall status callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall status callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_ecall_set_status_cb(int sim_id, ql_ms_voice_ecall_status_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_ms_voice_set_service_error_cb(ql_voice_service_error_cb_f cb);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* __QL_VOICE_H__ */
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_net_usb_dev.c b/mbtk/libql_lib_v2_rilv2/ql_net_usb_dev.c
new file mode 100755
index 0000000..427c88b
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_net_usb_dev.c
@@ -0,0 +1,190 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_net_usb_dev.h 
+  @brief USB net device API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20190709   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_NET_USB_DEV_H__
+#define __QL_NET_USB_DEV_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "ql_net_common.h"
+
+
+typedef void (*ql_net_usb_dev_ind_cb_f)(const char *device,
+        QL_NET_USB_DEV_STATUS_E pre_status,
+        ql_net_usb_dev_t *p_dev);
+
+typedef void (*ql_net_usb_dev_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Initialize the USB net device service
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get USB network device status
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[out] p_dev Return device status information
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  QL_ERR_INTERFACE_NOT_FOUND - device does not exist
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_get_status(const char *device, ql_net_usb_dev_t *p_dev);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get all USB network device list
+  @param[out] list USB network device array
+  @param[in,out] list_len, in-> array size, out->current instance number
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_get_list(ql_net_usb_dev_t *list, int *list_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Set USB network device MTU. If it does not currently exist, then set it after the device 
+  appears.
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[in] mtu MTU 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_set_mtu(const char *device, int mtu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get USB network device MTU
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[out] p_mtu Reutn device MTU
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  QL_ERR_INTERFACE_NOT_FOUND - device does not exist
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_get_mtu(const char *device, int *p_mtu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Set USB network device MAC address. If it does not currently exist, then set it after the device 
+  appears.
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[in] macaddr MAC address, format: XX:XX:XX:XX:XX:XX 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  QL_ERR_INTERFACE_NOT_FOUND - device does not exist
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_set_macaddr(const char *device, const char *macaddr);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Get USB network device MAC address
+  @param[in] device Device name, such as ecm0, rndis0..
+  @param[out] macaddr_buf Return MAC address
+  @param[in] buf_len Buffer size
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  QL_ERR_INTERFACE_NOT_FOUND - device does not exist
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_get_macaddr(const char *device, char *macaddr_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Register USB network device status change event
+  @param[in] cb 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_set_ind_cb(ql_net_usb_dev_ind_cb_f cb);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_set_service_error_cb(ql_net_usb_dev_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Deinitialize the USB net device service
+  @return 
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_net_usb_dev_deinit(void);
+
+#ifdef __cplusplus
+} 
+#endif
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_nf.c b/mbtk/libql_lib_v2_rilv2/ql_nf.c
new file mode 100755
index 0000000..d07a524
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_nf.c
@@ -0,0 +1,135 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_nf.h 
+  @brief Network framework API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20181024   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __QL_NF_H__
+#define __QL_NF_H__
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "ql_net_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+    char name[QL_NET_MAX_NAME_LEN];
+    char ifname[QL_NET_MAX_NAME_LEN];
+    char pre_status[16];
+    char status[16];
+    uint8_t has_addr;
+    ql_net_addr_t addr;
+    uint8_t has_addr6;
+    ql_net_addr6_t addr6;
+} ql_nf_interface_status_t;
+
+typedef void (*ql_nf_interface_status_ind_cb_f)(ql_nf_interface_status_t *p_msg);
+
+typedef void (*ql_nf_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Initialize network service
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Send a command and wait for a response
+  @param[in] cmd Command
+  @param[out] resp_buf Response 
+  @param[in] resp_len Response buffer length 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_cmd(const char *cmd, char *resp_buf, int resp_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Send a command and wait for a response
+  @param[in] cmd Command
+  @param[out] resp_buf Response 
+  @param[in] resp_len Response buffer length 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_INVALID_ARG - as defined
+  QL_ERR_UNKNOWN - unknown error, failed to connect to service
+  QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_cmd_json(const char *cmd, char *resp_buf, int resp_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Register NF interface status change event event
+  @param[in] cb 
+  @return 
+  QL_ERR_OK - successful
+  QL_ERR_NOT_INIT - uninitialized
+  QL_ERR_SERVICE_NOT_READY - service is not ready
+  QL_ERR_INVALID_ARG - Invalid arguments
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_set_interface_status_ind_cb(ql_nf_interface_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_set_service_error_cb(ql_nf_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Deinitialize the data call service
+  @return 
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nf_deinit(void);
+
+#ifdef __cplusplus
+} 
+#endif
+
+#endif
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_nslookup.c b/mbtk/libql_lib_v2_rilv2/ql_nslookup.c
new file mode 100755
index 0000000..9874c04
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_nslookup.c
@@ -0,0 +1,30 @@
+/**
+ *@file     quectel_nslookup.h
+ *@date     2017-07-05
+ *@author   running.qian
+ *@brief    Simple DNS Reslove
+ */
+#ifndef _QUECTEL_NSLOOKUP_H_
+#define _QUECTEL_NSLOOKUP_H_
+
+#include <arpa/inet.h>
+
+typedef enum  {
+    QUERY_IPV4_E,
+    QUERY_IPV6_E
+} QUERY_IP_TYPE;
+
+
+typedef struct {
+    int addr_cnt;//must be set 0 when call QL_nslookup 
+    struct in_addr addr[5];
+    
+    int addr6_cnt;//must be set 0 when call QL_nslookup
+    struct in6_addr addr6[5];
+} hostaddr_info_u;
+
+/**
+ * Perform a DNS query by sending a packet
+ */
+void ql_nslookup(char *host, char *dns_server_ip, QUERY_IP_TYPE ip_type, hostaddr_info_u *resolved_addr);
+#endif
diff --git a/mbtk/libql_lib_v2_rilv2/ql_nw.c b/mbtk/libql_lib_v2_rilv2/ql_nw.c
new file mode 100755
index 0000000..8249cbd
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_nw.c
@@ -0,0 +1,1538 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_nw.c 
+  @brief network registration API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/epoll.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <string.h>
+#include <fcntl.h>
+
+#include "ql_nw.h"
+#include "ql_type.h"
+#include "mbtk_type.h"
+#include "mbtk_ril_api.h"
+
+/*----------------------------------------------DEFINE-------------------------------------------*/
+#define QL_NW_LOGE LOGE
+#define QL_NW_LOGD LOGD
+
+#define MBTK_ERR_OK 0
+
+#define MBTK_BUFF_TEMP_SIZE_8 8
+
+#define QL_NW_MCC_LENGHT  3
+#define QL_NW_MNC_MAX     3
+#define QL_NW_MCC_MNC_MAX 6
+#define QL_NW_MCC_MNC_MIN 5
+
+#define MBTK_READ_EVENT_SIZE    1
+#define MBTK_WRITE_EVENT_SIZE   1
+
+/*----------------------------------------------DEFINE-------------------------------------------*/
+
+/*----------------------------------------------ENUM---------------------------------------------*/
+typedef enum {
+    QL_NW_REG_TYPE_VOICE = 0,
+    QL_NW_REG_TYPE_DATA,
+}ql_nw_reg_type_enum;
+
+typedef enum {
+    QL_NW_EVENT_THREAD_QUIT = 0,
+    QL_NW_EVENT_SIGNAL_CB,
+    QL_NW_EVENT_VOICE_CB,
+    QL_NW_EVENT_MAX = 255,
+}ql_nw_event_enum;
+
+/*----------------------------------------------ENUM---------------------------------------------*/
+
+/*----------------------------------------------STRUCT-------------------------------------------*/
+typedef struct {
+    mbtk_ril_handle*       handle;
+    int                       control[2];
+    pthread_t                 cb_thread_id;
+    ql_nw_signal_strength_ind_cb signal_cb;
+    ql_nw_voice_reg_ind_cb       voice_cb;
+    ql_nw_service_error_cb_f     server_cb;
+}ql_nw_info_handle_t;
+
+/*----------------------------------------------STRUCT-------------------------------------------*/
+
+/*----------------------------------------------GLOBAL STATIC VARIABLE---------------------------*/
+static ql_nw_info_handle_t* nw_handle = NULL;
+
+/*----------------------------------------------GLOBAL STATIC VARIABLE---------------------------*/
+
+/*----------------------------------------------NW FUNCTION--------------------------------------*/
+static int ql_get_cops_state(ql_nw_reg_status_info_t *p_info, ql_nw_info_handle_t *p_handle)
+{
+    int ret = 0;
+    char mcc_mnc[MBTK_BUFF_TEMP_SIZE_8] = {0};
+    mbtk_net_info_t net = {0};
+    memset(&net, 0x0, sizeof(mbtk_net_info_t));
+    ret = mbtk_net_sel_mode_get(p_handle->handle, &net);
+    if(ret != MBTK_ERR_OK)
+    {
+        QL_NW_LOGE("[%s] net sel mode get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    switch(net.net_type)
+    {
+        case MBTK_RADIO_TECH_GSM:
+        case MBTK_RADIO_TECH_GSM_COMPACT:
+        {
+            p_info->radio_tech = QL_NW_RADIO_TECH_GSM;
+            break;
+        }
+        case MBTK_RADIO_TECH_GSM_EGPRS:
+        {
+            p_info->radio_tech = QL_NW_RADIO_TECH_GPRS;
+            break;
+        }
+        case MBTK_RADIO_TECH_UTRAN:
+        {
+            p_info->radio_tech = QL_NW_RADIO_TECH_UMTS;
+            break;
+        }
+        case MBTK_RADIO_TECH_UTRAN_HSDPA:
+        {
+            p_info->radio_tech = QL_NW_RADIO_TECH_HSDPA;
+            break;
+        }
+        case MBTK_RADIO_TECH_UTRAN_HSUPA:
+        {
+            p_info->radio_tech = QL_NW_RADIO_TECH_HSUPA;
+            break;
+        }
+        case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
+        {
+            p_info->radio_tech = QL_NW_RADIO_TECH_HSPA;
+            break;
+        }
+        case MBTK_RADIO_TECH_UTRAN_HSPA:
+        {
+            p_info->radio_tech = QL_NW_RADIO_TECH_HSPAP;
+            break;
+        }
+        case MBTK_RADIO_TECH_E_UTRAN:
+        {
+            p_info->radio_tech = QL_NW_RADIO_TECH_LTE;
+            break;
+        }
+        default:
+        {
+            p_info->radio_tech = QL_NW_RADIO_TECH_NONE;
+            break;
+        }
+    }
+
+    memset(mcc_mnc, 0x0, MBTK_BUFF_TEMP_SIZE_8);
+    ret = snprintf(mcc_mnc, MBTK_BUFF_TEMP_SIZE_8, "%d", net.plmn);
+    if(ret != QL_NW_MCC_MNC_MIN &&  ret != QL_NW_MCC_MNC_MAX)
+    {
+        QL_NW_LOGE("[%s] mcc mnc get fail.[%d]", __func__, ret);
+    }
+    else
+    {
+        memcpy(p_info->mcc, mcc_mnc, QL_NW_MCC_LENGHT);
+        memcpy(p_info->mnc, mcc_mnc + QL_NW_MCC_LENGHT, ret - QL_NW_MCC_LENGHT);
+    }
+
+    return QL_ERR_OK;
+}
+
+static int ql_get_creg_state(ql_nw_reg_status_info_t *p_info, ql_nw_info_handle_t *p_handle, ql_nw_reg_type_enum reg_type)
+{
+    int ret = 0;
+    uint8 reg_state = 0;
+    mbtk_net_reg_info_t reg;
+    memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
+    ret = mbtk_net_reg_get(p_handle->handle, &reg);
+    if(ret != MBTK_ERR_OK)
+    {
+        QL_NW_LOGE("[%s] net reg get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    if(reg_type == QL_NW_REG_TYPE_VOICE)
+    {
+        if(reg.ims_state == 0)
+        {
+            reg_state = reg.call_state;
+        }
+        else
+        {
+            reg_state = reg.ims_state;
+        }
+    }
+    else
+    {
+        if(reg.type == MBTK_RADIO_TECH_E_UTRAN)
+        {
+            reg_state = reg.data_state;
+        }
+        else
+        {
+            reg_state = reg.call_state;
+        }
+    }
+
+    p_info->deny_reason = QL_NW_CS_DOMAIN_NOT_AVAILABLE_DENY_REASON;
+    switch(reg_state)
+    {
+        case MBTK_NET_REG_STATE_HOME:
+        {
+            p_info->reg_state = QL_NW_SERVICE_FULL;
+            p_info->roaming = QL_NW_ROAM_STATE_OFF;
+            break;
+        }
+        case MBTK_NET_REG_STATE_DENIED:
+        {
+            p_info->reg_state = QL_NW_SERVICE_NONE;
+            p_info->roaming = QL_NW_ROAM_STATE_OFF;
+            p_info->deny_reason = QL_NW_CS_DOMAIN_NOT_AVAILABLE_DENY_REASON; //now not support
+            break;
+        }
+        case MBTK_NET_REG_STATE_ROAMING:
+        {
+            p_info->reg_state = QL_NW_SERVICE_FULL;
+            p_info->roaming = QL_NW_ROAM_STATE_ON;
+            break;
+        }
+        case MBTK_NET_REG_STATE_SMS_ONLY:
+        case MBTK_NET_REG_STATE_CSFB_HOME:
+        case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
+        {
+            p_info->reg_state = QL_NW_SERVICE_LIMITED;
+            p_info->roaming = QL_NW_ROAM_STATE_OFF;
+            break;
+        }
+        case MBTK_NET_REG_STATE_ROAMING_SMS:
+        case MBTK_NET_REG_STATE_CSFB_ROAMING:
+        {
+            p_info->reg_state = QL_NW_SERVICE_LIMITED;
+            p_info->roaming = QL_NW_ROAM_STATE_ON;
+            break;
+        }
+        case MBTK_NET_REG_STATE_NON:
+        case MBTK_NET_REG_STATE_SEARCHING:
+        case MBTK_NET_REG_STATE_UNKNOWN:
+        case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
+        default:
+        {
+            p_info->reg_state = QL_NW_SERVICE_NONE;
+            p_info->roaming = QL_NW_ROAM_STATE_OFF;
+            break;
+        }
+    }
+
+    p_info->cid = reg.ci;
+    p_info->lac = reg.lac;
+
+    return QL_ERR_OK;
+}
+
+static int8_t rssi_convert_to_dBm(uint8 rssi)
+{
+    if(rssi <= 31)
+    {
+        return rssi * 2 - 113;
+    }
+    else
+    {
+        return -125;
+    }
+}
+
+static int16_t rsrp_convert_to_dBm(uint8 rsrp)
+{
+    if(rsrp <= 96)
+    {
+        return rsrp - 140;
+    }
+    else
+    {
+        return -44;
+    }
+}
+
+static int16_t rsrq_convert_to_dB(uint8 rsrq)
+{
+    if(rsrq >= 1 && rsrq <= 34)
+    {
+        return (rsrq + 1) / 2 - 20;
+    }
+    else
+    {
+        return  -20; 
+    }
+}
+
+static int16_t ecno_convert_to_dB(uint8 ecno)
+{
+    if(ecno >= 48)
+    {
+        return 0;
+    }
+    else if(ecno == 255)
+    {
+        return 255;
+    }
+    else
+    {
+        return 48 - ecno;
+    }
+}
+
+static QL_NW_SIGNAL_STRENGTH_LEVEL_E ql_rssi_convert_level(uint8 rssi)
+{
+    //rssi 0 - 31,99
+    if(rssi == 0 || rssi == 99)
+    {
+        return QL_NW_SIGNAL_STRENGTH_LEVEL_NONE;
+    }
+    else if(rssi >= 1 && rssi < 10)
+    {
+        return QL_NW_SIGNAL_STRENGTH_LEVEL_POOR;
+    }
+    else if(rssi >= 10 && rssi < 20)
+    {
+        return QL_NW_SIGNAL_STRENGTH_LEVEL_MODERATE;
+    }
+    else if(rssi >= 20 && rssi <= 30)
+    {
+        return QL_NW_SIGNAL_STRENGTH_LEVEL_GOOD;
+    }
+    else
+    {
+        return QL_NW_SIGNAL_STRENGTH_LEVEL_GREAT;
+    }
+}
+
+static void ql_signal_state_change_cb(const void* data, int data_len)
+{
+    if(data && data_len == 8)
+    {
+        uint8 *net_data = (uint8*)data;
+        mbtk_radio_technology_enum type = (mbtk_radio_technology_enum)net_data[0];
+        QL_NW_LOGD("[%s] reg_type[%d].", __func__, type);
+        ql_nw_event_enum cmd = QL_NW_EVENT_SIGNAL_CB;
+        if(nw_handle->control[0] >= 0)
+        {
+            int ret = write(nw_handle->control[0], &cmd, MBTK_WRITE_EVENT_SIZE);
+            if(ret != MBTK_WRITE_EVENT_SIZE)
+            {
+                QL_NW_LOGE("[%s] write fail.[%d]", __func__, ret);
+            }
+        }
+    }
+    else
+    {
+        QL_NW_LOGD("[%s] unknown data.", __func__);
+    }
+
+}
+
+static void ql_net_state_change_cb(const void* data, int data_len)
+{
+    if(data)
+    {
+        ql_nw_event_enum cmd = QL_NW_EVENT_VOICE_CB;
+        if(nw_handle->control[0] >= 0)
+        {
+            int ret = write(nw_handle->control[0], &cmd, MBTK_WRITE_EVENT_SIZE);
+            if(ret != MBTK_WRITE_EVENT_SIZE)
+            {
+                QL_NW_LOGE("[%s] write fail.[%d]", __func__, ret);
+            }
+        }
+    }
+    else
+    {
+        QL_NW_LOGD("[%s] unknown data.", __func__);
+    }
+}
+
+static void ql_nw_server_change_cb(const void* data, int data_len)
+{
+    if(data_len != sizeof(int))
+    {
+        QL_NW_LOGE("[%s] data_len[%d] than int[%d] fail. ", __func__, data_len, sizeof(int));
+    }
+    else
+    {
+        int server_state = *(int *)data;
+        if(server_state == 1 && nw_handle->server_cb)
+        {
+            nw_handle->server_cb(QL_ERR_ABORTED);
+        }
+    }
+}
+
+static int ql_epoll_register(int epoll_fd, int fd)
+{
+    struct epoll_event  ev;
+    int    ret, flags;
+
+    /* important: make the fd non-blocking */
+    flags = fcntl(fd, F_GETFL);
+    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+
+    ev.events  = EPOLLIN;
+    ev.data.fd = fd;
+
+    do 
+    {
+        ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev);
+        if(ret < 0)
+        {
+            QL_NW_LOGE("[%s] epoll_ctl fail.[%s]", __func__, strerror(errno));
+        }
+    } while (ret < 0 && errno == EINTR);
+    
+    return QL_ERR_OK;
+}
+
+static void* ql_cb_thread(void* arg)
+{
+    ql_nw_info_handle_t* info = (ql_nw_info_handle_t*)arg;
+    
+    if(info->control[0] < 0 && info->control[0] < 0)
+    {
+        if(socketpair(AF_LOCAL, SOCK_STREAM, 0, info->control ) < 0)
+        {
+            QL_NW_LOGE("[%s] control creat fail.", __func__);
+            return NULL;
+        }
+    }
+    
+    int ne = 0;
+    int nevents = 0;
+    int ret = 0;
+    struct epoll_event events[3];
+    int control_fd = info->control[1];
+    ql_nw_event_enum cmd = QL_NW_EVENT_THREAD_QUIT;
+    
+    //A maximum of three events can be processed simultaneously
+    int epoll_fd = epoll_create(3);
+    ql_epoll_register(epoll_fd, control_fd);
+    
+    QL_NW_LOGE("[%s] thread start run.", __func__);
+    while(1)
+    {
+        nevents = epoll_wait(epoll_fd, events, 3, -1);
+        if(nevents < 0)
+        {
+            if(errno != EINTR)
+            {
+                QL_NW_LOGE("[%s] epoll_wait fail.[%s]", __func__, strerror(errno));
+            }
+            continue;
+        }
+
+        for (ne = 0; ne < nevents; ne++)
+        {
+            if((events[ne].events & (EPOLLERR|EPOLLHUP)) != 0)
+            {
+                QL_NW_LOGE("[%s] EPOLLERR or EPOLLHUP event error.", __func__);
+                break;
+            }
+
+            if ((events[ne].events & EPOLLIN) != 0)
+            {
+                if (events[ne].data.fd == control_fd)
+                {
+                    ret = read(control_fd, &cmd, MBTK_READ_EVENT_SIZE);
+                    if(ret != MBTK_READ_EVENT_SIZE)
+                    {
+                        QL_NW_LOGE("[%s] read fail.[%d]", __func__, ret);
+                    }
+                    else
+                    {
+                        switch(cmd)
+                        {
+                            case QL_NW_EVENT_THREAD_QUIT:
+                            {
+                                close(epoll_fd);
+                                epoll_fd = -1;
+                                if(info->control[0] >= 0)
+                                {
+                                    close(info->control[0]);
+                                    info->control[0] = -1;
+                                }
+                                if(info->control[1] >= 0)
+                                {
+                                    close(info->control[1]);
+                                    info->control[1] = -1;
+                                }
+                                QL_NW_LOGD("[%s] thread quit.", __func__);
+                                return NULL;
+                            }
+                            case QL_NW_EVENT_SIGNAL_CB:
+                            {
+                                if(info->signal_cb)
+                                {
+                                    ql_nw_signal_strength_info_t signal_info = {0};
+                                    QL_NW_SIGNAL_STRENGTH_LEVEL_E level = QL_NW_SIGNAL_STRENGTH_LEVEL_MIN;
+                                    ql_nw_get_signal_strength(&signal_info, &level);
+                                    info->signal_cb(&signal_info, level);
+                                }
+                                break;
+                            }
+                            case QL_NW_EVENT_VOICE_CB:
+                            {
+                                if(info->voice_cb)
+                                {
+                                    ql_nw_reg_status_info_t voice_reg_info = {0};
+                                    ql_nw_get_voice_reg_status(&voice_reg_info);
+                                    info->voice_cb(&voice_reg_info);
+                                }
+                                break;
+                            }
+                            default:
+                            {
+                                QL_NW_LOGE("[%s] unknown event.[%d]", __func__, cmd);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+static int ql_cb_thread_creat(ql_nw_info_handle_t *info)
+{
+    if(info->cb_thread_id == 0)
+    {
+        pthread_attr_t thread_attr;
+        pthread_attr_init(&thread_attr);
+        if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
+        {
+            QL_NW_LOGE("[%s] pthread_attr_setdetachstate fail.", __func__);
+            return QL_ERR_FAILED;
+        }
+        if(pthread_create(&(info->cb_thread_id), &thread_attr, ql_cb_thread, info))
+        {
+            QL_NW_LOGE("[%s] pthread_create fail.[%ld]", __func__, info->cb_thread_id);
+            return QL_ERR_FAILED;
+        }
+        QL_NW_LOGD("[%s] pthread_create success.[%ld]", __func__, info->cb_thread_id);
+    }
+
+    return QL_ERR_OK;
+}
+
+static int ql_cb_thread_free(ql_nw_info_handle_t *info)
+{
+    int ret = 0;
+    if(info->cb_thread_id != 0)
+    {
+        ql_nw_event_enum cmd = QL_NW_EVENT_THREAD_QUIT;
+        if(info->control[0] >= 0)
+        {
+            ret = write(info->control[0], &cmd, MBTK_WRITE_EVENT_SIZE);
+            if(ret != MBTK_WRITE_EVENT_SIZE)
+            {
+                QL_NW_LOGE("[%s] write fail.[%d]", __func__, ret);
+                return QL_ERR_FAILED;
+            }
+        }
+        info->cb_thread_id = 0;
+        QL_NW_LOGE("[%s] pthread quit success.", __func__);
+    }
+
+    return QL_ERR_OK;
+}
+
+/*----------------------------------------------NW FUNCTION--------------------------------------*/
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize NW service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the NW service was successfully intialized.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_init(void)
+{
+    if(NULL == nw_handle)
+    {
+        nw_handle = (ql_nw_info_handle_t*)malloc(sizeof(ql_nw_info_handle_t));
+        if(NULL == nw_handle)
+        {
+            QL_NW_LOGE("[%s] nw handle malloc fail.", __func__);
+            return QL_ERR_FAILED;
+        }
+
+        nw_handle->handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+        if(NULL == nw_handle->handle)
+        {
+            QL_NW_LOGE("[%s] mbtk handle init fail.", __func__);
+            goto error_1;
+        }
+
+        int ret = mbtk_signal_state_change_cb_reg(ql_signal_state_change_cb);
+        if(ret != MBTK_ERR_OK)
+        {
+            QL_NW_LOGE("[%s] set nw signal cb fail.[%d]", __func__, ret);
+            goto error_2;
+        }
+
+        ret = mbtk_net_reg_state_change_cb_reg(ql_net_state_change_cb);
+        if(ret != MBTK_ERR_OK)
+        {
+            QL_NW_LOGE("[%s] set nw signal cb fail.[%d]", __func__, ret);
+            goto error_2;
+        }
+
+        ret = mbtk_ril_ser_state_change_cb_reg(ql_nw_server_change_cb);
+        if(ret != MBTK_ERR_OK)
+        {
+            QL_NW_LOGE("[%s] set sim server cb fail.[%d]", __func__, ret);
+            goto error_2;
+        }
+
+        nw_handle->signal_cb = NULL;
+        nw_handle->voice_cb = NULL;
+        nw_handle->control[0] = -1;
+        nw_handle->control[1] = -1;
+        nw_handle->cb_thread_id = 0;
+    }
+
+    return QL_ERR_OK;
+error_2:
+    if(nw_handle->handle)
+    {
+        mbtk_ril_close(MBTK_AT_PORT_DEF);;
+        nw_handle->handle = NULL;
+    }
+error_1:
+    if(nw_handle)
+    {
+        free(nw_handle);
+        nw_handle = NULL;
+    }
+    return QL_ERR_FAILED;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes NW service.
+  @return Whether the NW service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_deinit(void)
+{
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    int ret = 0;
+    nw_handle->voice_cb = NULL;
+    nw_handle->signal_cb = NULL;
+    
+    if(NULL != nw_handle->handle)
+    {
+        ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if(ret != MBTK_ERR_OK)
+        {
+            QL_NW_LOGE("[%s] mbtk handle deinit fail.[%d]", __func__, ret);
+            return QL_ERR_FAILED;
+        }
+        nw_handle->handle = NULL;
+    }
+
+    ret = ql_cb_thread_free(nw_handle);
+    if(ret != QL_ERR_OK)
+    {
+        QL_NW_LOGE("[%s] cb thread free deinit fail.", __func__);
+        return QL_ERR_FAILED;
+    }
+
+    free(nw_handle);
+    nw_handle = NULL;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief scan network status.
+  @param[out] async_index The index of request msg
+  @param[in] async_cb The callback function of request msg
+  @return Whether to successfully trigger the network scan operation
+  @retval QL_ERR_OK  successful
+  @retval QL_ERR_NOT_INIT  uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY  service is not ready
+  @retval QL_ERR_INVALID_ARG  Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_network_scan(int *async_index, ql_nw_network_scan_async_cb async_cb)
+{
+    UNUSED(async_index);
+    UNUSED(async_cb);
+    
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set power mode.
+  @param[in] lower_mode, defined by QL_NW_LOWER_POWER_MASK_XXX
+  @return Whether to successfully set the power mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_power_mode(uint8_t lower_mode)
+{ 
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    uint32 mode = 0;
+    if((lower_mode & QL_NW_LOWER_POWER_MASK_NORMAL) == QL_NW_LOWER_POWER_MASK_NORMAL)
+    {
+        mode |= 0x1;
+    }
+
+    if((lower_mode & QL_NW_LOWER_POWER_MASK_NETWORK) == QL_NW_LOWER_POWER_MASK_NETWORK)
+    {
+        mode |= 0x1;
+    }
+
+    if((lower_mode & QL_NW_LOWER_POWER_MASK_SIM) == QL_NW_LOWER_POWER_MASK_SIM)
+    {
+        mode |= 0x2;
+    }
+
+    if((lower_mode & QL_NW_LOWER_POWER_MASK_SMS) == QL_NW_LOWER_POWER_MASK_SMS)
+    {
+        mode |= 0x4;
+    }
+
+    if((lower_mode & QL_NW_LOWER_POWER_MASK_VOICE) == QL_NW_LOWER_POWER_MASK_VOICE)
+    {
+        mode |= 0x8;
+    }
+
+    int ret = 0;
+    ret = mbtk_wakeup_state_set(nw_handle->handle, mode);
+    if(ret != MBTK_ERR_OK)
+    {
+        QL_NW_LOGE("[%s] wakeup state set fail.[%d]", ret);
+        return QL_ERR_FAILED;
+    }
+    
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set perferred NW mode and roaming indicator.
+  @param[in] p_info Pointer that point to ql_nw_pref_nwmode_roaming_info_t
+  @return Whether to successfully set nwmode and roaming
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_pref_nwmode_roaming(ql_nw_pref_nwmode_roaming_info_t *p_info)
+{
+    UNUSED(p_info);
+    
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get perferred NW mode and roaming indicator.
+  @param[out] p_info Pointer that point to ql_nw_pref_nwmode_roaming_info_t 
+  @return Whether to successfully get nwmode and roaming
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_pref_nwmode_roaming(ql_nw_pref_nwmode_roaming_info_t *p_info)
+{
+    UNUSED(p_info);
+    
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get mobile operator name.
+  @param[out] p_info Pointer that point to ql_nw_mobile_operator_name_info_t
+  @return Whether to successfully get the mobile operator name
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_mobile_operator_name(ql_nw_mobile_operator_name_info_t *p_info)
+{
+    UNUSED(p_info);
+    
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get cell information.
+  @param[out] p_info Pointer that point to ql_nw_cell_info_t
+  @return Whether to successfully get the cell information
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_cell_info(ql_nw_cell_info_t *p_info)
+{
+    UNUSED(p_info);
+    
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get voice registration status.
+  @param[out] p_info Pointer that point to ql_nw_reg_status_info_t
+  @return Whether to successfully get the voice registration status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_voice_reg_status(ql_nw_reg_status_info_t *p_info)
+{   
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == p_info)
+    {
+        QL_NW_LOGE("[%s] p_info is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int ret = 0;
+    ql_nw_reg_status_info_t reg_status_info = {0};
+    memset(&reg_status_info, 0x0, sizeof(ql_nw_reg_status_info_t));
+    reg_status_info.tech_domain = QL_NW_TECH_DOMAIN_3GPP; //default
+
+    //get radio_tech mcc mnc
+    ret = ql_get_cops_state(&reg_status_info, nw_handle);
+    if(ret != QL_ERR_OK)
+    {
+        QL_NW_LOGE("[%s] get cops state fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    //get roaming deny_reason reg_state cid lac
+    ret = ql_get_creg_state(&reg_status_info, nw_handle, QL_NW_REG_TYPE_VOICE);
+    if(ret != QL_ERR_OK)
+    {
+        QL_NW_LOGE("[%s] get creg fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    memcpy(p_info, &reg_status_info, sizeof(ql_nw_reg_status_info_t));
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get data registration status.
+  @param[out] p_info Pointer that point to ql_nw_reg_status_info_t
+  @return Whether to successfully get the data registration status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_data_reg_status(ql_nw_reg_status_info_t *p_info)
+{
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == p_info)
+    {
+        QL_NW_LOGE("[%s] p_info is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int ret = 0;
+    ql_nw_reg_status_info_t reg_status_info = {0};
+    memset(&reg_status_info, 0x0, sizeof(ql_nw_reg_status_info_t));
+    reg_status_info.tech_domain = QL_NW_TECH_DOMAIN_3GPP; //default
+
+    //get radio_tech mcc mnc
+    ret = ql_get_cops_state(&reg_status_info, nw_handle);
+    if(ret != QL_ERR_OK)
+    {
+        QL_NW_LOGE("[%s] get cops state fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    //get roaming deny_reason reg_state cid lac
+    ret = ql_get_creg_state(&reg_status_info, nw_handle, QL_NW_REG_TYPE_DATA);
+    if(ret != QL_ERR_OK)
+    {
+        QL_NW_LOGE("[%s] get creg fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    memcpy(p_info, &reg_status_info, sizeof(ql_nw_reg_status_info_t));
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get current signal strength.
+  @param[out] p_info Pointer that point to ql_nw_signal_strength_info_t
+  @param[out] p_level: signal strength level
+  @return Whether to successfully get the signal strength
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_signal_strength(ql_nw_signal_strength_info_t *p_info, QL_NW_SIGNAL_STRENGTH_LEVEL_E* p_level)
+{   
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == p_info || NULL == p_level)
+    {
+        QL_NW_LOGE("[%s] param is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int ret = 0;
+    mbtk_signal_info_t signal;
+    memset(&signal, 0x0, sizeof(mbtk_signal_info_t));
+    ret = mbtk_net_signal_get(nw_handle->handle, &signal);
+    if(ret != MBTK_ERR_OK)
+    {
+        QL_NW_LOGE("[%s] net signal get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    memset(p_info, 0x0, sizeof(ql_nw_signal_strength_info_t));
+    
+    switch(signal.type)
+    {
+        case MBTK_RADIO_TECH_GSM:
+        case MBTK_RADIO_TECH_GSM_COMPACT:
+        case MBTK_RADIO_TECH_GSM_EGPRS:
+        {
+            p_info->has_gsm = TRUE;
+            p_info->gsm.rssi = rssi_convert_to_dBm(signal.rssi);
+            break;
+        }
+        case MBTK_RADIO_TECH_E_UTRAN:
+        {
+            p_info->has_lte = TRUE;
+            p_info->lte.rssi = rssi_convert_to_dBm(signal.rssi);
+            p_info->lte.rsrq = rsrq_convert_to_dB(signal.rsrq);
+            p_info->lte.rsrp = rsrp_convert_to_dBm(signal.rsrp);
+            p_info->lte.snr = 0x7FFF;//->MBTK??????(?????rssnr,??INT_MAX:0x7FFFFFFFF?????),????0x7FFFFFFFF 
+            break;
+        }
+        case MBTK_RADIO_TECH_UTRAN:
+        case MBTK_RADIO_TECH_UTRAN_HSDPA:
+        case MBTK_RADIO_TECH_UTRAN_HSUPA:
+        case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
+        case MBTK_RADIO_TECH_UTRAN_HSPA:
+        {
+            p_info->has_wcdma = TRUE;
+            p_info->wcdma.rssi = rssi_convert_to_dBm(signal.rssi);
+            p_info->wcdma.ecio = ecno_convert_to_dB(signal.ecno);
+            break;
+        }
+        default:
+        {
+            QL_NW_LOGE("[%s] unknown reg type.[%d]", __func__, signal.type);
+            break;
+        }
+    }
+
+    *p_level = ql_rssi_convert_level(signal.rssi);
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get current cell acccess status.
+  @param[out] p_info Pointer that point to QL_NW_CELL_ACCESS_STATE_TYPE_E
+  @return Whether to successfully get the cell access status
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_cell_access_status(QL_NW_CELL_ACCESS_STATE_TYPE_E *p_info)
+{
+    UNUSED(p_info);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get network time.
+  @param[out] p_info Pointer that point to ql_nw_nitz_time_info_t 
+  @return Whether to successfully get the network time
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_nitz_time_info(ql_nw_nitz_time_info_t *p_info)
+{
+    UNUSED(p_info);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register voice registration event.
+  @param[in] cb_func Voice registration indication callback function
+  @return Whether the voice registration event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+ */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_voice_reg_ind_cb(ql_nw_voice_reg_ind_cb cb_func)
+{
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    int ret = QL_ERR_OK;
+    if(NULL != cb_func)
+    {
+        ret = ql_cb_thread_creat(nw_handle);
+        if(ret != QL_ERR_OK)
+        {
+            QL_NW_LOGE("[%s] cb thread creat fail.", __func__);
+        }
+    }
+    else
+    {
+        ret = ql_cb_thread_free(nw_handle);
+        if(ret != QL_ERR_OK)
+        {
+            QL_NW_LOGE("[%s] cb thread free deinit fail.", __func__);
+            return QL_ERR_FAILED;
+        }
+    }
+
+    nw_handle->voice_cb = cb_func;
+    
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register data registration event.
+  @param[in] cb_func Data registration indication callback function
+  @return Whether the data registration event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_data_reg_ind_cb(ql_nw_data_reg_ind_cb cb_func)
+{
+    UNUSED(cb_func);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register signal strength event.
+  @param[in] cb_func Signal strength indication callback function
+  @return Whether the signal strength event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_signal_strength_ind_cb(ql_nw_signal_strength_ind_cb cb_func)
+{
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    int ret = QL_ERR_OK;
+    if(NULL != cb_func)
+    {
+        ret = ql_cb_thread_creat(nw_handle);
+        if(ret != QL_ERR_OK)
+        {
+            QL_NW_LOGE("[%s] cb thread creat fail.", __func__);
+        }
+    }
+    else
+    {
+        ret = ql_cb_thread_free(nw_handle);
+        if(ret != QL_ERR_OK)
+        {
+            QL_NW_LOGE("[%s] cb thread free deinit fail.", __func__);
+            return QL_ERR_FAILED;
+        }
+    }
+
+    nw_handle->signal_cb = cb_func;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register cell access status event.
+  @param[in] cb_func Cell access status indication callback function
+  @return Whether the cell access status event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_cell_access_status_ind_cb(ql_nw_cell_access_status_ind_cb cb_func)
+{
+    UNUSED(cb_func);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register network time event.
+  @param[in] cb_func nitz time update indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_nitz_time_update_ind_cb(ql_nw_nitz_time_update_ind_cb cb_func)
+{
+    UNUSED(cb_func);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register wea alert event.
+  @param[in] cb_func wea alert indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_wea_alert_ind_cb(ql_nw_wea_reg_ind_cb cb_func)
+{
+    UNUSED(cb_func);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register etws alert event.
+  @param[in] cb_func etws alert indication callback function
+  @return Whether the network time event was successfully registered
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_etws_alert_ind_cb(ql_nw_etws_reg_ind_cb cb_func)
+{
+    UNUSED(cb_func);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set wea alert config.
+  @param[in] item Items to set.
+  @param[in] p_info Pointer that point to ql_nw_wea_config_t.
+  @return Whether to successfully set the wea config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_wea_config(int item, ql_nw_wea_config_t *p_info)
+{
+    UNUSED(p_info);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets wea config.
+  @param[out] p_config wea config.
+  @return Whether the wea config was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_wea_config(ql_nw_wea_config_t *p_config)
+{
+    UNUSED(p_config);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set etws alert config.
+  @param[in] etws config.
+  @return Whether to successfully set the etws config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_etws_config(uint8_t enable_etws)
+{
+    UNUSED(enable_etws);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get etws alert config.
+  @param[out] p_enable_etws Pointer.
+  @return Whether to successfully set the etws config.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_etws_config(uint8_t* p_enable_etws)
+{
+    UNUSED(p_enable_etws);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  bind subscription 
+  @param[in] sub_type subscription type 
+  @return Whether to successfully bind subscription.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_bind_subscription(QL_NW_BIND_SUB_TYPE_E sub_type)
+{
+    UNUSED(sub_type);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get high capability subscription.
+  @param[out] p_high_cap pointer that point to QL_NW_BIND_SUB_TYPE_E
+  @return Whether the high capability subscription was successfully obtained.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_get_high_cap_sub(QL_NW_BIND_SUB_TYPE_E *p_high_cap)
+{
+    UNUSED(p_high_cap);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set the SIM card index that can uniquely register to the 5G network. 
+  the main difference between high and non-high capability subscription is that high capability 
+  subscription can register to 5G network while non-high capability subscription can only 
+  register to LTE or GSM.
+  @param[in] high_cap high capability subscription 
+  @return Whether to successfully set the high capability subscription.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_high_cap_sub(QL_NW_BIND_SUB_TYPE_E high_cap)
+{
+    UNUSED(high_cap);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Disable NR5G, NR5G_SA and NR5G_NSA can be disabled individually or together.
+  @param[in] opt_mask Option mask value. Value:
+  0                 - Do not disable NR5G
+  QL_NW_NR5G_SO_SA  - Disable NR5G SA
+  QL_NW_NR5G_SO_NSA - Disable NR5G NSA 
+  @return Whether to successfully disable NR5G mode.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_disable_nr5g(uint16_t opt_mask)
+{
+    UNUSED(opt_mask);
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_nw_set_service_error_cb(ql_nw_service_error_cb_f cb)
+{
+    if(NULL == nw_handle)
+    {
+        QL_NW_LOGE("[%s] nw handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    nw_handle->server_cb = cb;
+
+    return QL_ERR_OK;
+}
+
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_sim.c b/mbtk/libql_lib_v2_rilv2/ql_sim.c
new file mode 100755
index 0000000..7028f1c
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_sim.c
@@ -0,0 +1,1497 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_sim.h
+  @brief SIM service API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/epoll.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <string.h>
+#include <fcntl.h>
+
+#include "ql_sim.h"
+#include "ql_type.h"
+#include "mbtk_type.h"
+#include "mbtk_ril_api.h"
+#include "mbtk_list.h"
+#include "mbtk_log.h"
+
+/*----------------------------------------------DEFINE-------------------------------------------*/
+#define MBTK_ERR_OK             0
+
+#define MBTK_PIN_VALUE_LENGTH   16
+#define MBTK_BUFF_TEMP_SIZE_16  16
+#define MBTK_BUFF_TEMP_SIZE_32  32
+#define MBTK_BUFF_TEMP_SIZE_64  64
+#define MBTK_BUFF_TEMP_SIZE_128 128
+
+#define MBTK_READ_EVENT_SIZE    1
+#define MBTK_WRITE_EVENT_SIZE   1
+
+#define QL_SIM_LOGE LOGE
+#define QL_SIM_LOGD LOGD
+
+#define MBTK_PIN_ENABLE 1
+/*----------------------------------------------DEFINE-------------------------------------------*/
+
+/*----------------------------------------------ENUM-------------------------------------------*/
+typedef enum {
+    QL_SIM_EVENT_THREAD_QUIT = 0,
+    QL_SIM_EVENT_STATE_CHANGE,
+    QL_SIM_EVENT_MAX = 255,
+}ql_sim_event_enum;
+
+/*----------------------------------------------ENUM-------------------------------------------*/
+
+/*----------------------------------------------STRUCT-------------------------------------------*/
+typedef struct {
+    mbtk_ril_handle*       handle;
+    int                       control[2];
+    pthread_t                 cb_thread_id;
+    ql_sim_card_status_cb_f   status_cb;
+    ql_sim_service_error_cb_f server_cb;
+}ql_sim_info_handle_t;
+
+/*----------------------------------------------STRUCT-------------------------------------------*/
+
+/*----------------------------------------------GLOBAL STATIC VARIABLE---------------------------*/
+static ql_sim_info_handle_t* sim_handle = NULL;
+
+/*----------------------------------------------GLOBAL STATIC VARIABLE---------------------------*/
+
+/*----------------------------------------------SIM FUNCTION-------------------------------------*/
+static void ql_sim_state_change_cb(const void* data, int data_len)
+{
+    if(data_len != sizeof(mbtk_ril_sim_state_info_t))
+    {
+        QL_SIM_LOGE("[%s] data_len[%d] than sim[%d] fail. ", __func__, data_len, sizeof(mbtk_ril_sim_state_info_t));
+    }
+    else
+    {
+        mbtk_ril_sim_state_info_t *ptr = (mbtk_ril_sim_state_info_t*)data;
+        QL_SIM_LOGD("[%s] state[%d] type[%d].", __func__, ptr->sim_state , ptr->sim_type);
+        ql_sim_event_enum cmd = QL_SIM_EVENT_STATE_CHANGE;
+        if(sim_handle->control[0] >= 0 && ptr->sim_state != MBTK_SIM_STATE_UNKNOWN)
+        {
+            int ret = write(sim_handle->control[0], &cmd, MBTK_WRITE_EVENT_SIZE);
+            if(ret != MBTK_WRITE_EVENT_SIZE)
+            {
+                QL_SIM_LOGE("[%s] write fail.[%d]", __func__, ret);
+            }
+        }
+    }
+}
+
+static void ql_sim_server_change_cb(const void* data, int data_len)
+{
+    if(data) {
+        const uint8 *ptr = (const uint8*)data;
+        mbtk_ril_ser_state_enum state = (mbtk_ril_ser_state_enum)ptr[0];
+        LOGD("ril server state : %d.\n", state);
+        if(sim_handle->server_cb && MBTK_RIL_SER_STATE_EXIT == state) {
+            sim_handle->server_cb(QL_ERR_ABORTED);
+        }
+    }
+}
+
+static int ql_epoll_register(int epoll_fd, int fd)
+{
+    struct epoll_event  ev;
+    int    ret, flags;
+
+    /* important: make the fd non-blocking */
+    flags = fcntl(fd, F_GETFL);
+    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+
+    ev.events  = EPOLLIN;
+    ev.data.fd = fd;
+
+    do
+    {
+        ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev);
+        if(ret < 0)
+        {
+            QL_SIM_LOGE("[%s] epoll_ctl fail.[%s]", __func__, strerror(errno));
+        }
+    } while (ret < 0 && errno == EINTR);
+
+    return QL_ERR_OK;
+}
+
+static void* ql_cb_thread(void* arg)
+{
+    ql_sim_info_handle_t* info = (ql_sim_info_handle_t*)arg;
+
+    if(info->control[0] < 0 && info->control[0] < 0)
+    {
+        if(socketpair(AF_LOCAL, SOCK_STREAM, 0, info->control ) < 0)
+        {
+            QL_SIM_LOGE("[%s] control creat fail.", __func__);
+            return NULL;
+        }
+    }
+
+    int ne = 0;
+    int nevents = 0;
+    int ret = 0;
+    struct epoll_event events[3];
+    int control_fd = info->control[1];
+    ql_sim_event_enum cmd = QL_SIM_EVENT_THREAD_QUIT;
+
+    //A maximum of three events can be processed simultaneously
+    int epoll_fd = epoll_create(3);
+    ql_epoll_register(epoll_fd, control_fd);
+
+    QL_SIM_LOGE("[%s] thread start run.", __func__);
+    while(1)
+    {
+        nevents = epoll_wait(epoll_fd, events, 3, -1);
+        if(nevents < 0)
+        {
+            if(errno != EINTR)
+            {
+                QL_SIM_LOGE("[%s] epoll_wait fail.[%s]", __func__, strerror(errno));
+            }
+            continue;
+        }
+
+        for (ne = 0; ne < nevents; ne++)
+        {
+            if((events[ne].events & (EPOLLERR|EPOLLHUP)) != 0)
+            {
+                QL_SIM_LOGE("[%s] EPOLLERR or EPOLLHUP event error.", __func__);
+                break;
+            }
+
+            if ((events[ne].events & EPOLLIN) != 0)
+            {
+                if (events[ne].data.fd == control_fd)
+                {
+                    ret = read(control_fd, &cmd, MBTK_READ_EVENT_SIZE);
+                    if(ret != MBTK_READ_EVENT_SIZE)
+                    {
+                        QL_SIM_LOGE("[%s] read fail.[%d]", __func__, ret);
+                    }
+                    else
+                    {
+                        switch(cmd)
+                        {
+                            case QL_SIM_EVENT_THREAD_QUIT:
+                            {
+                                close(epoll_fd);
+                                epoll_fd = -1;
+                                if(info->control[0] >= 0)
+                                {
+                                    close(info->control[0]);
+                                    info->control[0] = -1;
+                                }
+                                if(info->control[1] >= 0)
+                                {
+                                    close(info->control[1]);
+                                    info->control[1] = -1;
+                                }
+                                QL_SIM_LOGD("[%s] thread quit.", __func__);
+                                return NULL;
+                            }
+                            case QL_SIM_EVENT_STATE_CHANGE:
+                            {
+                                if(info->status_cb)
+                                {
+                                    ql_sim_card_info_t sim_info = {0};
+                                    ql_sim_get_card_info(QL_SIM_SLOT_1, &sim_info);
+                                    info->status_cb(QL_SIM_SLOT_1, &sim_info);
+                                }
+                                break;
+                            }
+                            default:
+                            {
+                                QL_SIM_LOGE("[%s] unknown event.[%d]", __func__, cmd);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+static int ql_cb_thread_creat(ql_sim_info_handle_t *info)
+{
+    if(info->cb_thread_id == 0)
+    {
+        pthread_attr_t thread_attr;
+        pthread_attr_init(&thread_attr);
+        if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
+        {
+            QL_SIM_LOGE("[%s] pthread_attr_setdetachstate fail.", __func__);
+            return QL_ERR_FAILED;
+        }
+        if(pthread_create(&(info->cb_thread_id), &thread_attr, ql_cb_thread, info))
+        {
+            QL_SIM_LOGE("[%s] pthread_create fail.[%ld]", __func__, info->cb_thread_id);
+            return QL_ERR_FAILED;
+        }
+        QL_SIM_LOGD("[%s] pthread_create success.[%ld]", __func__, info->cb_thread_id);
+    }
+
+    return QL_ERR_OK;
+}
+
+static int ql_cb_thread_free(ql_sim_info_handle_t *info)
+{
+    int ret = 0;
+    if(info->cb_thread_id != 0)
+    {
+        ql_sim_event_enum cmd = QL_SIM_EVENT_THREAD_QUIT;
+        if(info->control[0] >= 0)
+        {
+            ret = write(info->control[0], &cmd, MBTK_WRITE_EVENT_SIZE);
+            if(ret != MBTK_WRITE_EVENT_SIZE)
+            {
+                QL_SIM_LOGE("[%s] write fail.[%d]", __func__, ret);
+                return QL_ERR_FAILED;
+            }
+        }
+        info->cb_thread_id = 0;
+        QL_SIM_LOGE("[%s] pthread quit success.", __func__);
+    }
+
+    return QL_ERR_OK;
+}
+
+/*----------------------------------------------SIM FUNCTION-------------------------------------*/
+
+/*----------------------------------------------SIM API------------------------------------------*/
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Initializes SIM service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the SIM service was intialized successfully.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_init(void)
+{
+    if(NULL == sim_handle)
+    {
+        sim_handle = (ql_sim_info_handle_t*)malloc(sizeof(ql_sim_info_handle_t));
+        if(NULL == sim_handle)
+        {
+            QL_SIM_LOGE("[%s] sim handle malloc fail.", __func__);
+            return QL_ERR_FAILED;
+        }
+
+        sim_handle->handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+        if(NULL == sim_handle->handle)
+        {
+            QL_SIM_LOGE("[%s] mbtk handle init fail.", __func__);
+            goto error_1;
+        }
+
+        int ret = mbtk_sim_state_change_cb_reg(ql_sim_state_change_cb);
+        if(ret != MBTK_ERR_OK)
+        {
+            QL_SIM_LOGE("[%s] set sim state cb fail.[%d]", __func__, ret);
+            goto error_2;
+        }
+
+        ret = mbtk_ril_ser_state_change_cb_reg(ql_sim_server_change_cb);
+        if(ret != MBTK_ERR_OK)
+        {
+            QL_SIM_LOGE("[%s] set sim server cb fail.[%d]", __func__, ret);
+            goto error_2;
+        }
+
+        sim_handle->status_cb = NULL;
+        sim_handle->server_cb = NULL;
+        sim_handle->control[0] = -1;
+        sim_handle->control[1] = -1;
+        sim_handle->cb_thread_id = 0;
+    }
+
+    return QL_ERR_OK;
+
+error_2:
+    if(sim_handle->handle)
+    {
+        mbtk_ril_close(MBTK_AT_PORT_DEF);
+        sim_handle->handle = NULL;
+    }
+error_1:
+    if(sim_handle)
+    {
+        free(sim_handle);
+        sim_handle = NULL;
+    }
+    return QL_ERR_FAILED;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Deinitializes SIM service.
+  @return Whether the SIM service was deintialized successfully.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_deinit(void)
+{
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    int ret = 0;
+    sim_handle->server_cb = NULL;
+    sim_handle->status_cb = NULL;
+
+    if(NULL != sim_handle->handle)
+    {
+        ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if(ret != MBTK_ERR_OK)
+        {
+            QL_SIM_LOGE("[%s] mbtk handle deinit fail.[%d]", __func__, ret);
+            return QL_ERR_FAILED;
+        }
+        sim_handle->handle = NULL;
+    }
+
+    ret = ql_cb_thread_free(sim_handle);
+    if(ret != QL_ERR_OK)
+    {
+        QL_SIM_LOGE("[%s] cb thread free deinit fail.", __func__);
+        return QL_ERR_FAILED;
+    }
+
+    free(sim_handle);
+    sim_handle = NULL;
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets the IMSI (for 3GPP) or IMSI_M (for 3GPP2) from the SIM in ASCII form.
+  @param [in] slot Slot to be used.
+  @note This function is only supported by Identify card in slot 1
+  @param [in] app_type Application type.
+  @note This function is only supported by 3GPP applications
+  @param [out] imsi Buffer to fill IMSI data.
+  @param [in] imsi_len Buffer length.
+  @return Whether the IMSI was successfully obtained.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_imsi(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, char *imsi, int imsi_len)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == imsi)
+    {
+        QL_SIM_LOGE("[%s] imsi is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    if(imsi_len < QL_SIM_IMSI_LENGTH)
+    {
+        QL_SIM_LOGE("[%s] imsi buf is too short.", __func__);
+        return QL_ERR_BUF_OVERFLOW;
+    }
+
+    char temp_buff[MBTK_BUFF_TEMP_SIZE_32] = {0};
+    memset(imsi, 0x0, imsi_len);
+    memset(temp_buff, 0x0, MBTK_BUFF_TEMP_SIZE_32);
+    int ret = mbtk_imsi_get(sim_handle->handle, (void *)temp_buff);
+    if(ret != MBTK_ERR_OK)
+    {
+        QL_SIM_LOGE("[%s] imsi get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    memcpy(imsi, temp_buff, QL_SIM_IMSI_LENGTH);
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the Integrated Circuit Card ID (ICCID) stored on the card.
+  @param [in] slot Slot to be used(the parameter currently does not support).
+  @note This function is only supported by Identify card in slot 1
+  @param [out] iccid Buffer to fill ICCID data.
+  @param [in] iccid_len Buffer length.
+  @return Whether the ICCID was successfully obtained.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_iccid(QL_SIM_SLOT_E slot, char *iccid, int iccid_len)
+{
+    UNUSED(slot);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == iccid)
+    {
+        QL_SIM_LOGE("[%s] iccid is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    if(iccid_len < QL_SIM_ICCID_LENGTH)
+    {
+        QL_SIM_LOGE("[%s] imsi buf is too short.", __func__);
+        return QL_ERR_BUF_OVERFLOW;
+    }
+
+    char temp_buff[MBTK_BUFF_TEMP_SIZE_32] = {0};
+    memset(iccid, 0x0, iccid_len);
+    memset(temp_buff, 0x0, MBTK_BUFF_TEMP_SIZE_32);
+    int ret = mbtk_iccid_get(sim_handle->handle, (void *)temp_buff);
+    if(ret != MBTK_ERR_OK)
+    {
+        QL_SIM_LOGE("[%s] iccid get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    memcpy(iccid, temp_buff, QL_SIM_ICCID_LENGTH);
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the device phone number stored on the card.
+  @param [in] slot Slot to be used.
+  @note This function is only supported by Identify card in slot 1
+  @param [in] app_type Application type.
+  @note This function is only supported by 3GPP applications
+  @param [out] phone_num Buffer to fill phone number.
+  @param [in] phone_num_len Buffer length.
+  @return Whether the phone number was successfully retrieved.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_phone_num(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                          char *phone_num, int phone_num_len)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == phone_num)
+    {
+        QL_SIM_LOGE("[%s] phone_num is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    if(phone_num_len < QL_SIM_PHONE_NUMBER_MAX)
+    {
+        QL_SIM_LOGE("[%s] phone_num buf is too short.", __func__);
+        return QL_ERR_BUF_OVERFLOW;
+    }
+
+    char temp_buff[MBTK_BUFF_TEMP_SIZE_128] = {0};
+    memset(phone_num, 0x0, phone_num_len);
+    memset(temp_buff, 0x0, MBTK_BUFF_TEMP_SIZE_128);
+    int ret = mbtk_phone_number_get(sim_handle->handle, (void *)temp_buff);
+    if(ret != MBTK_ERR_OK)
+    {
+        QL_SIM_LOGE("[%s] phone_num get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    memcpy(phone_num, temp_buff, QL_SIM_PHONE_NUMBER_MAX);
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the preferred operators stored on the card.
+  @param [in] slot Slot to be used.
+  @note This function is only supported by Identify card in slot 1
+  @param [out] list Buffer to hold operators.
+  @note This function is only supported by 3GPP applications
+  @return Whether the preferred operators were successfully retrieved.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_operators(QL_SIM_SLOT_E slot, ql_sim_operator_list_t *list)
+{
+    UNUSED(slot);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == list)
+    {
+        QL_SIM_LOGE("[%s] list is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+#if 0
+    list_node_t* operators_list = NULL;
+    mbtk_net_info_t* operator = NULL;
+    char temp_buff[MBTK_BUFF_TEMP_SIZE_16] = {0};
+    int operators_size = 0;
+    int ret = mbtk_available_net_get(sim_handle->handle, &operators_list);
+    if(ret != MBTK_ERR_OK)
+    {
+        QL_SIM_LOGE("[%s] available operators get fail.[%d]", __func__, ret);
+        if(NULL != operators_list)
+        {
+            list_free(operators_list);
+            operators_list = NULL;
+        }
+        return QL_ERR_FAILED;
+    }
+
+    if(NULL == operators_list)
+    {
+        QL_SIM_LOGE("[%s] operators list is NULL.", __func__);
+        return QL_ERR_FAILED;
+    }
+    else
+    {
+        list_first(operators_list);
+        memset(list, 0x0, sizeof(ql_sim_operator_list_t));
+        while ((operator = (mbtk_net_info_t*) list_next(operators_list)))
+        {
+            QL_SIM_LOGD("[%s]operators: %d, %d, %d, %d.", __func__, operator->net_sel_mode, operator->net_type, operator->net_state, operator->plmn);
+            memset(temp_buff, 0x0, MBTK_BUFF_TEMP_SIZE_16);
+            ret = sprintf(temp_buff, "%d", operator->plmn);
+            list->operators[operators_size].mnc_len = ret - QL_SIM_MCC_LENGHT;
+            if(ret > QL_SIM_MCC_LENGHT && list->operators[operators_size].mnc_len <= QL_SIM_MNC_MAX)
+            {
+                memcpy(list->operators[operators_size].mcc, temp_buff, QL_SIM_MCC_LENGHT);
+                memcpy(list->operators[operators_size].mnc, temp_buff + QL_SIM_MCC_LENGHT, list->operators[operators_size].mnc_len);
+            }
+            else
+            {
+                QL_SIM_LOGE("[%s] MCC MNC length error.", __func__);
+                list_free(operators_list);
+                operators_list = NULL;
+                return QL_ERR_FAILED;
+            }
+            operators_size++;
+        }
+        list->len = operators_size;
+    }
+    list_free(operators_list);
+    operators_list = NULL;
+#else
+    mbtk_net_info_array_t net_list;
+    mbtk_ril_err_enum err = mbtk_available_net_get(sim_handle->handle, &net_list);
+    if(err != MBTK_RIL_ERR_SUCCESS) {
+        LOGE("Error : %d", err);
+    } else {
+        LOGD("Available net number:%d\n", net_list.num);
+        int i = 0;
+        char temp_buff[MBTK_BUFF_TEMP_SIZE_16] = {0};
+        int ret;
+        memset(list, 0x0, sizeof(ql_sim_operator_list_t));
+        while(i < net_list.num) {
+            memset(temp_buff, 0x0, MBTK_BUFF_TEMP_SIZE_16);
+            LOGD("NET : %d,%d,%d,%d\n", net_list.net_info[i].net_sel_mode,
+                net_list.net_info[i].net_type, net_list.net_info[i].net_state,
+                net_list.net_info[i].plmn);
+
+            ret = sprintf(temp_buff, "%d", net_list.net_info[i].plmn);
+            list->operators[i].mnc_len = ret - QL_SIM_MCC_LENGHT;
+            if(ret > QL_SIM_MCC_LENGHT && list->operators[i].mnc_len <= QL_SIM_MNC_MAX)
+            {
+                memcpy(list->operators[i].mcc, temp_buff, QL_SIM_MCC_LENGHT);
+                memcpy(list->operators[i].mnc, temp_buff + QL_SIM_MCC_LENGHT, list->operators[i].mnc_len);
+            }
+            else
+            {
+                QL_SIM_LOGE("[%s] MCC MNC length error.", __func__);
+                return QL_ERR_FAILED;
+            }
+            i++;
+        }
+        list->len = net_list.num;
+    }
+
+#endif
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Enables the PIN on an application.
+  @param [in] slot Slot to be used.
+  @note This function is only supported by Identify card in slot 1
+  @param [in] app_type Application type.
+  @note This function is only supported by 3GPP applications
+  @param [in] pin PIN to be used.
+  @note This function is only supported by Level 1 user verification
+  @param [in] pin_value PIN value. NULL terminated.
+  @return Whether the PIN was successfully enabled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_enable_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                             QL_SIM_PIN_E pin, const char *pin_value)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(pin);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == pin_value)
+    {
+        QL_SIM_LOGE("[%s] pin_value is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int pin_len = strlen(pin_value);
+    if(pin_len > QL_SIM_PIN_MAX)
+    {
+        QL_SIM_LOGE("[%s] pin length is too long.", __func__);
+        return QL_ERR_ARG_TOO_LONG;
+    }
+    else if(pin_len <= 0)
+    {
+        QL_SIM_LOGE("[%s] pin length is too short.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_sim_lock_info_t info = {0};
+    info.type = MBTK_SIM_LOCK_TYPE_ENABLE;
+    memcpy(info.pin1, pin_value, pin_len);
+
+    int err = mbtk_sim_lock_set(sim_handle->handle, &info);
+    if(err)
+    {
+        QL_SIM_LOGE("[%s] enable pin fail.[%d]", __func__, err);
+        return QL_ERR_FAILED;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Disables the PIN on an application.
+  @param [in] slot Slot to be used.
+  @note This function is only supported by Identify card in slot 1
+  @param [in] app_type Application type.
+  @note This function is only supported by 3GPP applications
+  @param [in] pin PIN to be used.
+  @note This function is only supported by Level 1 user verification
+  @param [in] pin_value PIN value. NULL terminated.
+  @return Whether the PIN was successfully disabled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_disable_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                             QL_SIM_PIN_E pin, const char *pin_value)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(pin);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == pin_value)
+    {
+        QL_SIM_LOGE("[%s] pin_value is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int pin_len = strlen(pin_value);
+    if(pin_len > QL_SIM_PIN_MAX)
+    {
+        QL_SIM_LOGE("[%s] pin length is too long.", __func__);
+        return QL_ERR_ARG_TOO_LONG;
+    }
+    else if(pin_len <= 0)
+    {
+        QL_SIM_LOGE("[%s] pin length is too short.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_sim_lock_info_t info = {0};
+    info.type = MBTK_SIM_LOCK_TYPE_DISABLE;
+    memcpy(info.pin1, pin_value, pin_len);
+
+    int err = mbtk_sim_lock_set(sim_handle->handle, &info);
+    if(err)
+    {
+        QL_SIM_LOGE("[%s] disenable pin fail.[%d]", __func__, err);
+        return QL_ERR_FAILED;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Verifies the PIN value of an application.
+  @param [in] slot Slot to be used.
+  @note This function is only supported by Identify card in slot 1
+  @param [in] app_type Application type.
+  @note This function is only supported by 3GPP applications
+  @param [in] pin PIN to be used.
+  @note This function is only supported by Level 1 user verification
+  @param [in] pin_value PIN value. NULL terminated.
+  @note PIN must be enabled before calling this function.
+  @return Whether the PIN was successfully verified.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_verify_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                             QL_SIM_PIN_E pin, const char *pin_value)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(pin);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == pin_value)
+    {
+        QL_SIM_LOGE("[%s] pin_value is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int pin_len = strlen(pin_value);
+    if(pin_len > QL_SIM_PIN_MAX)
+    {
+        QL_SIM_LOGE("[%s] pin length is too long.", __func__);
+        return QL_ERR_ARG_TOO_LONG;
+    }
+    else if(pin_len <= 0)
+    {
+        QL_SIM_LOGE("[%s] pin length is too short.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_sim_lock_info_t info = {0};
+    info.type = MBTK_SIM_LOCK_TYPE_VERIFY_PIN;
+    memcpy(info.pin1, pin_value, pin_len);
+
+    int err = mbtk_sim_lock_set(sim_handle->handle, &info);
+    if(err)
+    {
+        QL_SIM_LOGE("[%s] verify pin fail.[%d]", __func__, err);
+        return QL_ERR_FAILED;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Changes the PIN value of an application.
+  @param [in] slot Slot to be used.
+  @note This function is only supported by Identify card in slot 1
+  @param [in] app_type Application type.
+  @note This function is only supported by 3GPP applications
+  @param [in] pin PIN to be used.
+  @note This function is only supported by Level 1 user verification
+  @param [in] old_pin_value Old PIN value. NULL terminated.
+  @param [in] new_pin_value New PIN value. NULL terminated.
+  @return Whether the PIN was successfully changed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_change_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                             QL_SIM_PIN_E pin, const char *old_pin_value, const char *new_pin_value)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(pin);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == old_pin_value || NULL == new_pin_value)
+    {
+        QL_SIM_LOGE("[%s] pin_value is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int old_pin_len = strlen(old_pin_value);
+    int new_pin_len = strlen(new_pin_value);
+    if(old_pin_len > QL_SIM_PIN_MAX || new_pin_len > QL_SIM_PIN_MAX)
+    {
+        QL_SIM_LOGE("[%s] pin length is too long.", __func__);
+        return QL_ERR_ARG_TOO_LONG;
+    }
+    else if(old_pin_len <= 0 || new_pin_len <= 0)
+    {
+        QL_SIM_LOGE("[%s] pin length is too short.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_sim_lock_info_t info = {0};
+    info.type = MBTK_SIM_LOCK_TYPE_CHANGE;
+    memcpy(info.pin1, old_pin_value, old_pin_len);
+    memcpy(info.pin2, new_pin_value, new_pin_len);
+
+    int err = mbtk_sim_lock_set(sim_handle->handle, &info);
+    if(err)
+    {
+        QL_SIM_LOGE("[%s] change pin fail.[%d]", __func__, err);
+        return QL_ERR_FAILED;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Unblocks a blocked PIN using the PUK code.
+  @param [in] slot Slot to be used.
+  @note This function is only supported by Identify card in slot 1
+  @param [in] app_type Application type.
+  @note This function is only supported by 3GPP applications
+  @param [in] pin PIN to be used.
+  @note This function is only supported by Level 1 user verification
+  @param [in] puk_value PUK value.  NULL terminated.
+  @param [in] pin_value New PIN value.  NULL terminated.
+  @note The user must pass PUK1 to unblock PIN1 or PUK2 to unblock PIN2.
+  @return Whether the PIN was successfully unblocked.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_unblock_pin(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                             QL_SIM_PIN_E pin, const char *puk_value, const char *pin_value)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(pin);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == puk_value || NULL == pin_value)
+    {
+        QL_SIM_LOGE("[%s] value is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    int puk_len = strlen(puk_value);
+    int pin_len = strlen(pin_value);
+    if(puk_len > QL_SIM_PUK_LENGTH || pin_len > QL_SIM_PIN_MAX)
+    {
+        QL_SIM_LOGE("[%s] length is too long.", __func__);
+        return QL_ERR_ARG_TOO_LONG;
+    }
+    else if(puk_len <= 0 || pin_len <= 0)
+    {
+        QL_SIM_LOGE("[%s] length is too short.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_sim_lock_info_t info = {0};
+    info.type = MBTK_SIM_LOCK_TYPE_VERIFY_PUK;
+    memcpy(info.pin1, pin_value, pin_len);
+    memcpy(info.puk, puk_value, puk_len);
+
+    int err = mbtk_sim_lock_set(sim_handle->handle, &info);
+    if(err)
+    {
+        QL_SIM_LOGE("[%s] unblock pin fail.[%d]", __func__, err);
+        return QL_ERR_FAILED;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the card info stored on a card.
+  @param [in] slot Slot to be used.
+  @note This function is only supported by Identify card in slot 1
+  @param [out] p_info Pointer of ql_sim_card_info_t.
+  @return Whether the card info was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_card_info(QL_SIM_SLOT_E slot, ql_sim_card_info_t *p_info)
+{
+    UNUSED(slot);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    if(NULL == p_info)
+    {
+        QL_SIM_LOGE("[%s] p_info is NULL.", __func__);
+        return QL_ERR_INVALID_ARG;
+    }
+
+    mbtk_sim_state_enum sim;
+    int ret = mbtk_sim_state_get(sim_handle->handle, &sim);
+    if(ret != MBTK_ERR_OK)
+    {
+        QL_SIM_LOGE("[%s] sim state get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    mbtk_sim_card_type_enum sim_card_type;
+    ret = mbtk_sim_type_get(sim_handle->handle, &sim_card_type);
+    if(ret)
+    {
+        QL_SIM_LOGE("[%s] sim type get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    mbtk_pin_puk_last_times_t sim_last_times = {0};
+    ret = mbtk_sim_lock_retry_times_get(sim_handle->handle, &sim_last_times);
+    if(ret)
+    {
+        QL_SIM_LOGE("[%s] sim pin puk times get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    int pin_state;
+    ret = mbtk_sim_lock_get(sim_handle->handle, &pin_state);
+    if(ret)
+    {
+        QL_SIM_LOGE("[%s] sim pin state get fail.[%d]", __func__, ret);
+        return QL_ERR_FAILED;
+    }
+
+    memset(p_info, 0x0, sizeof(ql_sim_card_info_t));
+    switch(sim)
+    {
+        case MBTK_SIM_STATE_ABSENT:                   //CARD ABSENT
+        {
+            p_info->state = QL_SIM_CARD_STATE_ABSENT;
+            p_info->app_3gpp.app_state = QL_SIM_APP_STATE_UNKNOWN;
+            p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_UNKNOWN;
+            p_info->app_3gpp.pin2_state = QL_SIM_PIN_STATE_UNKNOWN;
+            break;
+        }
+        case MBTK_SIM_STATE_READY:                    //CARD READY
+        {
+            p_info->state = QL_SIM_CARD_STATE_PRESENT;
+            p_info->app_3gpp.app_state = QL_SIM_APP_STATE_READY;
+            if(pin_state == MBTK_PIN_ENABLE)
+            {
+                p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_ENABLED_VERIFIED;
+            }
+            else
+            {
+                p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_DISABLED;
+            }
+            p_info->app_3gpp.pin2_state = QL_SIM_PIN_STATE_UNKNOWN;
+            break;
+        }
+        case MBTK_SIM_STATE_SIM_PIN:                      //SIM PIN
+        {
+            p_info->state = QL_SIM_CARD_STATE_PRESENT;
+            p_info->app_3gpp.app_state = QL_SIM_APP_STATE_PIN1_REQ;
+            if(pin_state == MBTK_PIN_ENABLE)
+            {
+                p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_ENABLED_NOT_VERIFIED;
+            }
+            else
+            {
+                p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_DISABLED;
+            }
+            p_info->app_3gpp.pin2_state = QL_SIM_PIN_STATE_UNKNOWN;
+            break;
+        }
+        case MBTK_SIM_STATE_SIM_PUK:                      //SIM PUK
+        {
+            p_info->state = QL_SIM_CARD_STATE_PRESENT;
+            p_info->app_3gpp.app_state = QL_SIM_APP_STATE_PUK1_REQ;
+            if(pin_state == MBTK_PIN_ENABLE)
+            {
+                p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_BLOCKED;
+            }
+            else
+            {
+                p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_DISABLED;
+            }
+            p_info->app_3gpp.pin2_state = QL_SIM_PIN_STATE_UNKNOWN;
+            break;
+        }
+        case MBTK_SIM_STATE_PH_NET_PIN:  //NETWORK PERSON PIN
+        {
+            p_info->state = QL_SIM_CARD_STATE_PRESENT;
+            p_info->app_3gpp.app_state = QL_SIM_APP_STATE_UNKNOWN;
+            if(pin_state == MBTK_PIN_ENABLE)
+            {
+                p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_ENABLED_NOT_VERIFIED;
+            }
+            else
+            {
+                p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_DISABLED;
+            }
+            p_info->app_3gpp.pin2_state = QL_SIM_PIN_STATE_UNKNOWN;
+            break;
+        }
+        case MBTK_SIM_STATE_NOT_READY:                //UNKNOWN STATE
+        default:
+        {
+            p_info->state = QL_SIM_CARD_STATE_UNKNOWN;
+            p_info->app_3gpp.app_state = QL_SIM_APP_STATE_UNKNOWN;
+            p_info->app_3gpp.pin1_state = QL_SIM_PIN_STATE_UNKNOWN;
+            p_info->app_3gpp.pin2_state = QL_SIM_PIN_STATE_UNKNOWN;
+            break;
+        }
+    }
+
+    switch(sim_card_type)
+    {
+        case MBTK_SIM:
+        case MBTK_TEST_SIM:
+        {
+            p_info->type = QL_SIM_CARD_TYPE_ICC;
+            break;
+        }
+        case MBTK_USIM:
+        case MBTK_TEST_USIM:
+        {
+            p_info->type = QL_SIM_CARD_TYPE_UICC;
+            break;
+        }
+        default:
+        {
+            p_info->type = QL_SIM_CARD_TYPE_UNKNOWN;
+            break;
+        }
+    }
+
+    p_info->app_3gpp.pin1_num_retries = sim_last_times.p1_retry;
+    p_info->app_3gpp.puk1_num_retries = sim_last_times.puk1_retry;
+    p_info->app_3gpp.pin2_num_retries = sim_last_times.p2_retry;
+    p_info->app_3gpp.puk2_num_retries = sim_last_times.puk2_retry;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Reads data from a specific file on a specified application on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [inout] p_file Pointer of ql_sim_file_t.
+  @return Whether the file was successfully read.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_read_file(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, ql_sim_file_t *p_file)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(p_file);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Writes data to a specific file on a specified application on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [in] p_file Pointer of ql_sim_file_t
+  @note The type of file is determined by the record number field,
+    which indicates a transparent file when zero and a record-based file otherwise.
+  @return Whether the file was successfully written.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_write_file(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type, ql_sim_file_t *p_file)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(p_file);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Retrieves the info of a specific file on a specified application on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [inout] p_info Pointer of ql_sim_file_info_t.
+  @return Whether the file info was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_file_info(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                                 ql_sim_file_info_t *p_info)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(p_info);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Reads phone book on a specified application on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Spplication type.
+  @param [in] pb_path Phone book path. NULL terminated.
+  @param [in] record_idx Record index to read. Starts from 1.
+  @param [out] p_record Pointer of ql_sim_phone_book_record_t.
+  @return Whether the phone book record was successfully retrieved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_read_phone_book(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                                    const char *pb_path, uint8_t record_idx,
+                                    ql_sim_phone_book_record_t *p_record)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(pb_path);
+    UNUSED(record_idx);
+    UNUSED(p_record);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Writes phone book on a specified application on the card.
+  @param [in] slot Slot to be used.
+  @param [in] app_type Application type.
+  @param [in] pb_path Phone book path. NULL terminated.
+  @param [in] record_idx Record index to write. Starts from 1.
+  @param [in] p_record Pointer of ql_sim_phone_book_record_t.
+  @note If p_record->name[0] = 0 and p_record->number[0] = 0, record will be deleted.
+  @return Whether the phone book record was successfully saved.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_write_phone_book(QL_SIM_SLOT_E slot, QL_SIM_APP_TYPE_E app_type,
+                                    const char *pb_path, uint8_t record_idx,
+                                    ql_sim_phone_book_record_t *p_record)
+{
+    UNUSED(slot);
+    UNUSED(app_type);
+    UNUSED(pb_path);
+    UNUSED(record_idx);
+    UNUSED(p_record);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Opens a logical channel on a UICC card.
+  @param [in] slot Slot to be used.
+  @param [out] channel_id Channel opened.
+  @return Whether the logical channel was successfully opened.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_open_logical_channel(QL_SIM_SLOT_E slot, uint8_t *channel_id)
+{
+    UNUSED(slot);
+    UNUSED(channel_id);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Closes a logical channel on a UICC card.
+  @param [in] slot Slot to be used.
+  @param [in] channel_id Channel to be closed.
+  @return Whether the logical channel was successfully closed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_close_logical_channel(QL_SIM_SLOT_E slot, uint8_t channel_id)
+{
+    UNUSED(slot);
+    UNUSED(channel_id);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sends an APDU to the card.
+  @param [in] slot Slot to be used.
+  @param [in] channel_id Channel to be used.
+  @param [inout] p_apdu Pointer of ql_sim_apdu_t.
+  @note You must call ql_sim_open_logical_channel before sending an APDU.
+  @return Whether the APDU was successfully sent.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_send_apdu(QL_SIM_SLOT_E slot, uint8_t channel_id, ql_sim_apdu_t *p_apdu)
+{
+    UNUSED(slot);
+    UNUSED(channel_id);
+    UNUSED(p_apdu);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets SIM card status callback handler
+  @param[in] cb call back handler.
+  @return Whether the card status callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_set_card_status_cb(ql_sim_card_status_cb_f cb)
+{
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    int ret = QL_ERR_OK;
+    if(NULL != cb)
+    {
+        ret = ql_cb_thread_creat(sim_handle);
+        if(ret != QL_ERR_OK)
+        {
+            QL_SIM_LOGE("[%s] cb thread creat fail.", __func__);
+        }
+    }
+    else
+    {
+        ret = ql_cb_thread_free(sim_handle);
+        if(ret != QL_ERR_OK)
+        {
+            QL_SIM_LOGE("[%s] cb thread free deinit fail.", __func__);
+            return QL_ERR_FAILED;
+        }
+    }
+    sim_handle->status_cb = cb;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Switches slot.
+  @param [in] log_slot Logical slot to be switched.
+  @param [in] phy_slot Physical slot to be switched.
+  @return Whether the slot was successfully switched.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_switch_slot(QL_SIM_SLOT_E log_slot, QL_SIM_PHY_SLOT_E phy_slot)
+{
+    UNUSED(log_slot);
+    UNUSED(phy_slot);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets active slots.
+  @param [Out] p_active_slots Active slots.
+  @return Whether the active slots were successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_get_active_slots(ql_sim_active_slots_t *p_active_slots)
+{
+    UNUSED(p_active_slots);
+
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally,
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sim_set_service_error_cb(ql_sim_service_error_cb_f cb)
+{
+    if(NULL == sim_handle)
+    {
+        QL_SIM_LOGE("[%s] sim handle not init.", __func__);
+        return QL_ERR_NOT_INIT;
+    }
+
+    sim_handle->server_cb = cb;
+
+    return QL_ERR_OK;
+}
+
+//int ql_sim_switch_slot(QL_SIM_SLOT_E log_slot, QL_SIM_PHY_SLOT_E phy_slot);
+//int ql_sim_get_active_slots(ql_sim_active_slots_t *p_active_slots);
+/*----------------------------------------------SIM API------------------------------------------*/
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_sleep_wakelock.c b/mbtk/libql_lib_v2_rilv2/ql_sleep_wakelock.c
new file mode 100755
index 0000000..622e028
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_sleep_wakelock.c
@@ -0,0 +1,86 @@
+#include <stddef.h>
+#include "ql_sleep_wakelock.h"
+#include "mbtk_sleep.h"
+#include "mbtk_log.h"
+
+/*
+ * create wakelock, return the file description of the wakelock
+ */
+int ql_slp_wakelock_create(const char *name, size_t len)
+{
+    int ret;
+
+    ret = mbtk_wakelock_create(name, len);
+    if (ret == -1)
+    {
+        LOGE("mbtk_wakelock_create is error");
+    }
+
+    return ret;
+}
+
+/*
+ * lock the wakelock by the file description of the wakelock
+ */
+int ql_slp_wakelock_lock(int fd)
+{
+    int ret;
+
+    ret = mbtk_wakelock_lock(fd);
+    if (ret == -1)
+    {
+        LOGE("ql_slp_wakelock_lock is error");
+    }
+
+    return ret;
+}
+
+/*
+ * unlock the wakelock by the file description of the wakelock
+ */
+int ql_slp_wakelock_unlock(int fd)
+{
+    int ret;
+
+    ret = mbtk_wakelock_unlock(fd);
+    if (ret == -1)
+    {
+        LOGE("ql_slp_wakelock_unlock is error");
+    }
+
+    return ret;
+}
+
+/*
+ * destroy the wakelock by the file description of the wakelock
+ */
+int ql_slp_wakelock_destroy(int fd)
+{
+    int ret;
+
+    ret = mbtk_wakelock_destroy(fd);
+    if (ret == -1)
+    {
+        LOGE("ql_slp_wakelock_destroy is error");
+    }
+
+    return ret;
+}
+
+/*
+ * Enable/Disable autosleep function
+ */
+int ql_autosleep_enable(char enable)
+{
+    int ret;
+
+    ret = mbtk_autosuspend_enable(enable);
+    if (ret == -1)
+    {
+        LOGE("ql_autosleep_enable is error");
+    }
+
+    return ret;
+}
+
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_sms.c b/mbtk/libql_lib_v2_rilv2/ql_sms.c
new file mode 100755
index 0000000..7323949
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_sms.c
@@ -0,0 +1,660 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_sms.h
+  @brief SMS service API.
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200107   solomon.cui      Add GSM-7bit and ISO 8859-1 conversion.
+  20191225   solomon.cui      Modify fucntion description.
+  20191017   solomon.cui      Free async reponse not user data.
+  20190815   solomon.cui      Add service type for sending message.
+  20190627   solomon.cui      Support asynchronously send msg and pdu
+  20190625   solomon.cui      Convert timestamp frome hex to dec.
+  20190614   solomon.cui      Created .
+-------------------------------------------------------------------------------------------------*/
+#include "mbtk_type.h"
+#include "mbtk_pdu_sms.h"
+#include "mbtk_ril_api.h"
+#include "mbtk_log.h"
+#include "ql_sms.h"
+#include "ql_type.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/epoll.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <string.h>
+#include <fcntl.h>
+#include <time.h>
+
+#define MBTK_ERR_OK             0
+#define TELEPHONE_NUM_MAX 16
+#define MSM_NUMBER_MAX 2048+1
+#define RES_NUM_MIN 128
+#define TIME_ZONE_CN 32
+#define HAL_SMS_CONTENT_LEN 1024
+
+typedef struct {
+    mbtk_ril_handle*       handle;
+    ql_sms_msg_recv_cb_f      recv_cb;
+    ql_sms_service_error_cb_f server_cb;
+}ql_sms_info_handle_t;
+
+
+static ql_sms_info_handle_t* sms_handle = NULL;
+
+static void ql_sms_state_change_cb(const void* data, int data_len)
+{
+    LOGV("sms_state_change_cb()----------start\n");
+    mbtk_ril_sms_state_info_t *ptr = (mbtk_ril_sms_state_info_t *)data;
+
+    ql_sms_msg_t    sms_msg;
+    ql_sms_timestamp_t  sms_timestamp;
+    ql_sms_user_data_head_t sms_user_data_head;
+
+    memset(&sms_msg,0x00, sizeof(ql_sms_msg_t));
+    memset(&sms_timestamp,0x00, sizeof(ql_sms_timestamp_t));
+    memset(&sms_user_data_head,0x00, sizeof(ql_sms_user_data_head_t));
+
+    char smsc[MDAPI_MAX_PDU_SIZE] = {0};
+    char received_pdu[MDAPI_MAX_PDU_SIZE] = {0};
+    char msg[MDAPI_MAX_PDU_SIZE] = {0};
+    char num[MDAPI_MAX_PDU_SIZE] = {0};
+    uint8 year[8]   = {0};
+    uint8 month[4]  = {0};
+    uint8 day[4]    = {0};
+    uint8 hour[4]   = {0};
+    uint8 minutes[4]= {0};
+    uint8 seconds[4]= {0};
+    //char timezone[4] = {0};
+    char date[32] = {0};
+    int charset = 0;
+    int ret = -1;
+    int curr_pack = 1;
+    int total_pack = 1;
+    if(ptr == NULL)
+    {
+        LOGE("ptr is null");
+    }
+    LOGE("ptr: %s\n,data_len = %d\n", (char *)ptr->pdu, data_len);
+    if(data_len > MDAPI_MAX_PDU_SIZE)
+    {
+        strncpy(received_pdu, (const char *)ptr->pdu, MDAPI_MAX_PDU_SIZE-1);
+    }
+    else
+    {
+        strncpy(received_pdu, (const char *)ptr->pdu, data_len);
+    }
+    ret = smsPduDecode((const char *)received_pdu, data_len, num, smsc, msg, &charset, &curr_pack, &total_pack,date);
+    if(ret != 0)
+    {
+        LOGE("smsPduDecode fail ret: %d\n",ret);
+        return ;
+    }
+
+    LOGE("[EVENT][MT_SMS]PDU decode:smsc: %s\n, phone number: %s\ncharset: %d\n msg_len: %d\n message content: %s\n curr_pack: %d\n total_pack: %d\n date: %s", smsc, num, charset, strlen(msg), msg, curr_pack, total_pack, date);
+
+    sms_msg.format = charset;
+    memcpy(sms_msg.addr, num, strlen(num));
+    sms_msg.content_size = strlen(msg);
+    memcpy(sms_msg.content, msg, strlen(msg));
+
+    if(sscanf(date, "%4[^-]-%2[^-]-%2[^ ] %2[^:]:%2[^:]:%2s", year, month, day, hour, minutes, seconds)<=0)
+    {
+        LOGE("sscanf failed\n");
+    }
+
+    int tmp_year = atoi((char *)year);
+ 
+    sms_timestamp.year = tmp_year-2000;
+    sms_timestamp.month = atoi((char *)month);
+    sms_timestamp.day = atoi((char *)day);
+    sms_timestamp.hours = atoi((char *)hour);
+    sms_timestamp.minutes = atoi((char *)minutes);
+    sms_timestamp.seconds = atoi((char *)seconds);
+    sms_timestamp.timezone = TIME_ZONE_CN;
+
+    LOGE("Year: %d\n", sms_timestamp.year);
+    LOGE("Month: %d\n", sms_timestamp.month);
+    LOGE("Day: %d\n", sms_timestamp.day);
+    LOGE("Hour: %d\n", sms_timestamp.hours);
+    LOGE("Minute: %d\n", sms_timestamp.minutes);
+    LOGE("Second: %d\n", sms_timestamp.seconds);
+  
+    if(total_pack > 1 && curr_pack < total_pack)
+    {
+        sms_user_data_head.valid = TRUE;
+        sms_user_data_head.total_seg = total_pack;
+        sms_user_data_head.cur_seg_num = curr_pack;
+    }
+    else
+    {
+        sms_user_data_head.valid = FALSE;
+        sms_user_data_head.total_seg = total_pack;
+        sms_user_data_head.cur_seg_num = curr_pack;
+    }
+
+    if(sms_handle->recv_cb)
+    {
+          sms_handle->recv_cb(&sms_msg, &sms_timestamp, &sms_user_data_head);
+    }
+
+}
+
+static void ql_sms_server_change_cb(const void* data, int data_len)
+{
+    if(data_len != sizeof(int))
+    {
+        LOGE("[ql_sms_server_change_cb] data_len[%d] than int[%d] fail. ", data_len, sizeof(int));
+    }
+    else
+    {
+        int server_state = *(int *)data;
+        if(server_state == 1 && sms_handle->server_cb)
+        {
+            sms_handle->server_cb(QL_ERR_ABORTED);
+        }
+    }
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Initializes SMS service.
+  @return Whether the SMS service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_init(void)
+{
+    if(NULL == sms_handle)
+    {
+        sms_handle = (ql_sms_info_handle_t*)malloc(sizeof(ql_sms_info_handle_t));
+        if(NULL == sms_handle)
+        {
+            LOGE("[ql_sms_init] sms handle malloc fail.");
+            return QL_ERR_FAILED;
+        }
+
+        sms_handle->handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+        if(NULL == sms_handle->handle)
+        {
+            LOGE("[ql_sms_init] mbtk handle init fail.");
+            if(sms_handle)
+            {
+                free(sms_handle);
+                sms_handle = NULL;
+                return QL_ERR_FAILED;
+            }
+        }
+
+        int err = mbtk_sms_cnmi_set(sms_handle->handle);
+        if(err)
+        {
+            LOGE("set cnmi fail");
+            return QL_ERR_FAILED;
+        }
+
+        int ret = mbtk_sms_state_change_cb_reg( ql_sms_state_change_cb);
+        if(ret != MBTK_ERR_OK)
+        {
+            LOGE("[ql_sms_init] set sms state cb fail.[%d]", ret);
+             if(sms_handle->handle)
+            {
+                mbtk_ril_close(MBTK_AT_PORT_DEF);
+                sms_handle->handle = NULL;
+                return QL_ERR_FAILED;
+            }
+        }
+
+        ret = mbtk_net_reg_state_change_cb_reg(ql_sms_server_change_cb);
+        if(ret != MBTK_ERR_OK)
+        {
+            LOGE("[ql_sim_init] set sim server cb fail.[%d]", ret);
+             if(sms_handle->handle)
+            {
+                mbtk_ril_close(MBTK_AT_PORT_DEF);
+                sms_handle->handle = NULL;
+                return QL_ERR_FAILED;
+            }
+        }
+
+        sms_handle->recv_cb = NULL;
+        sms_handle->server_cb = NULL;
+    }
+
+    return QL_ERR_OK;
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Deinitializes SMS service.
+  @return Whether the SMS service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_deinit(void)
+{
+     if(NULL == sms_handle)
+    {
+        LOGE("[ql_sms_deinit] sms handle not init.");
+        return QL_ERR_NOT_INIT;
+    }
+
+    int ret = 0;
+    sms_handle->server_cb = NULL;
+    sms_handle->recv_cb = NULL;
+
+    if(NULL != sms_handle->handle)
+    {
+        ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if(ret != MBTK_ERR_OK)
+        {
+            LOGE("[ql_sms_deinit] mbtk handle deinit fail.[%d]", ret);
+            return QL_ERR_FAILED;
+        }
+        sms_handle->handle = NULL;
+    }
+
+    if(ret != QL_ERR_OK)
+    {
+        LOGE("[ql_sms_deinit] cb thread free deinit fail.");
+        return QL_ERR_FAILED;
+    }
+
+    free(sms_handle);
+    sms_handle = NULL;
+    return QL_ERR_OK;
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets the service center address.
+  @param[in] addr service center address.
+  @param[in] len  service center address length.
+  @return Whether the service center address was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_set_service_center_addr(char *addr, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets the service center address.
+  @param[out] addr service center address.
+  @param[in] len  service center address length.
+  @return Whether the service center address was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_get_service_center_addr(char *addr, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sends message synchronously.
+  @param[in] p_msg pointer to ql_sms_msg_t.
+  @return Whether the message was successfully sent synchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_send_msg(ql_sms_msg_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sends message asynchronously.
+  @param[in] p_msg  pointer to ql_sms_msg_t
+  @param[out] id    id for this async operation
+  @param[in] cb     async callback
+  @return Whether the message was successfully sent asynchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_send_msg_async(ql_sms_msg_t *p_msg, int *id, ql_sms_msg_async_cb_f cb)
+{
+    if (NULL == sms_handle)
+    {
+        LOGE("handle NULL");
+        return QL_ERR_FAILED;
+    }
+
+    if (NULL == p_msg)
+    {
+        LOGE("p_msgt NULL");
+        return QL_ERR_FAILED;
+    }
+
+    if(NULL == id)
+    {
+        LOGE("id NULL");
+        return QL_ERR_FAILED;
+    }
+
+    int8 *phone_num = NULL;
+    int8 *msg = NULL;
+	int32 msg_len;
+
+    char cmgs[MSM_NUMBER_MAX] = {0};
+    char resp[RES_NUM_MIN] = {0};
+
+    char smscPDU[30] = {0};
+    char **pdu = NULL;
+    char smsc[4] = {0};
+    char msg_e_b[HAL_SMS_CONTENT_LEN] = {0};// +1 for end of string.*2:A char array contains two elements of a string for each value
+
+    int char_set = 0;
+    //int lsms_flag = 0;
+    int err = 0;
+    int i = 0;
+
+    msg = (int8 *)p_msg->content;
+
+    msg_len = strlen(p_msg->content);
+
+    phone_num = (int8 *)p_msg->addr;
+
+    if (p_msg->format == 0)//7
+        char_set = 0;
+    else if (p_msg->format == 1)//8
+        char_set = 1;
+    else if (p_msg->format == 2)//UCS2
+        char_set = 2;
+    else
+    {
+        LOGE("ql_sms_send_msg_async format error");
+        return QL_ERR_FAILED;
+    }
+
+    if(strcmp((char*)msg,"") == 0 || msg[0] == '\0')
+    {
+        LOGE("ql_sms_send_msg_async msg [%s]",msg);
+        return QL_ERR_FAILED;
+    }
+
+    if(strcmp((char*)phone_num,"") == 0 || phone_num[0] == '\0')
+    {
+        LOGE("ql_sms_send_msg_async phone_num [%s]",phone_num);
+        return QL_ERR_FAILED;
+    }
+
+    kal_int32 msg_num = 0;
+    kal_int32 pdu_msg_len = 0;
+    kal_int32 status = MDAPI_RET_ERROR;
+    kal_int32 index = 0;
+
+    if(char_set == 1) //8bit
+    {
+        ArrayToStr((unsigned char *)msg, (unsigned int)msg_len, msg_e_b);
+        status = _mdapi_sms_get_msg_num(msg_e_b, char_set, &msg_num, &pdu_msg_len);
+    }
+    else //7bit usc2
+    {
+        status = _mdapi_sms_get_msg_num((char *)msg, char_set, &msg_num, &pdu_msg_len);
+    }
+    
+    LOGE("msg_len = [%d] ,msg_num=[%d]",msg_len, msg_num);
+    if(status == MDAPI_RET_ERROR)
+    {
+        LOGE("get message number failed");
+        return QL_ERR_FAILED;
+    }
+    else
+    {        
+        //allocate memery for **pdu
+        pdu = (char **)malloc(sizeof(char *) * msg_num);
+        if(pdu == NULL)
+        {
+            LOGE("allocate memory for pdu failed");
+            return QL_ERR_FAILED;
+        }
+        else
+        {
+            for(index = 0; index < msg_num; index++)
+            {
+                pdu[index] = (char *)malloc(sizeof(char)*MAX_PDU_SIZE);
+                if(pdu[index] == NULL)
+                {
+                    for(i = 0; i < index; i++)
+                    {
+                        free(pdu[i]);
+                        pdu[i] = NULL;
+                    }
+                    free(pdu);
+                    pdu = NULL;
+                    LOGE("allocate memory for pdu[%d] failed",index);
+                    return QL_ERR_FAILED;
+                }
+                else
+                {
+                    memset(pdu[index], 0, MAX_PDU_SIZE);
+                    LOGE("pdu[%d} init value is: %s ",index, pdu[index]);
+                }
+            }
+        }
+    }
+
+    //allocate memory for **pdu success
+    if(index == msg_num)
+    {
+        if(char_set == 1)//8bit
+        {
+            smsPduEncode(smsc, (char *)phone_num, msg_e_b, char_set, smscPDU, pdu);
+        }
+        else
+        {
+            smsPduEncode(smsc, (char *)phone_num, (char *)msg, char_set, smscPDU, pdu);
+        }
+        for(index = 0; index < msg_num; index++)
+        {
+            char pdu_data[MAX_PDU_SIZE] = {0};
+            char *p = pdu_data;
+
+            LOGE("index:%d",index);
+            LOGE("smscPDU: %s, pdu: %s",smscPDU, pdu[index]);
+            sprintf(p, "%s",smscPDU);
+            LOGE("pdu_data:%s\n", pdu_data);
+            int sc = strlen(pdu_data);
+            sprintf(p+strlen(p), "%s", pdu[index]);
+            LOGE("pdu_data:%s", pdu_data);
+
+            int t = strlen(pdu_data);
+            sprintf(cmgs, "%d,%s", (t-sc)/2, pdu_data);
+            LOGE("cmgs:%s\n", cmgs);
+            memset(resp, 0, sizeof(resp));
+
+            err = mbtk_sms_cmgf_set(sms_handle->handle, 0);
+            if(err)
+            {
+                LOGE("cmgf set error : %d", err);
+                for(index = 0; index < msg_num; index++){
+                    free(pdu[index]);
+                    pdu[index] = NULL;
+                }
+                free(pdu);
+                pdu = NULL;
+                return QL_ERR_FAILED;
+            }
+            else
+            {
+                LOGD("cmgf set success");
+            }
+
+            err = mbtk_sms_cmgs_set(sms_handle->handle, cmgs, resp);
+            if(err)
+            {
+                LOGE("cmgs send fail (%d)",err);
+                for(index = 0; index < msg_num; index++){
+                    free(pdu[index]);
+                    pdu[index] = NULL;
+                }
+                free(pdu);
+                pdu = NULL;
+                return QL_ERR_FAILED;
+            }
+            else
+            {
+                LOGD("cmgs send success, resp:%s", resp);
+            }
+
+        }
+    }
+
+    for(index = 0; index < msg_num; index++){
+        free(pdu[index]);
+        pdu[index] = NULL;
+    }
+    free(pdu);
+    pdu = NULL;
+
+    *id = 1;
+    cb(1, 1);
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets SMS message reception callback hanlder.
+  @param[in] cb message reception callback handler.
+  @return Whether the message reception callback hanlder was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_set_msg_recv_cb(ql_sms_msg_recv_cb_f cb)
+{
+    if(NULL == sms_handle)
+    {
+        LOGE("[ql_sms_set_msg_recv_cb] sms handle not init.");
+        return QL_ERR_NOT_INIT;
+    }
+
+    sms_handle->recv_cb = cb;
+
+    return QL_ERR_OK;
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sends PDU synchronously.
+  @param[in] p_pdu SMS PDU.
+  @return Whether the PDU was successfully sent synchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_send_pdu(ql_sms_pdu_t *p_pdu);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sends PDU asynchronously.
+  @param[in] p_pdu sms pdu.
+  @param[out] id id for this async operation.
+  @param[in] cb async callback.
+  @return Whether the PDU was successfully sent asynchronously.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_send_pdu_async(ql_sms_pdu_t *p_pdu, int *id, ql_sms_pdu_async_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets SMS PDU reception callback hanlder.
+  @param[in] cb PDU reception callback handler.
+  @return Whether the PDU reception callback hanlder was set successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_set_pdu_recv_cb(ql_sms_pdu_recv_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally,
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_set_service_error_cb(ql_sms_service_error_cb_f cb)
+{
+    if(NULL == sms_handle)
+    {
+        LOGE("[ql_sms_set_service_error_cb] sms handle not init.");
+        return QL_ERR_NOT_INIT;
+    }
+
+    sms_handle->server_cb = cb;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Binds the current control point to a specific subscription.
+  @param[in] sub  Subscription type.
+  @return Whether the subscription was successfully bound.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_sms_bind_subscription(QL_SMS_SUBSCRIPTION_E sub);
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_test_utils.c b/mbtk/libql_lib_v2_rilv2/ql_test_utils.c
new file mode 100755
index 0000000..b28f3cd
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_test_utils.c
@@ -0,0 +1,330 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file test_utils.c 
+  @brief Test related interface definition
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20190508   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+#include "ql_test_utils.h"
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a int value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int(int *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if(NULL == fgets(buf, sizeof(buf)-1, stdin))
+    {
+        return -1;
+    }
+    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 10);
+    if(ptr_end!=NULL && ptr_end[0]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = dat;
+    }
+
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a uint32 value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_hex(uint32_t *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 16);
+    if(ptr_end!=NULL && ptr_end[0]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = dat;
+    }
+
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a char value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_char(int *val)
+{
+    char buf[256] = {0};
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    if(buf[1]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = buf[0];
+    }
+
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a string value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_string(char *str_buf, int str_len)
+{
+    char *ptr;
+    char buf[256] = {0};
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+    
+    ptr = strchr(buf, '\n');
+    if(ptr)
+    {
+        ptr[0] = 0;
+    }
+    
+    strncpy(str_buf, buf, str_len-1);
+    
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a list of int values from stdin 
+  @param[out] val, Return read datas
+  @param[out&in] val, Input buffer length, output the number of read
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int_list(int *dat_buf, int *dat_len)
+{
+    int idx = 0;
+    int len;
+    int dat;
+    char *ptr, *ptr_save;
+    char *ptr_end;
+    char buf[256] = {0};
+
+    if(!dat_buf || !dat_len)
+    {
+        return -1;
+    }
+
+    len = dat_len[0];
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    for(ptr=strtok_r(buf, ",.: \t\r\n", &ptr_save); 
+            ptr!=NULL;
+            ptr=strtok_r(NULL, ",.: \t\r\n", &ptr_save))
+    {
+        dat = strtol(ptr, &ptr_end, 10);
+        if(ptr_end!=NULL && ptr_end[0]!=0)
+        {
+            return -1;
+        }
+        if(idx >= len)
+        {
+            return 0;
+        }
+
+        dat_buf[idx] = dat;
+        idx++;
+    }
+    
+    dat_len[0] = idx;
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a list of float values from stdin 
+  @param[out] val, Return read datas
+  @param[out&in] val, Input buffer length, output the number of read
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_float_list(float *dat_buf, int *dat_len)
+{
+    int idx = 0;
+    int len;
+    float dat;
+    char *ptr, *ptr_save;
+    char *ptr_end;
+    char buf[256] = {0};
+
+    if(!dat_buf || !dat_len)
+    {
+        return -1;
+    }
+
+    len = dat_len[0];
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    for(ptr=strtok_r(buf, ",: \t\r\n", &ptr_save); 
+            ptr!=NULL;
+            ptr=strtok_r(NULL, ",: \t\r\n", &ptr_save))
+    {
+        dat = strtof(ptr, &ptr_end);
+        if(ptr_end!=NULL && ptr_end[0]!=0)
+        {
+            return -1;
+        }
+        if(idx >= len)
+        {
+            return 0;
+        }
+
+        dat_buf[idx] = dat;
+        idx++;
+    }
+    
+    dat_len[0] = idx;
+    return 0;
+}
+
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_voice.c b/mbtk/libql_lib_v2_rilv2/ql_voice.c
new file mode 100755
index 0000000..367753d
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_voice.c
@@ -0,0 +1,869 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_voice.h
+  @brief Voice service API.
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20210622   Rambo.shan   Added Voice DSDA API.
+  20210203   Rambo.shan   Added Voice bind API for DSDA.
+  20210104   Rambo.shan   Added DTMF event indication.
+  20200928   Rambo.shan   Added eCall set option of T3.
+  20200907   Rambo.shan   Added SETUP voice state.
+  20200622   Rambo.shan   Add eCall auto answer function
+  20191225   solomon.cui  Modify fucntion description.
+  20191111   solomon.cui  Add eCall APIs.
+  20190815   solomon.cui  Add service type for sending message.
+  20190625   solomon.cui  Created.
+-------------------------------------------------------------------------------------------------*/
+#include "mbtk_type.h"
+#include "mbtk_ril_api.h"
+#include "mbtk_log.h"
+#include "ql_voice.h"
+#include "ql_type.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/epoll.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <string.h>
+#include <fcntl.h>
+#include <time.h>
+
+#define MBTK_ERR_OK             0
+
+typedef struct {
+    mbtk_ril_handle*         handle;
+    int                         state_t;
+    ql_voice_record_array_t     record_array;
+    ql_voice_call_cb_f          call_cb;
+    ql_voice_service_error_cb_f server_cb;
+}ql_voice_info_handle_t;
+
+
+static ql_voice_info_handle_t* voice_handle = NULL;
+
+
+typedef struct {
+    mbtk_voice_end_reason_enum mbtk_end_reason;
+    QL_VOICE_END_REASON_E ql_end_reason;
+}end_reason_t;
+
+
+
+end_reason_t g_end_reason[] = {
+{MBTK_VOICE_END_REASON_UNASSIGNED_NUMBER, QL_VOICE_END_REASON_UNASSIGNED_NUMBER}, 
+{MBTK_VOICE_END_REASON_NO_ROUTE_DES, QL_VOICE_END_REASON_NO_ROUTE_TO_DESTINATION}, 
+{MBTK_VOICE_END_REASON_CHANNEL_UNACCEPTABLE, QL_VOICE_END_REASON_CHANNEL_UNACCEPTABLE}, 
+{MBTK_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING, QL_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING}, 
+{MBTK_VOICE_END_REASON_NORMAL_CALL_CLEARING, QL_VOICE_END_REASON_NORMAL_CALL_CLEARING}, 
+{MBTK_VOICE_END_REASON_USER_BUSY, QL_VOICE_END_REASON_USER_BUSY}, 
+
+{MBTK_VOICE_END_REASON_NO_USER_RESPONDING, QL_VOICE_END_REASON_NO_USER_RESPONDING}, 
+{MBTK_VOICE_END_REASON_USER_ALERTING_NO_ANSWER, QL_VOICE_END_REASON_USER_ALERTING_NO_ANSWER}, 
+{MBTK_VOICE_END_REASON_CALL_REJECTED, QL_VOICE_END_REASON_CALL_REJECTED}, 
+{MBTK_VOICE_END_REASON_NUMBER_CHANGED, QL_VOICE_END_REASON_NUMBER_CHANGED}, 
+{MBTK_VOICE_END_REASON_PREEMPTION, QL_VOICE_END_REASON_PREEMPTION}, 
+{MBTK_VOICE_END_REASON_NON_SELECTED_USER_CLEARING, QL_VOICE_END_REASON_NONE}, 
+{MBTK_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER, QL_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER}, 
+{MBTK_VOICE_END_REASON_INVALID_NUMBER_FORMAT, QL_VOICE_END_REASON_INVALID_NUMBER_FORMAT}, 
+{MBTK_VOICE_END_REASON_FACILITY_REJECTED, QL_VOICE_END_REASON_FACILITY_REJECTED}, 
+{MBTK_VOICE_END_REASON_STATUS_ENQUIRY, QL_VOICE_END_REASON_RESP_TO_STATUS_ENQUIRY}, 
+{MBTK_VOICE_END_REASON_NORMAL_UNSPECIFIED, QL_VOICE_END_REASON_NORMAL_UNSPECIFIED}, 
+{MBTK_VOICE_END_REASON_NO_CIRCUIT_AVAILABLE, QL_VOICE_END_REASON_NO_CIRCUIT_OR_CHANNEL_AVAILABLE}, 
+{MBTK_VOICE_END_REASON_NETWORK_OUT_OF_ORDER, QL_VOICE_END_REASON_NETWORK_OUT_OF_ORDER}, 
+{MBTK_VOICE_END_REASON_TEMPORARY_FAILURE, QL_VOICE_END_REASON_TEMPORARY_FAILURE}, 
+{MBTK_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION, QL_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION}, 
+{MBTK_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED, QL_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED}, 
+{MBTK_VOICE_END_REASON_REQUESTED_CIRCUIT_UNAVAILABLE, QL_VOICE_END_REASON_REQUESTED_CIRCUIT_OR_CHANNEL_NOT_AVAILABLE}, 
+
+{MBTK_VOICE_END_REASON_SERVICE_NOT_AVAILABLE, QL_VOICE_END_REASON_SERVICE_OPTION_NOT_AVAILABLE},
+
+{MBTK_VOICE_END_REASON_END, QL_VOICE_END_REASON_NONE}
+
+};
+
+
+
+    static int end_reason_mbtk_to_ql(char* mbtk_reason, int* ql_reason)
+{
+    int bufefer_i = 0;
+    *ql_reason = QL_VOICE_END_REASON_NONE;
+
+    bufefer_i = atoi(mbtk_reason);
+
+    for(int i = 0; g_end_reason[i].mbtk_end_reason != MBTK_VOICE_END_REASON_END; i++)
+    {
+         if(bufefer_i == g_end_reason[i].mbtk_end_reason)
+         {
+            *ql_reason = g_end_reason[i].ql_end_reason;
+            break;
+         }
+    }
+
+    return 0;
+}
+
+
+static void ql_voice_state_change_cb(const void* data, int data_len)
+{
+    if(NULL == data)
+    {
+        LOGE("[ql_voice_state_change_cb] data is null.");
+        return;
+    }
+
+    if(voice_handle->call_cb == NULL) {
+        LOGW("voice_state_change_cb not set.");
+        return;
+    }
+    
+    mbtk_call_info_t *reg = (mbtk_call_info_t *)data;
+
+    int ql_reason = 0;
+    end_reason_mbtk_to_ql((char*)reg->end_reason, &ql_reason);
+    LOG("ql_voice_state_change_cb ql_reason:%d", ql_reason);
+        
+
+    if(MBTK_RIL_CALL_STATE_DISCONNECT != reg->state)
+    {
+        LOG("ql_voice_state_change_cb : %d, %d, %d, %d, %d, %s, %d, %s", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type, reg->end_reason);
+
+        switch(reg->state)
+        {
+            case 0:
+            voice_handle->state_t = QL_VOICE_STATE_ACTIVE;
+            break;
+            case 1:
+            voice_handle->state_t = QL_VOICE_STATE_HOLDING;
+            break;
+            case 2:
+            voice_handle->state_t = QL_VOICE_STATE_DIALING;
+            break;
+            case 3:
+            voice_handle->state_t = QL_VOICE_STATE_ALERTING;
+            break;
+            case 4:
+            voice_handle->state_t = QL_VOICE_STATE_INCOMING;
+            break;
+            case 5:
+            voice_handle->state_t = QL_VOICE_STATE_WAITING;
+            break;
+            case 7:
+            voice_handle->state_t = QL_VOICE_STATE_END;
+            break;
+        }
+
+        if (voice_handle->record_array.records[0].id == 0 || voice_handle->record_array.records[0].id == reg->dir1)
+        {
+            voice_handle->record_array.len = 1;
+            voice_handle->record_array.records[0].id = reg->dir1;
+            voice_handle->record_array.records[0].tech = 1;
+            voice_handle->record_array.records[0].dir = reg->dir;
+            voice_handle->record_array.records[0].end_reason = ql_reason;
+            voice_handle->record_array.records[0].state = voice_handle->state_t;
+            memcpy(voice_handle->record_array.records[0].number, reg->phone_number, strlen(reg->phone_number));
+        }
+        else if (voice_handle->record_array.records[0].id != reg->dir1)
+        {
+            voice_handle->record_array.len = 2;
+            voice_handle->record_array.records[1].id = reg->dir1;
+            voice_handle->record_array.records[1].tech = 1;
+            voice_handle->record_array.records[1].dir = reg->dir;
+            voice_handle->record_array.records[1].end_reason = ql_reason;
+            voice_handle->record_array.records[1].state = voice_handle->state_t;
+            memcpy(voice_handle->record_array.records[1].number, reg->phone_number, strlen(reg->phone_number));
+        }
+
+        voice_handle->call_cb(&voice_handle->record_array);
+    }
+    else
+    {
+        LOGI("RING : call dis connected!");
+        voice_handle->record_array.records[0].end_reason = ql_reason;
+        voice_handle->record_array.records[1].end_reason = ql_reason;
+        if(voice_handle->record_array.records[0].id == reg->dir1)
+        {
+            voice_handle->record_array.records[0].state = QL_VOICE_STATE_END;
+            voice_handle->record_array.records[0].id = 0;
+        }
+        if(voice_handle->record_array.records[1].id == reg->dir1)
+        {
+            voice_handle->record_array.records[1].state = QL_VOICE_STATE_END;
+            voice_handle->record_array.records[1].id = 0;
+            voice_handle->record_array.len = 1;
+        }
+        if (reg->disconnected_id == voice_handle->record_array.records[1].id)
+            voice_handle->call_cb(&voice_handle->record_array);
+        else
+            voice_handle->call_cb(&voice_handle->record_array);
+    }
+
+}
+
+static void ql_voice_server_change_cb(const void* data, int data_len)
+{
+    if(data_len != sizeof(int))
+    {
+        LOGE("[ql_voice_server_change_cb] data_len[%d] than int[%d] fail. ", data_len, sizeof(int));
+    }
+    else
+    {
+        int server_state = *(int *)data;
+        if(server_state == 1 && voice_handle->server_cb)
+        {
+            voice_handle->server_cb(QL_ERR_ABORTED);
+        }
+    }
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Initializes voice service.
+  @return Whether the voice service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_init(void)
+{
+     if(NULL == voice_handle)
+    {
+        voice_handle = (ql_voice_info_handle_t*)malloc(sizeof(ql_voice_info_handle_t));
+        memset(voice_handle, 0, sizeof(ql_voice_info_handle_t));
+        voice_handle->record_array.records[0].id = 0;
+        if(NULL == voice_handle)
+        {
+            LOGE("[ql_voice_init] voice handle malloc fail.");
+            return QL_ERR_FAILED;
+        }
+
+        voice_handle->handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+        if(NULL == voice_handle->handle)
+        {
+            LOGE("[ql_voice_init] mbtk handle init fail.");
+            if(voice_handle)
+            {
+                free(voice_handle);
+                voice_handle = NULL;
+                return QL_ERR_FAILED;
+            }
+        }
+
+        int ret = mbtk_call_state_change_cb_reg( ql_voice_state_change_cb);
+        if(ret != MBTK_ERR_OK)
+        {
+            LOGE("[ql_voice_init] set voice state cb fail.[%d]", ret);
+             if(voice_handle->handle)
+            {
+                mbtk_ril_close(MBTK_AT_PORT_DEF);
+                voice_handle->handle = NULL;
+                return QL_ERR_FAILED;
+            }
+        }
+
+        ret = mbtk_ril_ser_state_change_cb_reg(ql_voice_server_change_cb);
+        if(ret != MBTK_ERR_OK)
+        {
+            LOGE("[ql_sim_init] set sim server cb fail.[%d]", ret);
+             if(voice_handle->handle)
+            {
+                mbtk_ril_close(MBTK_AT_PORT_DEF);
+                voice_handle->handle = NULL;
+                return QL_ERR_FAILED;
+            }
+        }
+
+        voice_handle->call_cb = NULL;
+        voice_handle->server_cb = NULL;
+    }
+     return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Deinitializes voice service.
+  @return Whether the voice service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_deinit(void)
+{
+    if(NULL == voice_handle)
+    {
+        LOGE("[ql_voice_deinit] voice handle not init.");
+        return QL_ERR_NOT_INIT;
+    }
+
+    int ret = 0;
+    voice_handle->server_cb = NULL;
+    voice_handle->call_cb = NULL;
+
+    if(NULL != voice_handle->handle)
+    {
+        ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if(ret != MBTK_ERR_OK)
+        {
+            LOGE("[ql_voice_deinit] mbtk handle deinit fail.[%d]", ret);
+            return QL_ERR_FAILED;
+        }
+        voice_handle->handle = NULL;
+    }
+
+    if(ret != QL_ERR_OK)
+    {
+        LOGE("[ql_voice_deinit] cb thread free deinit fail.");
+        return QL_ERR_FAILED;
+    }
+
+    free(voice_handle);
+    voice_handle = NULL;
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Dials a call.
+  @param[in] num    phone number to dial.
+  @param[in] len    length of phone number, should be less than
+                    or euqnal to QL_VOICE_MAX_PHONE_NUMBER.
+  @param[out] id    call id.
+  @return Whether a voice call was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_dial(char *num, int len, uint32_t *id)
+{
+    char* phone_num_t = NULL;
+    mbtk_call_info_t reg = {0};
+    int err;
+
+    if(voice_handle->handle == NULL)
+    {
+        LOGE("ql_voice_call_start call_info_handle NULL");
+        return QL_ERR_FAILED;
+    }
+
+    if (num == NULL)
+    {
+        LOGE("ql_voice_call_start phone_number NULL");
+        return QL_ERR_FAILED;
+
+    }
+
+    phone_num_t  = num;
+
+    err = mbtk_call_start(voice_handle->handle, phone_num_t);
+    if(err)
+    {
+        LOGE("Error : %d\n", err);
+        return QL_ERR_FAILED;
+    }
+    else
+    {
+        LOGI("Call success.");
+    }
+
+    mbtk_call_reg_get(voice_handle->handle, &reg);
+    *id = reg.dir1;
+    LOG("ql_voice_dial call_id: %d\n", reg.dir1, *id);
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Cancels dialing with given id.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully cancelled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_cancel_dial(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  hangup all dialing.
+  @return Whether all voice call were successfully hangup.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_hangup_all(void)
+{
+    int err;
+
+    if(voice_handle->handle == NULL)
+    {
+        LOGE("ql_voice_call_end call_info_handle NULL");
+        return QL_ERR_FAILED;
+    }
+
+    err = mbtk_call_hang(voice_handle->handle);
+    if(err)
+    {
+        LOGE("Error : %d", err);
+        return QL_ERR_FAILED;
+    }
+    else
+    {
+        LOGI("Call hang up a all.");
+    }
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Answers the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully answered.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_answer(uint32_t id)
+{
+    int err;
+
+    if(voice_handle->handle == NULL)
+    {
+        LOGE("ql_voice_call_anser call_info_handle NULL");
+        return QL_ERR_FAILED;
+    }
+
+    err = mbtk_call_answer(voice_handle->handle);
+    if(err)
+    {
+        LOGE("Error : %d", err);
+        return QL_ERR_FAILED;
+    }
+    else
+    {
+        LOGI("Answer success.");
+    }
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Hangs up the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_hangup(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Holds the call when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully held.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_hold(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Releases the call from hold when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully unheld.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_unhold(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets call records.
+  @param[in] p_arr  pointer to ql_voice_record_array_t.
+  @return Whether the call records were successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_get_records(ql_voice_record_array_t *p_arr)
+{
+    if(NULL == p_arr)
+    {
+        LOGE("ql_voice_get_records p_arr NULL");
+        return QL_ERR_FAILED;
+    }
+    memcpy(p_arr, &voice_handle->record_array, sizeof(voice_handle->record_array));
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registers or Unregisters forwarding.
+  @param[in] reg    0 - unregister, 1 - register.
+  @param[in] cond   forwarding condition.
+  @param[in] num    phone number.
+  @param[in] len    length of phone numebr.
+  @return Whether the voice call forward was registered or unregistered successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_forwarding(int reg, QL_VOICE_FW_COND_E cond, char *num, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets forwarding status.
+  @param[in]  cond      forwarding condition.
+  @param[out] p_status  pointer to ql_voice_fw_status_t.
+  @return Whether the voice call forward status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_get_forwarding_status(QL_VOICE_FW_COND_E cond, ql_voice_fw_status_t *p_status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Enables or disables call waiting.
+  @param[in] enable 0 - disable, other - enable.
+  @return Whether the voice call waiting was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_waiting(int enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets call waiting status.
+  @param[out] enabled 0 - waiting is disabled, 1 - waiting is enabled.
+  @return Whether the voice call waiting status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_get_waiting_status(int *enabled);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Enables or disables auto answer.
+  @param[in] enable 0 - disable, other - enable.
+  @param[in] sec    wait this `sec' seconds before auto answer.
+  @return Whether the voice call autoanswer was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_autoanswer(int enable, uint32_t sec);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sends a DTMF(Dual Tone Multi Frequency) character over the call ID.
+  @param[in] id call id returned from dial.
+  @param[in] c DTMF character to be sent. Valid DTMF characters are 0-9, A-D, '*', '#'.
+  @return Whether a DTMF character was successfully sent.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_send_dtmf_char(uint32_t id, char c)
+{
+    int ret = 0;
+    int tmp;
+    char callnum_c;
+    mbtk_call_dtmf_info_t *dtmf = NULL;
+
+    if(voice_handle->handle == NULL)
+    {
+        LOGE("ql_voice_set_dtmf call_info_handle NULL");
+        return QL_ERR_FAILED;
+    }
+
+    dtmf = (mbtk_call_dtmf_info_t*)malloc(sizeof(mbtk_call_dtmf_info_t));
+    memset(dtmf,0x00, sizeof(mbtk_call_dtmf_info_t));
+
+    tmp = (int)c;
+
+    callnum_c = c;
+
+    if ((tmp >= 48 && tmp <= 57) || (tmp >= 65 && tmp <= 68) || (tmp == 42) ||  (tmp == 35))
+    {
+        dtmf->duration = 300;
+        dtmf->character = callnum_c;
+
+        ret = mbtk_dtmf_send(voice_handle->handle, dtmf);
+        if (ret)
+        {
+            LOGE("mbtk_dtmf_send Error : %d", ret);
+            ret = QL_ERR_FAILED;
+            goto err;
+        }
+    }
+    else
+    {
+        LOGE("ql_voice_set_dtmf callnum demand ERR");
+        ret = QL_ERR_FAILED;
+        goto err;
+    }
+
+err:
+    free(dtmf);
+    return ret;
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets voice call callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_set_call_cb(ql_voice_call_cb_f cb)
+{
+    if(NULL == voice_handle)
+    {
+        LOGE("[ql_voice_set_msg_recv_cb] voice handle not init.");
+        return QL_ERR_NOT_INIT;
+    }
+
+    voice_handle->call_cb = cb;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets voice dtmf callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call DTMF repcetion callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_set_dtmf_cb(ql_voice_dtmf_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Dials eCall.
+  @param[in] p_info eCall info.
+  @return Whether a eCall was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_dial(ql_voice_ecall_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Hangs up eCall.
+  @return Whether the eCall was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_hangup(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Updates eCall MSD.
+  @param[in] msd Minimum Set of Data.
+  @param[in] msd_len Length of Minimum Set of Data.
+  @return Whether the eCall MSD was successfully updated.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_update_msd(const uint8_t *msd, uint32_t msd_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Pushes eCall MSD.
+  @param[out] state eCall state.
+  @return Whether the eCall MSD was successfully pushed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_push_msd(QL_VOICE_ECALL_STATE_E *state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Gets eCall config.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_get_config(ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets eCall config.
+  @param[in] item Items to set.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_set_config(int item, ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets eCall event callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall event callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_set_event_cb(ql_voice_ecall_event_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Sets eCall status callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall status callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_set_status_cb(ql_voice_ecall_status_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally,
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_set_service_error_cb(ql_voice_service_error_cb_f cb)
+{
+     if(NULL == voice_handle)
+    {
+        LOGE("[ql_voice_set_service_error_cb] voice handle not init.");
+        return QL_ERR_NOT_INIT;
+    }
+
+    voice_handle->server_cb = cb;
+
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Binds the current control point to a specific subscription.
+  @param[in] sub  Subscription type.
+  @return Whether the subscription was successfully bound.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_voice_bind_subscription(QL_VOICE_SUBSCRIPTION_E sub);
+
+
diff --git a/mbtk/libql_lib_v2_rilv2/ql_wifi.c b/mbtk/libql_lib_v2_rilv2/ql_wifi.c
new file mode 100755
index 0000000..90c6424
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_wifi.c
@@ -0,0 +1,1172 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_wifi.h
+  @brief  Wi-Fi service API
+
+  @detailes
+  Quectel  series module Wi-Fi service.
+
+  @htmlonly
+  <span style="font-weight: bold">History</span>
+  @endhtmlonly
+
+  when       |   who       |    what, where, why
+  --------   |   ---       |    ----------------------------------------------------------
+  2020-04-03 |   ewen.li   |    Created .
+  2021-11-08 |   ewen.li   |    Add Wi-Fi P2P API and callback function .
+
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+#ifndef __QL_WIFI_H__
+#define __QL_WIFI_H__
+
+#include "ql_wifi_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Wi-Fi enable status callback function.
+
+  @param[in]  pre_status: The previous Wi-Fi enable status.
+  @param[in]  status: The current Wi-Fi enable status.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_enable_status_ind_cb_f)(QL_WIFI_ENABLE_STATUS_E pre_status, QL_WIFI_ENABLE_STATUS_E status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  AP mode status callback function.
+
+  @param[in]  pre_status: The previous AP mode status.
+  @param[in]  p_msg: The current AP mode status information.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_ap_status_ind_cb_f)(QL_WIFI_AP_INDEX_E index, QL_WIFI_AP_STATUS_E pre_status, ql_wifi_ap_status_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  STA mode status callback function.
+
+  @param[in]  pre_status: The previous STA mode status.
+  @param[in]  p_msg: The current STA mode status information.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_sta_status_ind_cb_f)(QL_WIFI_STA_STATUS_E pre_status, ql_wifi_sta_status_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  STA scan results callback function.
+
+  @param[in]  p_msg: The information list of external hotspots.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_sta_scan_result_ind_cb_f)(ql_wifi_sta_scan_result_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This is a callback function for status of connection between AP and STA device.
+
+  @param[in]  index: The index of AP mode.
+  @param[in]  p_msg: The status of connection between AP and STA device.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_ap_sta_connect_ind_cb_f)(QL_WIFI_AP_INDEX_E index, ql_wifi_sta_connect_status_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Wi-Fi service error callback function.
+
+  @param[in]  error: Error code.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_service_error_cb_f)(int error);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This is a callback function for status of P2P enable.
+
+  @param[in]  pre_status: The previous P2P enable status.
+  @param[in]  status: The current P2P enable status.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_p2p_enable_status_ind_cb_f)(QL_WIFI_P2P_ENABLE_STATUS_E pre_status, QL_WIFI_P2P_ENABLE_STATUS_E status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  The found p2p device callback function.
+
+  @param[in]  p_msg: The information of p2p device 
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_p2p_dev_found_ind_cb_f)(ql_wifi_p2p_found_dev_info_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Peer p2p device requesting connection callback function.
+
+  @param[in]  p_msg: The information of peer p2p device 
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_p2p_peer_dev_req_ind_cb_f)(ql_wifi_p2p_req_peer_dev_info_t *pmsg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  P2P status callback function.
+
+  @param[in]  pre_status: The previous P2P status.
+  @param[in]  status: The current P2P status information.
+
+  @retval  void
+  */
+/*-----------------------------------------------------------------------------------------------*/
+typedef void (*ql_wifi_p2p_status_ind_cb_f)(QL_WIFI_P2P_STATUS_E pre_status, ql_wifi_p2p_status_t *p_msg);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function initializes Wi-Fi service.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_SERVICE_NOT_READY: Wi-Fi service is not ready. It is recommended to try again.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+
+  @note  Before other Wi-Fi APIs are used, this function must be called to initialize the Wi-Fi service.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function deinitializes Wi-Fi service.
+
+  @retval  QL_ERR_OK: Successful execution.
+           Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the country code of wlan driver
+
+  @param[in]  country_code: The country code to be set. The country code cannot exceed 2 bytes and is not empty. For example,  CN represents China.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+
+  @note  Before calling the ql_wifi_enable(), call this function firstly to set country code,
+         If this function is not called, The country code "CN" will be used by default.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_country_code_set(const char *country_code);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the country code of wlan driver.
+
+  @param[out]  country_code_buf: The buffer for storing the current country code. The buffer size is recommended to be 3 bytes.
+  @param[in]   The length of buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_country_code_get(char *country_code_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function enables Wi-Fi function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_enable(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function disables Wi-Fi function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_disable(void);
+
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function set bridge function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_set_bridge(char *bridge);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers Wi-Fi enable status callback function.
+
+  @param[in]  cb: The Wi-Fi enable status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_set_enable_status_ind_cb(ql_wifi_enable_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the Wi-Fi working mode.
+
+  @param[in]  mode: The Wi-Fi working mode to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_work_mode_set(QL_WIFI_WORK_MODE_E mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the current Wi-Fi working mode.
+
+  @param[out]  p_mode: The current Wi-Fi working mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_work_mode_get(QL_WIFI_WORK_MODE_E *p_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the SSID in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  ssid: The SSID to be set. It should be within 32 bytes and is not empty.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_ssid_set(QL_WIFI_AP_INDEX_E idx, const char *ssid);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the SSID in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  ssid_buf: The buffer for storing the current SSID, the buffer size is recommended to be 33 bytes.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_ssid_get(QL_WIFI_AP_INDEX_E idx, char *ssid_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the SSID hiding status in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  ssid_hidden: The SSID hiding status to be set.
+                           0: The SSID is not hidden.
+                           1: The SSID is hidden.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_ssid_hidden_set(QL_WIFI_AP_INDEX_E idx, int ssid_hidden);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the SSID hiding status in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[out]  p_ssid_hidden: The current SSID hiding status in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_ssid_hidden_get(QL_WIFI_AP_INDEX_E idx, int *p_ssid_hidden);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the working protocol mode in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  mode: The working protocol mode to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_mode_set(QL_WIFI_AP_INDEX_E idx, QL_WIFI_AP_MODE_TYPE_E mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the working protocol mode in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_mode: The current working protocol mode in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_mode_get(QL_WIFI_AP_INDEX_E idx, QL_WIFI_AP_MODE_TYPE_E *p_mode);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the bandwidth in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  bandwidth: The bandwidth to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_bandwidth_set(QL_WIFI_AP_INDEX_E idx, QL_WIFI_BANDWIDTH_E bandwidth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the bandwidth in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_bandwidth: The current bandwidth in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_bandwidth_get(QL_WIFI_AP_INDEX_E idx, QL_WIFI_BANDWIDTH_E *p_bandwidth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the channel in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  channel: The channel to be set.
+                       0: Adaptive
+                       1/2/3/4/5/6/7/8/9/10/11/12/13/14: 2.4G channel.
+                       36/40/44/48/52/56/60/64/100/104/108/112/116/120/124/128/132/136/140/144/149/153/157/161/165: 5GHZ channel.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_channel_set(QL_WIFI_AP_INDEX_E idx, int channel);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the channel in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[out]  p_channel: The currently-used channel in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_channel_get(QL_WIFI_AP_INDEX_E idx, int *p_channel);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the maximum number of terminal connections in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  max_sta_num: The maximum number of terminal connections in AP mode to be set. Range: 1~32.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_max_sta_num_set(QL_WIFI_AP_INDEX_E idx, int max_sta_num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the maximum number of terminal connections in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[out]  p_max_sta_num: The current maximum number of terminal connections in AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_max_sta_num_get(QL_WIFI_AP_INDEX_E idx, int *p_max_sta_num);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the country code in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  country_code: The country code to be set. The country code cannot exceed 2 bytes and is not empty. For example,  CN represents China.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_country_code_set(QL_WIFI_AP_INDEX_E idx, const char *country_code);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the country code in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  country_code_buf: The buffer for storing the current country code. The buffer size is recommended to be 3 bytes.
+  @param[in]   The length of buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_country_code_get(QL_WIFI_AP_INDEX_E idx, char *country_code_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the AP isolation state.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  isolate: AP isolation status to be set.
+                       0: AP is not isolated.
+                       1: AP is isolated.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_isolate_set(QL_WIFI_AP_INDEX_E idx, int isolate);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the AP isolation state.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_isolate: The current AP isolation status.
+                          0: AP is not isolated.
+                          1: AP is isolated.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_isolate_get(QL_WIFI_AP_INDEX_E idx, int *p_isolate);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets MAC address access rules in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  acl_rule: MAC address access rules to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_mac_acl_rule_set(QL_WIFI_AP_INDEX_E idx, QL_WIFI_MAC_ACL_RULE_E acl_rule);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets MAC address access rules in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_acl_rule: The current MAC address access rules.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_mac_acl_rule_get(QL_WIFI_AP_INDEX_E idx, QL_WIFI_MAC_ACL_RULE_E *p_acl_rule);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function adds or deletes the specified MAC address for the current MAC address access rule.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  cmd: MAC address operation command.
+  @param[in]  macaddr: MAC address to be added or deleted., The format of MAC address 
+                       must be %02X:%02X:%02X:%02X:%02X:%02X, For example: 1A:2B:3C:4D:56:78.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_acl_mac_set(QL_WIFI_AP_INDEX_E idx, QL_WIFI_ACL_MAC_CMD_E cmd, const char *macaddr);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets all MAC addresses in the current MAC address access rule.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_mac_list: MAC address list.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_acl_mac_get(QL_WIFI_AP_INDEX_E idx, ql_wifi_acl_mac_list_t *p_mac_list);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the authentication in AP mode.
+
+  @param[in]  idx: The index of AP mode.
+  @param[in]  p_auth: The authentication information to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_auth_set(QL_WIFI_AP_INDEX_E idx, ql_wifi_ap_auth_t *p_auth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the authentication information in AP mode.
+
+  @param[in]   idx: The index of AP mode.
+  @param[out]  p_auth: The current authentication information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_auth_get(QL_WIFI_AP_INDEX_E idx, ql_wifi_ap_auth_t *p_auth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the AP mode status callback function.
+
+  @param[in]  cb: The AP mode status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_set_status_ind_cb(ql_wifi_ap_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function starts the AP function.
+
+  @param[in]  index: The index of AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_start(QL_WIFI_AP_INDEX_E index);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function stops the AP function.
+
+  @param[in]  index: The index of AP mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_stop(QL_WIFI_AP_INDEX_E index);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the AP mode status information.
+
+  @param[in]   index: The index of AP mode.
+  @param[out]  p_sta: The current AP mode status information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_ap_get_status(QL_WIFI_AP_INDEX_E index, ql_wifi_ap_status_t *p_sta);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the SSID in STA mode.
+
+  @param[in]  ssid: The SSID to be set. The SSID cannot exceed 32 bytes and is not empty.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_ssid_set(const char *ssid);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the SSID in STA mode.
+
+  @param[out]  ssid_buf: The buffer for storing the current SSID.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_ssid_get(char *ssid_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the authentication in STA mode.
+
+  @param[in]  p_auth: The authentication information to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_auth_set(ql_wifi_sta_auth_t *p_auth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the authentication information in STA mode.
+
+  @param[out]  p_auth: The current authentication information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_auth_get(ql_wifi_sta_auth_t *p_auth);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the STA mode status callback function.
+
+  @param[in]  cb: The STA mode status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_set_status_ind_cb(ql_wifi_sta_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function starts the STA function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_start(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function stops the STA function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_stop(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the STA mode status information.
+
+  @param[out]  p_sta: The current STA mode status information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_get_status(ql_wifi_sta_status_t *p_sta);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function scans for external hotspots in STA mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_start_scan(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the scan result callback function.
+
+  @param[in]  cb: The scan result callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_sta_set_scan_result_ind_cb(ql_wifi_sta_scan_result_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the callback function for status of connection between AP and STA device.
+
+  @param[in]  cb: The callback function for status of connection between AP and STA device.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_set_ap_sta_connect_ind_cb(ql_wifi_ap_sta_connect_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the Wi-Fi service error callback function.
+
+  @param[in]  cb: Wi-Fi service error callback function, executed only when the Wi-Fi service exits abnormally.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_set_service_error_cb(ql_wifi_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the P2P device name.
+
+  @param[in]  dev_name: The device name to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_name_set(const char *dev_name);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the P2P device name.
+
+  @param[out]  dev_name_buf: The buffer for storing the current device name.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_name_get(char *dev_name_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the P2P device type.
+
+  @param[in]  dev_type: The device type to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_type_set(const char *dev_type);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the P2P device type.
+
+  @param[out]  dev_type_buf: The buffer for storing the current device type.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_type_get(char *dev_type_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the operating class and operating channel in P2P mode.
+
+  @param[in]  oper_class:   The operating class to be set.
+  @param[in]  oper_channel: The operating channel to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+
+  @note  The operating class and operating channel can determine the center frequency,
+         The following are the corresponding values.
+     --------------------------------------------------------------------------------------------
+     |  oper_class  |       oper_channel        |          frequency          | channel spacing |
+     |-------------------------------------------------------------------------------------------
+     |      81      |           1-13            |   2407 + 5 * oper_channel   |      25MHz      |
+     |      82      |            14             |   2414 + 5 * oper_channel   |      25MHz      |
+     |      115     |        36,40,44,48        |   5000 + 5 * oper_channel   |      20MHz      |
+     |      116     |           36,44           |   5000 + 5 * oper_channel   |      40MHz      |
+     |      117     |           40,48           |   5000 + 5 * oper_channel   |      40MHz      |
+     |      124     |     149,153,157,161       |   5000 + 5 * oper_channel   |      20MHz      |
+     |      125     |    149,153,157,161,165    |   5000 + 5 * oper_channel   |      20MHz      |
+     |      126     |          149,157          |   5000 + 5 * oper_channel   |      40MHz      |
+     |      127     |          153,161          |   5000 + 5 * oper_channel   |      40MHz      |
+     --------------------------------------------------------------------------------------------
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_oper_class_channel_set(int oper_class, int oper_channel);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the operating class and operating channel in P2P mode.
+
+  @param[out]  p_oper_class:   The currently-used operating class in p2p mode.
+  @param[out]  p_oper_channel: The currently-used operating channel in p2p mode.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_oper_class_channel_get(int *p_oper_class, int *p_oper_channel);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function sets the suffix of ssid.
+
+  @param[in]  ssid_postfix: The suffix of ssid to be set.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_ssid_postfix_set(const char *ssid_postfix);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets the suffix of ssid.
+
+  @param[out]  ssid_postfix_buf: The buffer for storing the current suffix of ssid.
+  @param[in]   buf_len: The length of the buffer.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_ssid_postfix_get(char *ssid_postfix_buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the P2P enable status callback function.
+
+  @param[in]  cb: P2P enable status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_set_enable_status_ind_cb(ql_wifi_p2p_enable_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function enables P2P function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_enable(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function disables P2P function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_disable(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the found p2p device callback function.
+
+  @param[in]  cb: The found p2p device callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_set_dev_found_ind_cb(ql_wifi_p2p_dev_found_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function start finding P2P device.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_find_start(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function stop finding P2P device.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_dev_find_stop(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function gets P2P mode status information.
+
+  @param[out]  p_status: The current P2P mode status information.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_get_status(ql_wifi_p2p_status_t *p_status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers the P2P status callback function.
+
+  @param[in]  cb: The P2P status callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_set_status_ind_cb(ql_wifi_p2p_status_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function registers peer p2p device requesting connection callback function.
+
+  @param[in]  cb: Peer p2p device requesting connection callback function.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_set_peer_dev_req_ind_cb(ql_wifi_p2p_peer_dev_req_ind_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function establishes a P2P connection.
+
+  @param[in]  macaddr: The MAC address of peer P2P device.
+  @param[in]  wps_method: key words: "pbc", "pin" and pin_code, The pin_code is a string that 
+                          dynamically generated random from peer display.
+  @param[in]  go_intent: Degree of desire to be GO, range: 0-15.
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  QL_ERR_INVALID_ARG: Failed execution due to illegal parameter.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_connect(const char *macaddr, const char *method, int go_intent);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  This function disconnects a P2P connection
+
+  @retval  QL_ERR_OK: Successful execution.
+  @retval  QL_ERR_NOT_INIT: Failed execution. The Wi-Fi service is not initialized.
+  @retval  QL_ERR_SERVICE_ABORT: Failed execution due to Wi-Fi service error.
+  @retval  Other value: Failed execution. See ql_type.h for the error code.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_wifi_p2p_disconnect(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/mbtk/mbtk_at/Makefile b/mbtk/mbtk_at/Makefile
new file mode 100755
index 0000000..3826dca
--- /dev/null
+++ b/mbtk/mbtk_at/Makefile
@@ -0,0 +1,47 @@
+#
+# Marvell telephony libmbtk_lib Makefile
+#
+#
+include $(BUILDROOT)/rules.make
+
+LOCAL_PATH=$(PXA_MBTK_DIR)/mbtk_at
+
+LOCAL_C_INCLUDES += \
+	-I$(LOCAL_PATH)/inc \
+	-I$(PXA_MRV_APPS_DIR)/include \
+	-I$(PXA_MRV_APPS_DIR)/common/genlib \
+	-I$(PXA_MRV_APPS_DIR)/common/pxa_dbg/inc \
+	-I$(PXA_MRV_APPS_DIR)/atcmd_server/inc \
+	-I$(PXA_MRV_APPS_DIR)/pca_components_unify/inc \
+	-I$(PXA_MRV_APPS_DIR)/pca_components_unify/ci/inc \
+	-I$(PXA_MRV_APPS_DIR)/pca_components_unify/ci_stub/inc \
+	-I$(PXA_MRV_APPS_DIR)/pca_components_unify/ci_stub/src
+
+LOCAL_SRC_FILES:= \
+	src/mbtk_at_basic.c
+
+$(eval $(call define-local-build-dir, objs_mbtk_at))
+dtarget := $(PXA_TARGET_OLIB)/libmbtk_at.so
+
+build: $(dtarget)
+
+LIBS =-lpthread
+
+CFLAGS += $(LOCAL_C_INCLUDES)
+
+$(eval $(call add-many-objects-rule, libmbtk_at_src, $(LOCAL_SRC_FILES),,))
+
+$(dtarget):  $(libmbtk_at_src_oo) alwayslink
+	@echo "  SO     $@"
+	$(MRVL_HIDE)$(CC) $(CFLAGS) $(SHAREDOBJFLAGS) \
+		-o $@ $(libmbtk_at_src_oo) $(PXA_LD_FLAGS) $(LIBS)
+
+install:
+	$(call copy_elf,$(dtarget),lib)
+
+clean:
+	$(call clean_target, $(dtarget), lib)
+
+ifeq "$(filter clean ,$(MAKECMDGOALS))" ""
+-include $(libmbtk_at_src_dd)
+endif
diff --git a/mbtk/mbtk_at/asr/mbtk_device_info.c b/mbtk/mbtk_at/asr/mbtk_device_info.c
new file mode 100755
index 0000000..1158301
--- /dev/null
+++ b/mbtk/mbtk_at/asr/mbtk_device_info.c
@@ -0,0 +1,110 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <dlfcn.h>
+
+#include "mbtk/mbtk_type.h"
+#include "mbtk/mbtk_device.h"
+#include "utlAtParser.h"
+#include "utlTrace.h"
+
+
+#include "mbtk_device_info.h"
+
+#define MBTK_LIB_PATH "/lib/libmbtk_lib.so"
+
+typedef int (*mbtk_dev_info_read_func)(mbtk_device_info_item_enum, void *, int);
+
+//extern TelAtParserID mbtkCurAtHandle;
+/*
+ATI
+Manufacturer:"LYNQ"
+Model:"LYNQ_L501"
+Revision:L501C_USBv02.04b07.01
+IMEI: 868070040313763
+
+OK
+*/
+extern mbtk_dev_info *dev_infos_ptr;
+
+static bool dev_info_inited = FALSE;
+static char revision_out[48] = {0};
+static char revision_in[64] = {0};
+static mbtk_dev_info_read_func dev_info_read = NULL;
+
+static int dev_info_get()
+{
+    if(dev_info_inited) {
+        return 0;
+    }
+    void *handle = dlopen(MBTK_LIB_PATH , RTLD_LAZY);
+    if(handle == NULL)
+    {
+        DBGMSG(MBTK_AT, "dlopen() %s fail : %d", MBTK_LIB_PATH, errno);
+        return -1;
+    }
+
+    dev_info_read = (mbtk_dev_info_read_func)dlsym(handle, "mbtk_dev_info_read");
+    if(dev_info_read == NULL)
+    {
+        DBGMSG(MBTK_AT, "dlsym(mbtk_dev_info_read) fail : %d", errno);
+        return -1;
+    }
+
+    mbtk_device_info_basic_t info_basic;
+    memset(&info_basic, 0, sizeof(mbtk_device_info_basic_t));
+
+    // mbtk_dev_info_read()
+    int result = dev_info_read(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));
+    if(result) {
+        DBGMSG(MBTK_AT, "mbtk_dev_info_read(BASIC) fail.");
+        return -1;
+    }
+
+    if(strlen(info_basic.revision_out) > 0) {
+        memcpy(revision_out, info_basic.revision_out, strlen(info_basic.revision_out));
+    }
+    if(strlen(info_basic.revision_in) > 0) {
+        memcpy(revision_in, info_basic.revision_in, strlen(info_basic.revision_in));
+    }
+    dev_info_inited = TRUE;
+    return 0;
+}
+
+void mbtk_ati_str_get(char *ati_str, int len_max)
+{
+    //char *imei = "868070040313763";
+
+	if(dev_infos_ptr) {
+    	DBGMSG(MBTK_AT, "IMEI : %s[len - %d]", dev_infos_ptr->imei, strlen(dev_infos_ptr->imei));
+	} else {
+		DBGMSG(MBTK_AT, "IMEI error.");
+    }
+
+    char *revision_ptr = NULL;
+    if (InProduction_Mode() && !dev_info_get() && strlen(revision_out) > 0) {
+        revision_ptr = revision_out;
+    } else {
+        revision_ptr = MBTK_DEVICES_REVISION;
+    }
+
+    if(dev_infos_ptr && strlen(dev_infos_ptr->imei) > 0) {
+        snprintf(ati_str, len_max,
+            "Manufacturer:\"%s\"\r\n"
+            "Model:\"%s\"\r\n"
+            "Revision:%s\r\n"
+            "IMEI:%s\r\n",
+            MBTK_DEVICES_MANUFACTURER, MBTK_DEVICES_MODEL,
+            revision_ptr,
+            dev_infos_ptr->imei);
+    } else {
+        snprintf(ati_str, len_max,
+            "Manufacturer:\"%s\"\r\n"
+            "Model:\"%s\"\r\n"
+            "Revision:%s\r\n"
+            "IMEI:\r\n",
+            MBTK_DEVICES_MANUFACTURER, MBTK_DEVICES_MODEL,
+            revision_ptr);
+    }
+}
+
diff --git a/mbtk/mbtk_at/inc/gpio-define.h b/mbtk/mbtk_at/inc/gpio-define.h
new file mode 100755
index 0000000..36c497e
--- /dev/null
+++ b/mbtk/mbtk_at/inc/gpio-define.h
@@ -0,0 +1,133 @@
+/**
+ *   \file gpio-define.h
+ *   \brief A Documented file.
+ *
+ *  Detailed description
+ *   \Author:  Sniper <js.wang@mobiletek.cn>
+ *   \Version: 1.0.0
+ *   \Date: 2022-04-26
+ */
+
+#ifndef __GPIO_DEFINE_H__
+#define __GPIO_DEFINE_H__
+
+/*
+4组GPIO共128个GPIO,分别从GPIO_0到GPIO_127
+GPIO22位于0xd4019000这一组的BIT22
+
+GPIO0_BASE 0xD4019000
+GPIO1_BASE 0xD4019004
+GPIO2_BASE 0xD4019008
+GPIO3_BASE 0xD4019100
+ */
+/*
+MMC_CMD	    GPIO_41
+MMC_DATA0	GPIO_40
+MMC_DATA1	GPIO_39
+MMC_DATA2	GPIO_38
+MMC_DATA3	GPIO_37
+
+SD_DET	GPIO_43
+WLAN_DAT3	GPIO_48
+
+
+*/
+#define  GPIO_FUNC_MMC1_DAT3	0xD401E094
+#define  GPIO_FUNC_MMC1_DAT2	0xD401E098
+#define  GPIO_FUNC_MMC1_DAT1	0xD401E09C
+#define  GPIO_FUNC_MMC1_DAT0	0xD401E0A0
+#define  GPIO_FUNC_MMC1_CMD	0xD401E0A4
+#define  GPIO_FUNC_MMC1_CLK	0xD401E0A8
+#define  GPIO_FUNC_MMC1_CD	0xD401E0AC
+#define  GPIO_FUNC_USB_ID	    0xD401E0B0
+#define  GPIO_FUNC_PRI_TDI	0xD401E0B4
+#define  GPIO_FUNC_PRI_TMS	0xD401E0B8
+#define  GPIO_FUNC_PRI_TCK	0xD401E0BC
+#define  GPIO_FUNC_PRI_TDO	0xD401E0C0
+#define  GPIO_FUNC_QSPI_VMODE_GPIO	0xD401E0C4
+#define  GPIO_FUNC_VBUS_DRV	0xD401E0C8
+#define  GPIO_FUNC_CLK_REQ	0xD401E0CC
+#define  GPIO_FUNC_VCXO_REQ	0xD401E0D4
+#define  GPIO_FUNC_VCXO_OUT	0xD401E0D8
+#define  GPIO_FUNC_GPIO_00	0xD401E0DC
+#define  GPIO_FUNC_GPIO_01	0xD401E0E0
+#define  GPIO_FUNC_GPIO_02	0xD401E0E4
+#define  GPIO_FUNC_GPIO_03	0xD401E0E8
+#define  GPIO_FUNC_GPIO_04	0xD401E0EC
+#define  GPIO_FUNC_GPIO_05	0xD401E0F0
+#define  GPIO_FUNC_GPIO_06	0xD401E0F4
+#define  GPIO_FUNC_GPIO_07	0xD401E0F8
+#define  GPIO_FUNC_GPIO_08	0xD401E0FC
+#define  GPIO_FUNC_GPIO_09	0xD401E100
+#define  GPIO_FUNC_GPIO_10	0xD401E104
+#define  GPIO_FUNC_GPIO_11	0xD401E108
+#define  GPIO_FUNC_GPIO_12	0xD401E10C
+#define  GPIO_FUNC_GPIO_13	0xD401E110
+#define  GPIO_FUNC_GPIO_14	0xD401E114
+#define  GPIO_FUNC_GPIO_15	0xD401E118
+#define  GPIO_FUNC_GPIO_16	0xD401E11C
+#define  GPIO_FUNC_GPIO_17	0xD401E120
+#define  GPIO_FUNC_GPIO_18	0xD401E124
+#define  GPIO_FUNC_GPIO_19	0xD401E128
+#define  GPIO_FUNC_GPIO_20	0xD401E12C
+#define  GPIO_FUNC_GPIO_21	0xD401E130
+#define  GPIO_FUNC_GPIO_22	0xD401E134
+#define  GPIO_FUNC_GPIO_23	0xD401E138
+#define  GPIO_FUNC_GPIO_24	0xD401E13C
+#define  GPIO_FUNC_GPIO_25	0xD401E140
+#define  GPIO_FUNC_GPIO_26	0xD401E144
+#define  GPIO_FUNC_GPIO_27	0xD401E148
+#define  GPIO_FUNC_GPIO_28	0xD401E14C
+#define  GPIO_FUNC_GPIO_29	0xD401E150
+#define  GPIO_FUNC_GPIO_30	0xD401E154
+#define  GPIO_FUNC_GPIO_31	0xD401E158
+#define  GPIO_FUNC_GPIO_32	0xD401E15C
+#define  GPIO_FUNC_GPIO_33	0xD401E160
+#define  GPIO_FUNC_GPIO_34	0xD401E164
+#define  GPIO_FUNC_GPIO_35	0xD401E168
+#define  GPIO_FUNC_GPIO_36	0xD401E16C
+#define  GPIO_FUNC_GPIO_49	0xD401E1A0
+#define  GPIO_FUNC_GPIO_50	0xD401E1A4
+#define  GPIO_FUNC_GPIO_51	0xD401E1A8
+#define  GPIO_FUNC_GPIO_52	0xD401E1AC
+#define  GPIO_FUNC_GPIO_53	0xD401E1B0
+#define  GPIO_FUNC_GPIO_54	0xD401E1B4
+#define  GPIO_FUNC_DVL_0      0xD401E2B4
+#define  GPIO_FUNC_DVL_1      0xD401E2B8
+#define  GPIO_FUNC_GPIO_69	0xD401E2BC
+#define  GPIO_FUNC_GPIO_70	0xD401E2C0
+#define  GPIO_FUNC_QSPI_DAT3	0xD401E2C4
+#define  GPIO_FUNC_QSPI_DAT2	0xD401E2C8
+#define  GPIO_FUNC_QSPI_DAT1	0xD401E2CC
+#define  GPIO_FUNC_QSPI_DAT0	0xD401E2D0
+#define  GPIO_FUNC_QSPI_CLK	0xD401E2D4
+#define  GPIO_FUNC_QSPI_CS1	0xD401E2D8
+#define  GPIO_FUNC_GPIO_77	0xD401E2DC
+#define  GPIO_FUNC_GPIO_78	0xD401E2E0
+#define  GPIO_FUNC_GPIO_79	0xD401E2E4
+#define  GPIO_FUNC_GPIO_80	0xD401E2E8
+#define  GPIO_FUNC_SDIO_DAT3	0xD401E2EC
+#define  GPIO_FUNC_SDIO_DAT2	0xD401E2F0
+#define  GPIO_FUNC_SDIO_DAT1	0xD401E2F4
+#define  GPIO_FUNC_SDIO_DAT0	0xD401E2F8
+#define  GPIO_FUNC_SDIO_CMD	0xD401E2FC
+#define  GPIO_FUNC_SDIO_CLK	0xD401E300
+#define  GPIO_FUNC_GPIO_60	0xD401E304
+#define  GPIO_FUNC_USIM_UCLK	0xD401E320
+#define  GPIO_FUNC_USIM_UIO	0xD401E324
+#define  GPIO_FUNC_USIM_URSTn	0xD401E328
+
+
+#define  GPIO0_BASE 0xD4019000
+#define  GPIO1_BASE 0xD4019004
+#define  GPIO2_BASE 0xD4019008
+#define  GPIO3_BASE 0xD4019100
+
+struct gpio_register_function
+{
+    int  reg;
+    int  func_gpio; // 第 [func_gpio] 功能为 GPIO
+};
+
+
+#endif /*__GPIO_DEFINE_H__*/
diff --git a/mbtk/mbtk_at/inc/mbtk_adc.h b/mbtk/mbtk_at/inc/mbtk_adc.h
new file mode 100755
index 0000000..29dfba4
--- /dev/null
+++ b/mbtk/mbtk_at/inc/mbtk_adc.h
@@ -0,0 +1,45 @@
+/*
+    MBTK ADC interface define.
+*/
+/******************************************************************************
+
+                   EDIT HISTORY FOR FILE
+
+  WHEN        WHO       WHAT,WHERE,WHY
+--------    --------    -------------------------------------------------------
+2023/4/3      b.liu    Initial version
+
+******************************************************************************/
+#ifndef __MBTK_ADC_H__
+#define __MBTK_ADC_H__
+/*
+* MBTK ADC define.
+*/
+typedef enum {
+    MBTK_ADC0 = 0,  /* ADC 0 */
+    MBTK_ADC1,       /* ADC 1 */
+    MBTK_ADC2       /* ADC 2 */
+} mbtk_adc_enum;
+
+
+/*===========================================================================
+FUNCTION mbtk_adc_get
+
+DESCRIPTION:
+  Get ADC's value.
+
+PARAMETERS:
+  adc_dev : Refer to : ADC_DEVICE_802/ADC_DEVICE_803/ADC_DEVICE_PMIC802/ADC_DEVICE_AUX
+  adc [IN]: ADC path, refer to mbtk_adc_enum.
+
+RETURN VALUE:
+  int : ADC value.
+
+===========================================================================*/
+int mbtk_adc_get(mbtk_adc_enum adc);
+int mbtk_adc_close(void);
+int mbtk_at_adc(int value);
+
+#endif /* __MBTK_ADC_H__ */
+
+
diff --git a/mbtk/mbtk_at/inc/mbtk_at.h b/mbtk/mbtk_at/inc/mbtk_at.h
new file mode 100755
index 0000000..11f027c
--- /dev/null
+++ b/mbtk/mbtk_at/inc/mbtk_at.h
@@ -0,0 +1,156 @@
+/*
+* MBTK AT Header.
+*
+* Author : lb
+* Date   : 2021/11/5 10:41:24
+*
+*/
+#ifndef MBTK_AT_H
+#define MBTK_AT_H
+#include "ml_utils.h"
+#include "teldef.h"
+#include "telutl.h"
+#include "utlTypes.h"
+#include "utlAtParser.h"
+
+#include "mbtk/mbtk_type.h"
+
+void mbtk_log(int level, const char *format, ...);
+
+#define LOG_DEBUG_LEVEL 5
+#define LOG(fmt, args...) mbtk_log(LOG_DEBUG_LEVEL, fmt, ##args)
+
+#define MBTK_AT_RESP_LEN_MAX 2048
+#define MBTK_AT_FTP_NAME_LEN_MAX 21
+#define MBTK_AT_FTP_PASS_LEN_MAX 21
+#define MBTK_AT_FTP_ADDR_LEN_MAX 64
+#define MBTK_AT_FTP_DIR_LEN_MAX 90
+
+#ifdef MBTK_DATA_MODE_SUPPORT
+typedef void (*mbtk_data_mode_callback_func)(const char *data, int data_len);
+#endif
+
+typedef enum {
+    MBTK_AT_FUNC_TYPE_BASIC = 0,    // No change , refer to lib_list
+    MBTK_AT_FUNC_TYPE_FACTORY,
+    MBTK_AT_FUNC_TYPE_AUDIO,
+    MBTK_AT_FUNC_TYPE_GNSS,
+    MBTK_AT_FUNC_TYPE_ECALL,
+    MBTK_AT_FUNC_TYPE_SOCKET,
+    MBTK_AT_FUNC_TYPE_TCPIP,
+    MBTK_AT_FUNC_TYPE_HTTP,
+    MBTK_AT_FUNC_TYPE_FTP,
+
+    /* Arrry number. */
+    MBTK_AT_FUNC_TYPE_NUM
+} mbtk_at_func_type_enum;
+
+typedef struct mbtk_at_func{
+    mbtk_at_func_type_enum type;
+    char name[50];
+    void *func;
+
+    struct mbtk_at_func *next;
+} mbtk_at_func_t;
+
+typedef enum
+{
+    MBTK_PORT_TYPE_UART1,   // /dev/ttyS1
+    MBTK_PORT_TYPE_USB1,    // /dev/ttyGS0
+    MBTK_PORT_TYPE_USB2     // /dev/ttymodem0
+} mbtk_port_type_enum;
+
+typedef enum
+{
+    MBTK_PORT_MODE_AT,      // AT mode(default)
+    MBTK_PORT_MODE_ADB,     // mbtk_adb mode
+    MBTK_PORT_MODE_CUSTOM   // Custom mode
+} mbtk_port_mode_enum;
+
+//void func_add(char *name);
+mbtk_at_func_t *func_get(char *name);
+
+
+//#define mbtk_cmd_line_ex_f (bool (*)(const char*, void (*)(char*int)))
+
+#define MBTK_FUNC_TYPEDEF
+#include "mbtk_at_func.h"
+#undef MBTK_FUNC_TYPEDEF
+
+
+#define MBTK_FUNC(name) (*((name)(func_get(#name)->func)))
+/*#define MBTK_FUNC(name) \
+    do{ \
+        if(name) \
+            (*((name)(func_get(#name)->func))); \
+    } while(0)
+    */
+//#define MBTK_FUNC(name) (name?(*((name)(func_get(#name)->func))):-1)
+#define MBTK_FUNC_ADD(type, name) func_add(type, #name)
+
+//typedef void (*mbtk_cmd_cb_func)(char *buf,int buf_size);
+//typedef bool (*mbtk_cmd_line_ex_f)(const char *cmd, void (*cb)(char *buf,int buf_size));
+//extern void* mbtk_cmd_line_ex;
+
+#if 0
+typedef int (*mbtk_audio_exec_f)(const char *args);
+extern mbtk_audio_exec_f mbtk_at_play;
+extern mbtk_audio_exec_f mbtk_at_rec;
+#endif
+
+#if 0
+typedef enum {
+    MBTK_AT_PARAM_TYPE_INT,
+    MBTK_AT_PARAM_TYPE_STR
+} mbtk_at_param_type_enum;
+
+typedef struct {
+    int min;
+    int max;
+    int int_def;
+} mbtk_at_param_int_range_t;
+
+typedef struct {
+    int max_len;
+    char *str_def;
+} mbtk_at_param_str_range_t;
+
+typedef struct {
+    mbtk_at_param_type_enum type;
+    union {
+        mbtk_at_param_int_range_t param_int;
+        mbtk_at_param_str_range_t param_str;
+    } param;
+} mbtk_at_param_range_t;
+#endif
+
+BOOL getExtValue( const utlAtParameterValue_P2c param_value_p,
+                  int index,
+                  int *value_p,
+                  int minValue,
+                  int maxValue,
+                  int DefaultValue);
+
+BOOL getExtUValue(const utlAtParameterValue_P2c param_value_p,
+                  int index,
+                  unsigned int *value_p,
+                  unsigned int minValue,
+                  unsigned int maxValue,
+                  unsigned int DefaultValue);
+
+BOOL getExtString( const utlAtParameterValue_P2c param_value_p,
+                    int index,
+                    CHAR *outString,
+                    INT16 maxStringLength,
+                    INT16 *outStringLength,
+                    CHAR *defaultString);
+char *op2str(utlAtParameterOp_T op);
+
+#ifdef MBTK_DATA_MODE_SUPPORT
+utlReturnCode_T mbtk_data_mode_enter(TelAtParserID atp_index, mbtk_data_mode_callback_func cb);
+#endif
+#if 1//MBTK_RGMII_TEST
+int mbtk_rgmii_loopback(void);
+int mbtk_mdio(char* net_name,int mode, uint16_t reg_addr, uint16_t value);
+#endif
+#endif /* MBTK_AT_H */
diff --git a/mbtk/mbtk_at/inc/mbtk_at_func.h b/mbtk/mbtk_at/inc/mbtk_at_func.h
new file mode 100755
index 0000000..b696b1d
--- /dev/null
+++ b/mbtk/mbtk_at/inc/mbtk_at_func.h
@@ -0,0 +1,139 @@
+#ifdef MBTK_FUNC_TYPEDEF
+// Add function define start.
+typedef bool (*mbtk_cmd_line_ex)(const char*, void (*)(char*, int));
+//typedef int (*mbtk_at_play)(const char*);
+//typedef int (*mbtk_at_rec)(const char*);
+//typedef int (*mbtk_at_loopback)(int type); // 1 : Start  0 : Stop
+//typedef int (*mbtk_at_adc)(int);
+//typedef int (*mbtk_at_gnss)(int, void*);
+//typedef int (*mbtk_mgpsc_set)(int);
+//typedef int (*mbtk_at_gnss_reset)(int);
+//typedef int (*mbtk_at_gpio)(bool, void*);
+//typedef int (*mbtk_at_gnss_start_ttff)(int, int, int);
+
+typedef int (*mbtk_audio_loopback_start)(int);
+typedef int (*mbtk_audio_loopback_stop)();
+typedef int (*mbtk_audio_mode_set)(int);
+typedef int (*mbtk_audio_ubus_init)();
+typedef int (*mbtk_audio_ubus_deinit)();
+typedef int (*mbtk_audio_wav_init)();
+typedef int (*mbtk_audio_wav_play_start)(const void *);
+typedef int (*mbtk_audio_wav_deinit)();
+typedef int (*mbtk_audio_wav_recorder_start)(const void *, int);
+
+typedef void (*mbtk_log_init)(char*, char*);
+typedef void (*log_hex)(const char *tag, const void *data, int data_len);
+typedef int (*mbtk_at_ftp)(int, int, char*, char*, char*, int, bool, bool);
+typedef int (*mbtk_at_get_ftp_info)(int ,int *,char *, char *, char *,int * ,int *, int *);
+typedef int (*mbtk_at_ftp_mkrmdel)(int ,char *);
+typedef int (*mbtk_at_ftp_upload)(char *,char *, int, int);
+typedef int (*mbtk_at_ftp_download)(void *, void *, int , int , int );
+typedef int (*mbtk_at_ftp_list)(char *);
+typedef int (*mbtk_at_get_ftp_data_info)(char *, char *, int *, int *, int *);
+typedef int (*mbtk_at_msgid)(int *);
+//typedef int (*mbtk_system_sleep)(void);
+
+
+//typedef int (*mbtk_http_handle_get)(int, void(*)(int, int, void*, int));
+typedef int (*mbtk_http_handle_get)(int, void*);
+typedef int (*mbtk_http_handle_free)(int);
+typedef int (*mbtk_http_session_url_set)(int,int,void *);
+typedef int (*mbtk_http_session_create)(int,int,int);
+typedef int (*mbtk_http_session_option_reset)(int,int,int);
+typedef int (*mbtk_http_session_ingnore_cert_set)(int,int,bool);
+typedef int (*mbtk_http_session_start)(int,int);
+typedef int (*mbtk_http_session_head_add)(int,int,char *, char *);
+typedef int (*mbtk_http_session_content_set)(int,int,char *, int);
+typedef int (*mbtk_http_session_get)(int,int);
+
+
+#include "mbtk_at_tcpip.h"
+
+typedef int (*mbtk_task_queue_start)(void * ,void *(*)(void *) );
+typedef void (*mbtk_task_queue_stop)(void * );
+typedef int (*mbtk_signal_send)(void * ,mbtk_signal_info* );
+typedef mbtk_signal_info* (*mbtk_signal_get)(void * );
+
+typedef mbtk_tcpip_err_enum (*mbtk_tcpip_net_open)(void (*)(int ,const char * ), void (*)(int , int ));
+typedef mbtk_tcpip_err_enum (*mbtk_tcpip_net_close)();
+
+typedef mbtk_tcpip_err_enum (*mbtk_tcpip_sock_open)(const mbtk_tcpip_info_t *);
+typedef mbtk_tcpip_err_enum (*mbtk_tcpip_sock_close)(int );
+typedef int (*mbtk_tcpip_send)(int , const char* , int , const char* , int );
+typedef int (*mbtk_tcpip_read)(int , char* , int );
+typedef int (*mbtk_tcpip_info_get)(int , mbtk_tcpip_tcp_state_info_s *);
+typedef void (*mbtk_tcpip_set_read_cb)(int , mbtk_tcpip_read_callback_func );
+typedef int (*mbtk_tcpip_data_traffic_get)(int );
+typedef mbtk_tcpip_err_enum (*mbtk_tcpip_data_traffic_reset)(int );
+typedef int (*mbtk_tcpip_link_state_get)(int );
+// Add function define end.
+#endif
+
+
+#ifdef MBTK_FUNC_INIT
+// Add function start.
+// libmbtk_lib.so
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_cmd_line_ex);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_log_init);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, log_hex);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_task_queue_start);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_task_queue_stop);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_signal_send);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_signal_get);
+
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_audio_loopback_start);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_audio_loopback_stop);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_audio_mode_set);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_audio_ubus_init);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_audio_ubus_deinit);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_audio_wav_init);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_audio_wav_deinit);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_audio_wav_play_start);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_audio_wav_recorder_start);
+
+// libmbtk_factory.so
+//MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_FACTORY, mbtk_at_adc);
+//MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_FACTORY, mbtk_at_gpio);
+//MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_FACTORY, mbtk_at_play);
+//MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_FACTORY, mbtk_at_rec);
+//MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_FACTORY, mbtk_at_loopback);
+//MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_FACTORY, mbtk_system_sleep);
+//MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_FACTORY, mbtk_mgpsc_set);
+
+// libmbtk_ftp.so
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_at_ftp);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_at_get_ftp_info);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_at_ftp_mkrmdel);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_at_ftp_upload);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_at_ftp_download);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_at_ftp_list);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_at_get_ftp_data_info);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_at_msgid);
+
+// libmbtk_http.so
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_handle_get);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_handle_free);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_session_url_set);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_session_create);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_session_option_reset);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_session_ingnore_cert_set);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_session_start);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_session_head_add);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_session_content_set);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_http_session_get);
+
+// libmbtk_tcpip.so
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_net_open);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_net_close);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_sock_open);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_sock_close);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_send);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_read);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_info_get);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_set_read_cb);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_data_traffic_get);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_data_traffic_reset);
+MBTK_FUNC_ADD(MBTK_AT_FUNC_TYPE_BASIC, mbtk_tcpip_link_state_get);
+
+// Add function end.
+#endif
diff --git a/mbtk/mbtk_at/inc/mbtk_at_tables.h b/mbtk/mbtk_at/inc/mbtk_at_tables.h
new file mode 100755
index 0000000..707f6a9
--- /dev/null
+++ b/mbtk/mbtk_at/inc/mbtk_at_tables.h
@@ -0,0 +1,610 @@
+/*
+*
+* Author : lb
+* Date   : 2021/11/4 14:08:32
+*
+*/
+#ifndef MBTK_AT_TABLES_H
+#define MBTK_AT_TABLES_H
+#define MBTK_PARAM_OPTIONAL utlAT_PARAMETER_PRESENCE_OPTIONAL
+#define MBTK_PARAM_REQUIRED utlAT_PARAMETER_PRESENCE_REQUIRED
+#define MBTK_PARAM_DECIMAL(optional) utlDEFINE_DECIMAL_AT_PARAMETER(utlAT_PARAMETER_ACCESS_READ_WRITE, optional)
+#define MBTK_PARAM_STRING(optional) utlDEFINE_STRING_AT_PARAMETER(utlAT_PARAMETER_ACCESS_READ_WRITE, optional)
+#define MBTK_PARAM_QSTRING(optional) utlDEFINE_QSTRING_AT_PARAMETER(utlAT_PARAMETER_ACCESS_READ_WRITE, optional)
+#define MBTK_AT_DEFINE(name, param_optional, syntax, at_process) \
+    utlDEFINE_EXTENDED_MBTK_AT_COMMAND(name, param_optional, syntax, at_process, at_process),
+#define MBTK_AT_DEFINE_VSYNTAX(name, param_optional, at_process) \
+    utlDEFINE_EXTENDED_VSYNTAX_MBTK_AT_COMMAND(name, param_optional, at_process, at_process, at_process),
+#endif /* MBTK_AT_TABLES_H */
+
+
+////////////////////////////////////Parameter Definition Start///////////////////////////////////////////////
+#ifdef MBTK_AT_COMMAND_PARAM
+static utlAtParameter_T atMTEST_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atSYSTIME_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atMTESTF_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atMSHELL_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atREVTEST_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atADC_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atGPIO_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atNETLED_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atGNSS_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atGNSSRESET_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atSYSSLEEP_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atMPORTCFG_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atURCECHO_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atMGPSTEST_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atMGPSC_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+
+
+static utlAtParameter_T atCFTPPORT_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atCFTPUN_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atCFTPPW_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atCFTPTLS_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T atCFTPSERV_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atCFTPTYPE_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atCFTPMKD_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atCFTPRMD_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atCFTPDEL_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atCFTPPUTFILE_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED),MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T atCFTPPUT_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T atCFTPGETFILE_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED),MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T atCFTPGET_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T atCFTPLIST_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+
+#if 1//def MBTK_TCP_SUPPORT
+static utlAtParameter_T cipopen_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED),MBTK_PARAM_STRING(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T cipclose_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T cipsend_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_STRING(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_STRING(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T ciprxget_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T mcipcfgpl_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T mcipcfg_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T cipopquery_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+
+#endif
+
+static utlAtParameter_T atCGDRT_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T atCGSETV_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_OPTIONAL)};
+static utlAtParameter_T atMDUMP_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+
+static utlAtParameter_T atHTTPRQH_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED),  MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atHTTPPARA_params[] = { MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED), MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)\
+												,MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED),MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atHTTPACTION_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atHTTPTYPE_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atHTTPREAD_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED)};
+static utlAtParameter_T atHTTPDATAEX_params[] = { MBTK_PARAM_DECIMAL(MBTK_PARAM_REQUIRED), MBTK_PARAM_STRING(MBTK_PARAM_REQUIRED)};
+
+#endif
+////////////////////////////////////Parameter Definition End/////////////////////////////////////////////////
+
+
+////////////////////////////////////Function Definition Start////////////////////////////////////////////////
+#ifdef MBTK_AT_COMMAND_FUNCTION
+utlReturnCode_T MBTK_AT_MTEST_PROCESS(const utlAtParameterOp_T op,
+                    const char *command_name_p,
+                    const utlAtParameterValue_P2c parameter_values_p,
+                    const size_t num_parameters,
+                    const char *info_text_p,
+                    unsigned int *xid_p,
+                    void *arg_p);
+utlReturnCode_T MBTK_AT_MINFO_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_SYSTIME_PROCESS(const utlAtParameterOp_T op,
+                    const char *command_name_p,
+                    const utlAtParameterValue_P2c parameter_values_p,
+                    const size_t num_parameters,
+                    const char *info_text_p,
+                    unsigned int *xid_p,
+                    void *arg_p);
+
+utlReturnCode_T MBTK_AT_MTESTF_PROCESS(const utlAtParameterOp_T op,
+                    const char *command_name_p,
+                    const utlAtParameterValue_P2c parameter_values_p,
+                    const size_t num_parameters,
+                    const char *info_text_p,
+                    unsigned int *xid_p,
+                    void *arg_p);
+
+utlReturnCode_T MBTK_AT_MSHELL_PROCESS(const utlAtParameterOp_T op,
+                    const char *command_name_p,
+                    const utlAtParameterValue_P2c parameter_values_p,
+                    const size_t num_parameters,
+                    const char *info_text_p,
+                    unsigned int *xid_p,
+                    void *arg_p);
+utlReturnCode_T MBTK_AT_ISLKVRSCAN_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+utlReturnCode_T MBTK_AT_SDTEST_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+utlReturnCode_T MBTK_AT_SPKTEST_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+utlReturnCode_T MBTK_AT_MICTEST_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+utlReturnCode_T MBTK_AT_REVTEST_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+utlReturnCode_T MBTK_AT_GPIOTEST_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+utlReturnCode_T MBTK_AT_ADCGETV_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_RGMIITEST_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+
+
+
+utlReturnCode_T MBTK_AT_CGNETLED_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+utlReturnCode_T MBTK_AT_SYSSLEEP_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_MGPSC_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_MPORTCFG_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_MURCECHO_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+RETURNCODE_T  MBTK_AT_READVER_PROCESS(       const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+
+utlReturnCode_T MBTK_AT_CFTPPORT_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPUN_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPPW_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPTLS_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPSERV_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPTYPE_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPMKD_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPRMD_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPDEL_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPPUTFILE_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPPUT_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPGETFILE_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPGET_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CFTPLIST_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+#if 1//def MBTK_TCP_SUPPORT
+utlReturnCode_T  MBTK_AT_NETOPEN_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+utlReturnCode_T  MBTK_AT_NETCLOSE_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+
+utlReturnCode_T  MBTK_AT_CIPOPEN_PROCESS(       const utlAtParameterOp_T        op,
+                                    		const char                      *command_name_p,
+                                    		const utlAtParameterValue_P2c   parameter_values_p,
+                                    		const size_t                    num_parameters,
+                                    		const char                      *info_text_p,
+                                    		unsigned int                    *xid_p,
+                                    		void                            *arg_p);
+
+utlReturnCode_T  MBTK_AT_CIPCLOSE_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+
+utlReturnCode_T  MBTK_AT_CIPSEND_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+utlReturnCode_T  MBTK_AT_CIPRXGET_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+utlReturnCode_T  MBTK_AT_MCIPCFGPL_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+utlReturnCode_T  MBTK_AT_MCIPCFG_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+utlReturnCode_T  MBTK_AT_USEDDATA_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+utlReturnCode_T  MBTK_AT_CLEARDATA_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+utlReturnCode_T  MBTK_AT_CIPOPQUERY_PROCESS(       const utlAtParameterOp_T        op,
+                                            const char                      *command_name_p,
+                                            const utlAtParameterValue_P2c   parameter_values_p,
+                                            const size_t                    num_parameters,
+                                            const char                      *info_text_p,
+                                            unsigned int                    *xid_p,
+                                            void                            *arg_p);
+
+#endif
+utlReturnCode_T MBTK_AT_CGDRT_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_CGSETV_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+utlReturnCode_T MBTK_AT_MDUMP_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p);
+
+//MBTK_AT_HTTP_H
+utlReturnCode_T MBTK_AT_HTTPOPEN_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_HTTPCLOSE_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_HTTPSEND_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_HTTPRQH_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_HTTPACTION_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_HTTPTYPE_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_HTTPREAD_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_HTTPDATAEX_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+utlReturnCode_T MBTK_AT_HTTPPARA_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p);
+
+
+#endif
+////////////////////////////////////Function Definition End//////////////////////////////////////////////////
+
+
+////////////////////////////////////AT Definition Start/////////////////////////////////////////////////////
+#ifdef MBTK_AT_COMMAND_SHELL
+MBTK_AT_DEFINE("+MTEST", atMTEST_params, "+MTEST=(0-1),\"\"", MBTK_AT_MTEST_PROCESS)
+MBTK_AT_DEFINE("+MINFO", NULL, NULL, MBTK_AT_MINFO_PROCESS)
+MBTK_AT_DEFINE("+SYSTIME", atSYSTIME_params, "+SYSTIME=(0-2),\"\"", MBTK_AT_SYSTIME_PROCESS)
+MBTK_AT_DEFINE_VSYNTAX("+MTESTF", atMTESTF_params, MBTK_AT_MTESTF_PROCESS)
+
+MBTK_AT_DEFINE("+MSHELL", atMSHELL_params, "+MSHELL=\"\"", MBTK_AT_MSHELL_PROCESS)
+MBTK_AT_DEFINE("+ISLKVRSCAN", NULL, NULL, MBTK_AT_ISLKVRSCAN_PROCESS)
+MBTK_AT_DEFINE("+SDTEST", NULL, NULL, MBTK_AT_SDTEST_PROCESS)
+MBTK_AT_DEFINE("+SPKTEST", NULL, NULL, MBTK_AT_SPKTEST_PROCESS)
+MBTK_AT_DEFINE("+MICTEST", NULL, NULL, MBTK_AT_MICTEST_PROCESS)
+MBTK_AT_DEFINE("+REVTEST", atREVTEST_params, "+MTEST=(0-1),\"\"", MBTK_AT_REVTEST_PROCESS)
+MBTK_AT_DEFINE("+GPIOTEST", atGPIO_params, "+GPIOTEST=(0-1)", MBTK_AT_GPIOTEST_PROCESS)
+MBTK_AT_DEFINE("+ADCGETV", atADC_params, "+ADCGETV=(0-1)", MBTK_AT_ADCGETV_PROCESS)
+MBTK_AT_DEFINE("+RGMIITEST", NULL, NULL, MBTK_AT_RGMIITEST_PROCESS)
+
+MBTK_AT_DEFINE("+CGNETLED", atNETLED_params, "+CGNETLED=(0-1)", MBTK_AT_CGNETLED_PROCESS)
+MBTK_AT_DEFINE("*SYSSLEEP", NULL, NULL, MBTK_AT_SYSSLEEP_PROCESS)
+MBTK_AT_DEFINE("+SYSSLEEP", atSYSSLEEP_params, "+SYSSLEEP=(0-2)", MBTK_AT_SYSSLEEP_PROCESS)
+MBTK_AT_DEFINE("+MPORTCFG", atMPORTCFG_params, "+MPORTCFG=(0-2),(0-2)", MBTK_AT_MPORTCFG_PROCESS)
+MBTK_AT_DEFINE("+MURCECHO", atURCECHO_params, "+MURCECHO=(0-1)", MBTK_AT_MURCECHO_PROCESS)
+//MBTK_AT_DEFINE("+MGPSTEST", atMGPSTEST_params, "+MGPSTEST=(0-2),(0-180),(0-100)", MBTK_AT_MGPSTEST_PROCESS)
+MBTK_AT_DEFINE("*READVER", NULL, NULL, MBTK_AT_READVER_PROCESS)
+MBTK_AT_DEFINE("+MGPSC", atMGPSC_params, "+MGPSC=(0,1,5)", MBTK_AT_MGPSC_PROCESS)
+
+
+MBTK_AT_DEFINE("+CFTPPORT", atCFTPPORT_params, "+CFTPPORT: (list of supported <port>s) ", MBTK_AT_CFTPPORT_PROCESS)
+MBTK_AT_DEFINE("+CFTPUN", atCFTPUN_params, NULL, MBTK_AT_CFTPUN_PROCESS)
+MBTK_AT_DEFINE("+CFTPPW", atCFTPPW_params, NULL, MBTK_AT_CFTPPW_PROCESS)
+MBTK_AT_DEFINE("+CFTPTLS", atCFTPTLS_params, "+CFTPTLS: (0-2),(0-1)", MBTK_AT_CFTPTLS_PROCESS)
+MBTK_AT_DEFINE("+CFTPSERV", atCFTPSERV_params, NULL, MBTK_AT_CFTPSERV_PROCESS)
+MBTK_AT_DEFINE("+CFTPTYPE", atCFTPTYPE_params, "+CFTPTYPE: (\"I\",\"A\")", MBTK_AT_CFTPTYPE_PROCESS)
+MBTK_AT_DEFINE("+CFTPMKD", atCFTPMKD_params, NULL, MBTK_AT_CFTPMKD_PROCESS)
+MBTK_AT_DEFINE("+CFTPRMD", atCFTPRMD_params, NULL, MBTK_AT_CFTPRMD_PROCESS)
+MBTK_AT_DEFINE("+CFTPDELE", atCFTPDEL_params, NULL, MBTK_AT_CFTPDEL_PROCESS)
+MBTK_AT_DEFINE("+CFTPPUTFILE", atCFTPPUTFILE_params, "+CFTPPUTFILE: ,,(0-2147483647)", MBTK_AT_CFTPPUTFILE_PROCESS)
+MBTK_AT_DEFINE("+CFTPPUT", atCFTPPUT_params, "+CFTPPUT: ,(0-2147483647),(1-1500)", MBTK_AT_CFTPPUT_PROCESS)
+MBTK_AT_DEFINE("+CFTPGETFILE", atCFTPGETFILE_params, "+CFTPGETFILE: ,,(0-2147483647), (0-524288)", MBTK_AT_CFTPGETFILE_PROCESS)
+MBTK_AT_DEFINE("+CFTPGET", atCFTPGET_params, "+CFTPGET: ,(0-2147483647),(0-524288)", MBTK_AT_CFTPGET_PROCESS)
+MBTK_AT_DEFINE("+CFTPLIST", atCFTPLIST_params, NULL, MBTK_AT_CFTPLIST_PROCESS)
+
+#if 1//def MBTK_TCP_SUPPORT
+MBTK_AT_DEFINE_VSYNTAX("+NETOPEN", NULL, MBTK_AT_NETOPEN_PROCESS)
+MBTK_AT_DEFINE_VSYNTAX("+NETCLOSE", NULL, MBTK_AT_NETCLOSE_PROCESS)
+MBTK_AT_DEFINE("+CIPOPEN", cipopen_params, "+CIPOPEN: (list of supported <link_num>s), (list of supported<type>s)", MBTK_AT_CIPOPEN_PROCESS)
+MBTK_AT_DEFINE("+CIPCLOSE", cipclose_params, "+CIPOPEN: (list of supported <link_num>s)", MBTK_AT_CIPCLOSE_PROCESS)
+MBTK_AT_DEFINE("+CIPSEND", cipsend_params, "+CIPSEND: (list of supported <link_num>s), (list of supported <length>s)", MBTK_AT_CIPSEND_PROCESS)
+MBTK_AT_DEFINE("+CIPRXGET", ciprxget_params, "+CIPRXGET: (list of supported <mode>s), (list of supported<cid>s), (list of supported<len>s)", MBTK_AT_CIPRXGET_PROCESS)
+MBTK_AT_DEFINE("+MCIPCFGPL", mcipcfgpl_params, "+MCIPCFGPL:(list of supported <link_num>s), (list of supported <hex_support>s),(list of supported <ack_support>s), (list of supported <ssl_support>s, (list of supported <ignore_cert>s)", MBTK_AT_MCIPCFGPL_PROCESS)
+MBTK_AT_DEFINE("+MCIPCFG", mcipcfg_params, "+MCIPCFG: (list of supported <heartbeat_time>s), (list of supported <delay_time>ms)", MBTK_AT_MCIPCFG_PROCESS)
+MBTK_AT_DEFINE_VSYNTAX("+USEDDATA", NULL, MBTK_AT_USEDDATA_PROCESS)
+MBTK_AT_DEFINE_VSYNTAX("+CLEARDATA", NULL, MBTK_AT_CLEARDATA_PROCESS)
+MBTK_AT_DEFINE("+CIPOPQUERY", cipopquery_params, "+CIPOPQUERY: (0-3),(0-3),(0-3),(0-3)", MBTK_AT_CIPOPQUERY_PROCESS)
+#endif
+
+MBTK_AT_DEFINE("+CGDRT", atCGDRT_params, "+CGDRT: (0-139),(0-1)", MBTK_AT_CGDRT_PROCESS)
+MBTK_AT_DEFINE("+CGSETV", atCGSETV_params, "+CGSETV: (0-139),(0-1)", MBTK_AT_CGSETV_PROCESS)
+
+MBTK_AT_DEFINE("+MDUMP", atMDUMP_params, "+MDUMP=(0-1)", MBTK_AT_MDUMP_PROCESS)
+
+MBTK_AT_DEFINE("$HTTPOPEN", NULL, NULL, MBTK_AT_HTTPOPEN_PROCESS)
+MBTK_AT_DEFINE("$HTTPCLOSE", NULL, NULL, MBTK_AT_HTTPCLOSE_PROCESS)
+MBTK_AT_DEFINE("$HTTPSEND", NULL, NULL, MBTK_AT_HTTPSEND_PROCESS)
+MBTK_AT_DEFINE("$HTTPACTION", atHTTPACTION_params, "$HTTPACTION=(0-3)", MBTK_AT_HTTPACTION_PROCESS)
+MBTK_AT_DEFINE("$HTTPTYPE", atHTTPTYPE_params, "$HTTPTYPE=(0-1)", MBTK_AT_HTTPTYPE_PROCESS)
+MBTK_AT_DEFINE("$HTTPREAD", atHTTPREAD_params, "$HTTPREAD=(0-1),(0-512000)", MBTK_AT_HTTPREAD_PROCESS)
+MBTK_AT_DEFINE("$HTTPDATAEX", atHTTPDATAEX_params, "$HTTPDATAEX=(0-500),\"\"", MBTK_AT_HTTPDATAEX_PROCESS)
+MBTK_AT_DEFINE("$HTTPPARA", atHTTPPARA_params, "$HTTPPARA=\"\",(0-65535),(0-1), (0-1)", MBTK_AT_HTTPPARA_PROCESS)
+MBTK_AT_DEFINE("$HTTPRQH", atHTTPRQH_params, "$HTTPRQH=\"\", \"\"", MBTK_AT_HTTPRQH_PROCESS)
+
+
+#endif
+////////////////////////////////////AT Definition End///////////////////////////////////////////////////////
diff --git a/mbtk/mbtk_at/inc/mbtk_at_tcpip.h b/mbtk/mbtk_at/inc/mbtk_at_tcpip.h
new file mode 100755
index 0000000..375f4b6
--- /dev/null
+++ b/mbtk/mbtk_at/inc/mbtk_at_tcpip.h
@@ -0,0 +1,90 @@
+#ifndef __MBTK_AT_TCPIP_H__
+#define __MBTK_AT_TCPIP_H__
+
+#include <pthread.h>
+/*******************DEFINE**********************/
+#define task_mutex pthread_mutex_t
+/*******************DEFINE**********************/
+
+/*******************TYPEDEF**********************/
+typedef void (*mbtk_tcpip_read_callback_func)(int link_id, const char* data, int data_len);
+/*******************TYPEDEF**********************/
+
+/*******************ENUM**********************/
+typedef enum {
+    MBTK_TCPIP_ERR_SUCCESS,
+    MBTK_TCPIP_ERR_NET_UNAVAILABLE,     /* Network unavailable. */
+    MBTK_TCPIP_ERR_NET_HANDLE,     /* Network handle error. */
+    MBTK_TCPIP_ERR_ARG,     /* Parameter error. */
+    MBTK_TCPIP_ERR_LINK_UNAVAILABLE,     /* Link unavailable. */
+    MBTK_TCPIP_ERR_LINK_NOT_CONNECT,     /* Link not connect. */
+    MBTK_TCPIP_ERR_UNKNOWN
+} mbtk_tcpip_err_enum;
+
+typedef enum
+{
+    MBTK_SOCK_TCP = 0,
+    MBTK_SOCK_UDP
+} mbtk_sock_type;
+
+typedef enum {
+    MBTK_TCPIP_TYPE_CLIENT,
+    MBTK_TCPIP_TYPE_SERVER
+} mbtk_tcpip_type_enum;
+/*******************ENUM**********************/
+
+/*******************STRUCT**********************/
+typedef struct
+{
+    unsigned int sig;
+    void* payload;
+} mbtk_signal_info;
+
+
+typedef struct{
+    task_mutex crit_sect; //User-defined data type
+} mbtk_mutex;
+
+typedef struct node
+{
+    void *payload;
+    int count;          //only used to count for internal
+    mbtk_mutex mutex;   //only used to count for internal
+    struct node *front;
+    struct node *rear;
+} mbtk_queue_node_t;
+
+typedef struct {
+    pthread_t thread_id;
+    pthread_cond_t cond;
+    mbtk_mutex mutex;
+    mbtk_queue_node_t queue;
+} mbtk_task_queue_info;
+
+typedef struct {
+    int link_id;
+    char ser_addr[256];
+    int ser_port;
+    mbtk_sock_type prot_type; // TCP/UDP
+    mbtk_tcpip_type_enum tcpip_type; // Only support client.
+    int local_port;
+    bool ack_support;
+    bool ssl_support;
+    bool ignore_cert;
+    uint32 heartbeat_time;
+    uint32 delay_time;
+
+    mbtk_tcpip_read_callback_func read_cb;
+} mbtk_tcpip_info_t;
+
+typedef struct {
+    int link_id;
+    int sock_fd;
+    int state;
+    int recv_data_len;
+} mbtk_tcpip_tcp_state_info_s;
+/*******************STRUCT**********************/
+
+
+
+#endif
\ No newline at end of file
diff --git a/mbtk/mbtk_at/inc/mbtk_gpio_def.h b/mbtk/mbtk_at/inc/mbtk_gpio_def.h
new file mode 100755
index 0000000..4234f86
--- /dev/null
+++ b/mbtk/mbtk_at/inc/mbtk_gpio_def.h
@@ -0,0 +1,173 @@
+/**
+ *   \file gpio-define.h
+ *   \brief A Documented file.
+ *
+ *  Detailed description
+ *   \Author:  Sniper <js.wang@mobiletek.cn>
+ *   \Version: 1.0.0
+ *   \Date: 2022-04-26
+ */
+
+#ifndef __GPIO_DEFINE_H__
+#define __GPIO_DEFINE_H__
+
+typedef unsigned int uint32; /* Unsigned 32 bit value */
+typedef unsigned short uint16; /* Unsigned 16 bit value */
+typedef unsigned char uint8; /* Unsigned 8  bit value */
+
+
+/*
+4组GPIO共128个GPIO,分别从GPIO_0到GPIO_127
+GPIO22位于0xd4019000这一组的BIT22
+
+GPIO0_BASE 0xD4019000
+GPIO1_BASE 0xD4019004
+GPIO2_BASE 0xD4019008
+GPIO3_BASE 0xD4019100
+ */
+
+#define  GPIO_FUNC_MMC1_DAT3	0xD401E094
+#define  GPIO_FUNC_MMC1_DAT2	0xD401E098
+#define  GPIO_FUNC_MMC1_DAT1	0xD401E09C
+#define  GPIO_FUNC_MMC1_DAT0	0xD401E0A0
+#define  GPIO_FUNC_MMC1_CMD	    0xD401E0A4
+#define  GPIO_FUNC_MMC1_CLK	    0xD401E0A8
+#define  GPIO_FUNC_MMC1_CD	    0xD401E0AC
+#define  GPIO_FUNC_USB_ID	    0xD401E0B0
+#define  GPIO_FUNC_PRI_TDI	0xD401E0B4
+#define  GPIO_FUNC_PRI_TMS	0xD401E0B8
+#define  GPIO_FUNC_PRI_TCK	0xD401E0BC
+#define  GPIO_FUNC_PRI_TDO	0xD401E0C0
+#define  GPIO_FUNC_QSPI_VMODE_GPIO	0xD401E0C4
+#define  GPIO_FUNC_VBUS_DRV	0xD401E0C8
+#define  GPIO_FUNC_CLK_REQ	0xD401E0CC
+#define  GPIO_FUNC_VCXO_REQ	0xD401E0D4
+#define  GPIO_FUNC_VCXO_OUT	0xD401E0D8
+
+#define  GPIO_FUNC_GPIO_00	0xD401E0DC
+#define  GPIO_FUNC_GPIO_01	0xD401E0E0
+#define  GPIO_FUNC_GPIO_02	0xD401E0E4
+#define  GPIO_FUNC_GPIO_03	0xD401E0E8
+#define  GPIO_FUNC_GPIO_04	0xD401E0EC
+#define  GPIO_FUNC_GPIO_05	0xD401E0F0
+#define  GPIO_FUNC_GPIO_06	0xD401E0F4
+#define  GPIO_FUNC_GPIO_07	0xD401E0F8
+#define  GPIO_FUNC_GPIO_08	0xD401E0FC
+#define  GPIO_FUNC_GPIO_09	0xD401E100
+#define  GPIO_FUNC_GPIO_10	0xD401E104
+
+#define  GPIO_FUNC_GPIO_11	0xD401E108
+#define  GPIO_FUNC_GPIO_12	0xD401E10C
+#define  GPIO_FUNC_GPIO_13	0xD401E110
+#define  GPIO_FUNC_GPIO_14	0xD401E114
+#define  GPIO_FUNC_GPIO_15	0xD401E118
+#define  GPIO_FUNC_GPIO_16	0xD401E11C
+#define  GPIO_FUNC_GPIO_17	0xD401E120
+#define  GPIO_FUNC_GPIO_18	0xD401E124
+#define  GPIO_FUNC_GPIO_19	0xD401E128
+#define  GPIO_FUNC_GPIO_20	0xD401E12C
+
+#define  GPIO_FUNC_GPIO_21	0xD401E130
+#define  GPIO_FUNC_GPIO_22	0xD401E134
+#define  GPIO_FUNC_GPIO_23	0xD401E138
+#define  GPIO_FUNC_GPIO_24	0xD401E13C
+#define  GPIO_FUNC_GPIO_25	0xD401E140
+#define  GPIO_FUNC_GPIO_26	0xD401E144
+#define  GPIO_FUNC_GPIO_27	0xD401E148
+#define  GPIO_FUNC_GPIO_28	0xD401E14C
+#define  GPIO_FUNC_GPIO_29	0xD401E150
+#define  GPIO_FUNC_GPIO_30	0xD401E154
+
+#define  GPIO_FUNC_GPIO_31	0xD401E158
+#define  GPIO_FUNC_GPIO_32	0xD401E15C
+#define  GPIO_FUNC_GPIO_33	0xD401E160
+#define  GPIO_FUNC_GPIO_34	0xD401E164
+#define  GPIO_FUNC_GPIO_35	0xD401E168
+#define  GPIO_FUNC_GPIO_36	0xD401E16C
+#define  GPIO_FUNC_GPIO_37	0xD401E170
+#define  GPIO_FUNC_GPIO_38	0xD401E174
+#define  GPIO_FUNC_GPIO_39	0xD401E178
+#define  GPIO_FUNC_GPIO_40	0xD401E17C
+
+#define  GPIO_FUNC_GPIO_41	0xD401E180
+#define  GPIO_FUNC_GPIO_42	0xD401E184
+#define  GPIO_FUNC_GPIO_43	0xD401E188
+#define  GPIO_FUNC_GPIO_44	0xD401E18C
+#define  GPIO_FUNC_GPIO_45	0xD401E190
+#define  GPIO_FUNC_GPIO_46	0xD401E194
+#define  GPIO_FUNC_GPIO_47	0xD401E198
+#define  GPIO_FUNC_GPIO_48	0xD401E19C
+#define  GPIO_FUNC_GPIO_49	0xD401E1A0
+#define  GPIO_FUNC_GPIO_50	0xD401E1A4
+
+#define  GPIO_FUNC_GPIO_51	0xD401E1A8
+#define  GPIO_FUNC_GPIO_52	0xD401E1AC
+#define  GPIO_FUNC_GPIO_53	0xD401E1B0
+#define  GPIO_FUNC_GPIO_54	0xD401E1B4
+#define  GPIO_FUNC_DVL_0      0xD401E2B4
+#define  GPIO_FUNC_DVL_1      0xD401E2B8
+#define  GPIO_FUNC_GPIO_69	0xD401E2BC
+#define  GPIO_FUNC_GPIO_70	0xD401E2C0
+
+#define  GPIO_FUNC_QSPI_DAT3	0xD401E2C4
+#define  GPIO_FUNC_QSPI_DAT2	0xD401E2C8
+#define  GPIO_FUNC_QSPI_DAT1	0xD401E2CC
+#define  GPIO_FUNC_QSPI_DAT0	0xD401E2D0
+#define  GPIO_FUNC_QSPI_CLK	0xD401E2D4
+#define  GPIO_FUNC_QSPI_CS1	0xD401E2D8
+#define  GPIO_FUNC_GPIO_77	0xD401E2DC
+#define  GPIO_FUNC_GPIO_78	0xD401E2E0
+#define  GPIO_FUNC_GPIO_79	0xD401E2E4
+#define  GPIO_FUNC_GPIO_80	0xD401E2E8
+
+#define  GPIO_FUNC_SDIO_DAT3	0xD401E2EC
+#define  GPIO_FUNC_SDIO_DAT2	0xD401E2F0
+#define  GPIO_FUNC_SDIO_DAT1	0xD401E2F4
+#define  GPIO_FUNC_SDIO_DAT0	0xD401E2F8
+#define  GPIO_FUNC_SDIO_CMD	0xD401E2FC
+#define  GPIO_FUNC_SDIO_CLK	0xD401E300
+#define  GPIO_FUNC_GPIO_60	0xD401E304
+#define  GPIO_FUNC_USIM_UCLK	0xD401E320
+#define  GPIO_FUNC_USIM_UIO	0xD401E324
+#define  GPIO_FUNC_USIM_URSTn	0xD401E328
+
+#define  MMC1_DAT3  0x
+
+
+
+#define  GPIO0_BASE 0xD4019000
+#define  GPIO1_BASE 0xD4019004
+#define  GPIO2_BASE 0xD4019008
+#define  GPIO3_BASE 0xD4019100
+
+struct gpio_register_function
+{
+    int  reg;
+    int  func_gpio; // 第 [func_gpio] 功能为 GPIO
+};
+
+typedef struct
+{
+  uint16 output_pin;
+  uint16 input_pin;
+  uint8 mbtk_gpio_test_result; // 0 is pass, 1 is low failed, 2 is high failed
+}mbtk_gpio_test_pin_paired;
+
+
+typedef struct 
+{
+	uint16 output_pin;
+	uint16 output_gpio;
+	uint16 input_gpio;
+	uint16 input_pin;
+	uint8 mbtk_gpio_test_result; // 0 is pass, 1 is low failed, 2 is high failed
+}mbtk_gpio_paired_info_struct;
+
+typedef struct
+{
+  uint16 gpio_num;
+  uint16 pin_num;   //moudle pin num
+}mbtk_gpio_test_pin_and_gpio;
+
+#endif /*__GPIO_DEFINE_H__*/
+
diff --git a/mbtk/mbtk_at/rules.make b/mbtk/mbtk_at/rules.make
new file mode 100755
index 0000000..ca75563
--- /dev/null
+++ b/mbtk/mbtk_at/rules.make
@@ -0,0 +1,62 @@
+LOCAL_SRC_FILES += \
+	$(MBTK_HOME_DIR)/mbtk_at/src/mbtk_at.c \
+	$(MBTK_HOME_DIR)/mbtk_at/src/mbtk_at_basic.c \
+	$(MBTK_HOME_DIR)/mbtk_at/src/mbtk_at_tcpip.c \
+	$(MBTK_HOME_DIR)/mbtk_at/src/mbtk_at_http.c \
+	$(MBTK_HOME_DIR)/mbtk_at/src/mbtk_rgmii_loopback.c \
+	$(MBTK_HOME_DIR)/mbtk_at/src/mbtk_at_ftp.c \
+	$(MBTK_HOME_DIR)/mbtk_at/src/factory/mbtk_adc.c \
+	$(MBTK_HOME_DIR)/mbtk_at/src/factory/mbtk_audio.c \
+	$(MBTK_HOME_DIR)/mbtk_at/src/factory/mbtk_gpio.c \
+	$(MBTK_HOME_DIR)/mbtk_at/src/factory/mbtk_power.c
+
+# Include Dirs -Ixxx
+LOCAL_C_INCLUDES += \
+	-I$(PXA_APPS_DIR)/common/config_manager \
+	-I$(MBTK_HOME_DIR)/mbtk_at/inc
+
+# Define -Dxxx
+#LOCAL_CFLAGS += \
+#	-DMBTK_AT_HTTP_SUPPORT
+
+# Lib Dirs -Lxxx
+#LIBS_DIR += \
+#	-L$(MBTK_HOME_DIR)/lib
+
+# Libs  -lxxx
+#  -lrilutil
+#LIBS += \
+#	-lmbtk_lib
+
+
+#$(info TOPDIR=$(TOPDIR))
+BUILD_PROJECT=$(shell cat $(TOPDIR)/build_version | grep PROJECT | cut -d '=' -f 2)
+$(info BUILD_PROJECT=$(BUILD_PROJECT))
+#BUILD_PROJECT_X=$(shell ${BUILD_PROJECT:0:4})
+#BUILD_PROJECT_X=$(shell echo $(BUILD_PROJECT) | cut -c 1-4)
+#$(info BUILD_PROJECT_X=$(BUILD_PROJECT_X))
+
+ifeq ($(shell echo $(BUILD_PROJECT) | cut -c 1-4), T108)
+$(info BUILD_PROJECT=T108)
+CFLAGS += -DMBTK_PROJECT_T108
+endif
+
+ifeq ($(shell echo $(BUILD_PROJECT) | cut -c 1-7), L508_X6)
+$(info BUILD_PROJECT=L508_X6)
+CFLAGS += -DMBTK_PROJECT_L508_X6
+else
+ifeq ($(shell echo $(BUILD_PROJECT) | cut -c 1-4), L508)
+$(info BUILD_PROJECT=L508)
+CFLAGS += -DMBTK_PROJECT_L508
+else
+ifeq ($(shell echo $(BUILD_PROJECT) | cut -c 1-4), L509)
+$(info BUILD_PROJECT=L509)
+CFLAGS += -DMBTK_PROJECT_L509
+else
+ifeq ($(shell echo $(BUILD_PROJECT) | cut -c 1-6), PN1803)
+$(info BUILD_PROJECT=PN1803)
+CFLAGS += -DMBTK_PROJECT_PN1803
+endif
+endif
+endif
+endif
\ No newline at end of file
diff --git a/mbtk/mbtk_at/rules_info.make b/mbtk/mbtk_at/rules_info.make
new file mode 100755
index 0000000..9c0ec5b
--- /dev/null
+++ b/mbtk/mbtk_at/rules_info.make
@@ -0,0 +1,3 @@
+LOCAL_SRC_FILES += \
+	$(MBTK_HOME_DIR)/mbtk_at/asr/mbtk_device_info.c
+
diff --git a/mbtk/mbtk_at/src/factory/mbtk_adc.c b/mbtk/mbtk_at/src/factory/mbtk_adc.c
new file mode 100755
index 0000000..9f0913c
--- /dev/null
+++ b/mbtk/mbtk_at/src/factory/mbtk_adc.c
@@ -0,0 +1,195 @@
+/**
+ *   \file mbtk_adc.c
+ *   \brief A Documented file.
+ *
+ *  Detailed description
+ *   \Author:  js.wang <js.wang@mobiletek.cn>
+ *   \Version: 1.0.0
+ *   \Date: 2022-04-22
+ */
+#include <fcntl.h>
+#include <stdint.h>
+#include <limits.h>
+#include <termios.h>
+#include <stdarg.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/statfs.h>
+#include <sys/types.h>
+#include <stdio.h>
+// #include "mbtk_log.h"
+//#include "mbtk_type.h"
+#include "mbtk_adc.h"
+
+#define ADC_DEVICE_802 "/sys/devices/soc.0/d4000000.apb/pxa2xx-i2c.2/i2c-2/2-0030/pm802-bat/adc"
+#define ADC_DEVICE_803 "/sys/kernel/debug/adc"
+#define ADC_DEVICE_PMIC802 "/sys/devices/platform/asr-adc/pm80x_adc"
+#define ADC_DEVICE_AUX "/sys/devices/platform/asr-adc/aux_adc"
+
+void mbtk_log(int level, const char *format, ...);
+
+#define LOG_DEBUG_LEVEL 5
+#define LOG(fmt, args...) mbtk_log(LOG_DEBUG_LEVEL, fmt, ##args)
+
+int mbtk_adc_close(void)
+{
+    int ret = 0;
+    int fd = 0;
+    char adc = '3';
+    //system("echo 3 > /sys/kernel/debug/adc");
+    if(!access(ADC_DEVICE_803, R_OK))
+    {
+        //LOGI("DEV:%s", ADC_DEVICE_803);
+        fd = open(ADC_DEVICE_803, O_RDWR|O_CREAT|O_TRUNC, 0644);
+    }
+    else
+    {
+        LOG("No found ADC devices.");
+        return -1;
+    }
+
+    if(fd < 0) {
+        LOG("[%s]  file open error\n", __FUNCTION__);
+        return -2;
+    }
+    ret = write(fd, &adc, 1);
+    if (ret < 0) {
+        LOG("%s: error writing to file!\n", __FUNCTION__);
+        close(fd);
+        return -2;
+    }
+    close(fd);
+    return 0;
+}
+
+int mbtk_adc_get(mbtk_adc_enum channle)
+{
+    int ret = 0;
+    int fd = 0;
+    char adc_buf[24] = {0};
+    char *adc_value = NULL;
+    char adc =(channle == MBTK_ADC0 ? '0' : (channle == MBTK_ADC1 ? '1' : '2'));
+
+#if defined(MBTK_PROJECT_L508_X6)
+    switch(channle)
+    {
+        case MBTK_ADC0:
+        case MBTK_ADC1:
+        {
+            if(!access(ADC_DEVICE_PMIC802, R_OK))
+            {
+                LOG("[adc] DEV:%s", ADC_DEVICE_PMIC802);
+                fd = open(ADC_DEVICE_PMIC802, O_RDWR|O_CREAT|O_TRUNC, 0644);
+            }
+            else
+            {
+                LOG("No found ADC devices.");
+                return -1;
+            }
+            break;
+        }
+        case MBTK_ADC2:
+        {
+            if(!access(ADC_DEVICE_AUX, R_OK))
+            {
+                LOG("[adc] DEV:%s", ADC_DEVICE_AUX);
+                fd = open(ADC_DEVICE_AUX, O_RDWR|O_CREAT|O_TRUNC, 0644);
+            }
+            else
+            {
+                LOG("No found ADC devices.");
+                return -1;
+            }
+            break;
+        }
+        default:
+        {
+            LOG("channle is error.");
+            return -1;
+        }
+    }
+#elif defined(MBTK_PROJECT_T108)
+    if(!access(ADC_DEVICE_AUX, R_OK))
+    {
+        LOG("[adc] DEV:%s", ADC_DEVICE_AUX);
+        fd = open(ADC_DEVICE_AUX, O_RDWR|O_CREAT|O_TRUNC, 0644);
+    }
+    else
+    {
+        LOG("No found ADC devices.");
+        return -1;
+    }
+#else
+#if 0
+    if(!access(ADC_DEVICE_802, R_OK)) {
+        //LOGI("DEV:%s", ADC_DEVICE_802);
+        fd = open(ADC_DEVICE_802, O_RDWR|O_CREAT|O_TRUNC, 0644);
+    } else {
+        if(!access(ADC_DEVICE_803, R_OK)) {
+            //LOGI("DEV:%s", ADC_DEVICE_803);
+            fd = open(ADC_DEVICE_803, O_RDWR|O_CREAT|O_TRUNC, 0644);
+        } else {
+            LOGE("No found ADC devices.");
+            return -1;
+        }
+    }
+#endif
+    if(!access(ADC_DEVICE_PMIC802, R_OK))
+    {
+            //LOGI("DEV:%s", ADC_DEVICE_803);
+            fd = open(ADC_DEVICE_PMIC802, O_RDWR|O_CREAT|O_TRUNC, 0644);
+    }
+    else
+    {
+            LOG("No found ADC devices.");
+            return -1;
+    }
+#endif
+
+    if(fd < 0) {
+        LOG("[%s]  file open error\n", __FUNCTION__);
+        return -2;
+    }
+    ret = write(fd, &adc, 1);
+    if (ret < 0) {
+        LOG("%s: error writing to file!\n", __FUNCTION__);
+        close(fd);
+        return -2;
+    }
+    ret = read(fd, adc_buf, 24);
+    if (ret < 0) {
+        LOG("%s: error writing to file!\n", __FUNCTION__);
+        close(fd);
+        return -2;
+    }else{
+        //LOGI("%s %d adc:%s\n", __FUNCTION__, __LINE__, adc_buf);
+        adc_value = strstr(adc_buf, "channel");
+    }
+    close(fd);
+    if(adc_value)
+    {
+        //LOGI("%s adc: %s\n", __FUNCTION__, adc_value);
+    }
+    else
+        return -2;
+
+    return atoi(&adc_value[9]);
+}
+
+int mbtk_at_adc(int value)
+{
+    if(0 != value && 1 != value && 2 != value){
+        return -1;
+    }
+
+#if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108))
+    //NULL
+#else
+    if(value == 2)
+    {
+        return mbtk_adc_close();
+    }
+#endif
+
+    return mbtk_adc_get((mbtk_adc_enum)value);
+}
\ No newline at end of file
diff --git a/mbtk/mbtk_at/src/factory/mbtk_audio.c b/mbtk/mbtk_at/src/factory/mbtk_audio.c
new file mode 100755
index 0000000..10ff992
--- /dev/null
+++ b/mbtk/mbtk_at/src/factory/mbtk_audio.c
@@ -0,0 +1,86 @@
+//#include "mbtk_audio2.h"
+//#include "mbtk_audio_ubus.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "telutl.h"
+#include "mbtk_at.h"
+
+#define AUD_DEMO_WAV "/user_data/demo.wav"
+
+typedef enum {
+    MBTK_AUDIO_SAMPLE_RATE_8000 = 0,
+    MBTK_AUDIO_SAMPLE_RATE_16000
+} mbtk_audio_sample_rate_enum;
+
+
+int mbtk_at_loopback(int type)
+{
+    LOG("mbtk_at_loopback() : type - %d", type);
+    if(0 == type) // Stop
+    {
+        if(MBTK_FUNC(mbtk_audio_loopback_stop)()) {
+            return -1;
+        }
+
+        MBTK_FUNC(mbtk_audio_ubus_deinit)();
+    }
+    else // Start
+    {
+        MBTK_FUNC(mbtk_audio_ubus_init)();
+
+        MBTK_FUNC(mbtk_audio_mode_set)(0);
+        MBTK_FUNC(mbtk_audio_loopback_start)(2);
+    }
+
+    return 0;
+}
+
+int mbtk_at_play(const char *args)
+{
+    int ret = 0;
+    if(MBTK_FUNC(mbtk_audio_wav_init)()) {
+        LOG("mbtk_audio_wav_init() fail.");
+        return -1;
+    }
+
+    if(MBTK_FUNC(mbtk_audio_wav_play_start)(AUD_DEMO_WAV)) {
+        LOG("mbtk_audio_wav_play_start() fail.");
+        ret = -1;
+        goto exit;
+    }
+
+    sleep(5);
+
+exit:
+    if(MBTK_FUNC(mbtk_audio_wav_deinit)()) {
+        LOG("mbtk_audio_wav_deinit() fail.");
+        return -1;
+    }
+
+    return ret;
+}
+
+int mbtk_at_rec(const char *args)
+{
+    int ret = 0;
+    if(MBTK_FUNC(mbtk_audio_wav_init)()) {
+        LOG("mbtk_audio_wav_init() fail.");
+        return -1;
+    }
+
+    if(MBTK_FUNC(mbtk_audio_wav_recorder_start)(AUD_DEMO_WAV, MBTK_AUDIO_SAMPLE_RATE_8000)) {
+        LOG("mbtk_audio_wav_recorder_start() fail.");
+        ret = -1;
+        goto exit;
+    }
+
+    sleep(5);
+
+exit:
+    if(MBTK_FUNC(mbtk_audio_wav_deinit)()) {
+        LOG("mbtk_audio_wav_deinit() fail.");
+        return -1;
+    }
+
+    return 0;
+}
diff --git a/mbtk/mbtk_at/src/factory/mbtk_gpio.c b/mbtk/mbtk_at/src/factory/mbtk_gpio.c
new file mode 100755
index 0000000..df94926
--- /dev/null
+++ b/mbtk/mbtk_at/src/factory/mbtk_gpio.c
@@ -0,0 +1,2006 @@
+/**
+ *   \file gpio-test.c
+ *   \brief A Documented file.
+ *
+ *  Detailed description
+ *   \Author:  Sniper <js.wang@mobiletek.cn>
+ *   \Version: 1.0.0
+ *   \Date: 2022-04-26
+ */
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <sys/mount.h>
+#include <sys/mman.h>
+#include <ctype.h>
+#include <stdbool.h>
+#include <cutils/properties.h>
+#include "mbtk_gpio_def.h"
+#include "gpio-define.h"
+
+#ifndef TRUE
+#define TRUE   1   /* Boolean true value. */
+#endif
+
+#ifndef FALSE
+#define FALSE  0   /* Boolean false value. */
+#endif
+
+#define gpio_log(...)     if(gpio_debug)printf(__VA_ARGS__)
+#define HWMAP_DEVICE "/dev/hwmap"
+#define PAGE_OFFS_BITS(pgsz) ((unsigned int)(pgsz)-1)
+#define PAGE_MASK_BITS(pgsz) (~PAGE_OFFS_BITS(pgsz))
+#define STR_MAX_LEN 220
+typedef enum {
+    MBTK_ADC0 = 0,  /* ADC 0 */
+    MBTK_ADC1       /* ADC 1 */
+} mbtk_adc_enum;
+
+static int gpio_debug = 0;
+#define DEBUG_GPIO_TEST 1
+
+/**/
+#define GPIO_MAX_CURRENT     (7<<10)  //设置GPIO最大输出电流
+#define GPIO_STRONG_PULLUP   (1<<3)   //设置GPIO强上拉
+#define GPIO_PULLUP_ENABLE   ((1<<15)|(1<<14)) //GPIO上拉
+#define GPIO_PULLDOWN_ENABLE ((1<<15)|1<<13) //GPIO下拉
+
+#define MBTK_GPIO_OUTPUT 1
+#define MBTK_GPIO_INPUT  0
+
+#if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108))
+struct gpio_register_function gpio_func_register[128] = {
+    {GPIO_FUNC_GPIO_00, 0},
+    {GPIO_FUNC_GPIO_01, 0},
+    {GPIO_FUNC_GPIO_02, 0},
+    {GPIO_FUNC_GPIO_03, 0},
+    {GPIO_FUNC_GPIO_04, 0},
+    {GPIO_FUNC_GPIO_05, 0},
+    {GPIO_FUNC_GPIO_06, 0},
+    {GPIO_FUNC_GPIO_07, 0},
+    {GPIO_FUNC_GPIO_08, 0},
+    {GPIO_FUNC_GPIO_09, 0},
+    {GPIO_FUNC_GPIO_10, 0},
+    {GPIO_FUNC_GPIO_11, 0},
+    {GPIO_FUNC_GPIO_12, 0},
+    {GPIO_FUNC_GPIO_13, 0},
+    {GPIO_FUNC_GPIO_14, 0},
+    {GPIO_FUNC_GPIO_15, 0},
+    {GPIO_FUNC_GPIO_16, 0},
+    {GPIO_FUNC_GPIO_17, 0},
+    {GPIO_FUNC_GPIO_18, 0},
+    {GPIO_FUNC_GPIO_19, 0},
+    {GPIO_FUNC_GPIO_20, 0},
+    {GPIO_FUNC_GPIO_21, 0},
+    {GPIO_FUNC_GPIO_22, 0},
+    {GPIO_FUNC_GPIO_23, 0},
+    {GPIO_FUNC_GPIO_24, 0},
+    {GPIO_FUNC_GPIO_25, 0},
+    {GPIO_FUNC_GPIO_26, 0},
+    {GPIO_FUNC_GPIO_27, 0},
+    {GPIO_FUNC_GPIO_28, 0},
+    {GPIO_FUNC_GPIO_29, 0},
+    {GPIO_FUNC_GPIO_30, 0},
+    {GPIO_FUNC_GPIO_31, 0},
+    {GPIO_FUNC_GPIO_32, 0},
+    {GPIO_FUNC_GPIO_33, 0},
+    {GPIO_FUNC_GPIO_34, 0},
+    {GPIO_FUNC_GPIO_35, 0},
+    {GPIO_FUNC_GPIO_36, 0},
+	{GPIO_FUNC_GPIO_37, 0}, // GPIO_37
+    {GPIO_FUNC_GPIO_38, 0}, // GPIO_38
+    {GPIO_FUNC_GPIO_39, 0}, // GPIO_39
+    {GPIO_FUNC_GPIO_40, 0}, // GPIO_40
+    {GPIO_FUNC_GPIO_41, 0},  //GPIO_41
+    {GPIO_FUNC_GPIO_42, 0},  //GPIO_42
+    {GPIO_FUNC_GPIO_43, 0},  //GPIO_43
+    {GPIO_FUNC_GPIO_44,0},	//GPIO_44
+	{GPIO_FUNC_GPIO_45,0},	//GPIO_45
+	{GPIO_FUNC_GPIO_46,0},		//GPIO_46
+	{GPIO_FUNC_GPIO_47,0},		//GPIO_47
+    {GPIO_FUNC_SDIO_DAT3, 1}, //GPIO_48
+    {GPIO_FUNC_GPIO_49, 0},
+    {GPIO_FUNC_GPIO_50, 0},
+    {GPIO_FUNC_GPIO_51, 0},
+    {GPIO_FUNC_GPIO_52, 0},
+    {GPIO_FUNC_GPIO_53, 0},
+    {GPIO_FUNC_GPIO_54, 0},
+    {GPIO_FUNC_SDIO_DAT2, 1}, //GPIO_55
+    {GPIO_FUNC_SDIO_DAT1, 1}, //GPIO_56
+    {GPIO_FUNC_SDIO_DAT0, 1}, //GPIO_57
+    {GPIO_FUNC_SDIO_CMD, 1},  //GPIO_58
+    {GPIO_FUNC_SDIO_CLK, 1},  //GPIO_59
+    {GPIO_FUNC_GPIO_60, 0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},
+    {GPIO_FUNC_DVL_0, 1},//GPIO_67
+    {GPIO_FUNC_DVL_1, 1},//GPIO_68
+    {GPIO_FUNC_GPIO_69, 0},
+    {GPIO_FUNC_GPIO_70, 0},
+    {GPIO_FUNC_QSPI_DAT3, 1}, //GPIO_71
+    {GPIO_FUNC_QSPI_DAT2, 1}, //GPIO_72
+    {GPIO_FUNC_QSPI_DAT1, 1}, //GPIO_73
+    {GPIO_FUNC_QSPI_DAT0, 1}, //GPIO_74
+    {GPIO_FUNC_QSPI_CLK, 1},  //GPIO_75
+    {GPIO_FUNC_QSPI_CS1, 1},  //GPIO_76
+    {GPIO_FUNC_GPIO_77, 0},
+    {GPIO_FUNC_GPIO_78, 0},
+    {GPIO_FUNC_GPIO_79, 0},
+    {GPIO_FUNC_GPIO_80, 0},
+    {GPIO_FUNC_USIM_UCLK, 1},//GPIO_81
+    {GPIO_FUNC_USIM_UIO, 1},//GPIO_82
+    {GPIO_FUNC_USIM_URSTn, 1},//GPIO_83
+
+    {GPIO_FUNC_MMC1_DAT3,5},			//GPIO_84
+	{GPIO_FUNC_MMC1_DAT2,5},			//GPIO_85
+	{GPIO_FUNC_MMC1_DAT1,5},			//GPIO_86
+	{GPIO_FUNC_MMC1_DAT0,5},			//GPIO_87
+    {GPIO_FUNC_MMC1_CMD,5},			//GPIO_88
+	{GPIO_FUNC_MMC1_CLK,5},			//GPIO_89
+	{GPIO_FUNC_MMC1_CD,1},						//GPIO_90
+	{0,0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},
+    {GPIO_FUNC_USB_ID, 1},//GPIO_99
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},
+    {GPIO_FUNC_PRI_TDI, 1},         //GPIO_117
+    {GPIO_FUNC_PRI_TMS, 1},         //GPIO_118
+    {GPIO_FUNC_PRI_TCK, 1},         //GPIO_119
+    {GPIO_FUNC_PRI_TDO, 1},         //GPIO_120
+    {GPIO_FUNC_QSPI_VMODE_GPIO, 1}, //GPIO_121
+    {GPIO_FUNC_VBUS_DRV, 1},        //GPIO_122
+    {GPIO_FUNC_CLK_REQ, 1},         //GPIO_123
+    {0,0},
+    {GPIO_FUNC_VCXO_REQ, 1},        //GPIO_125
+	{0,0},							//GPIO_126
+    {GPIO_FUNC_VCXO_OUT, 1},        //GPIO_127
+    {0,0},
+};
+
+#else
+struct gpio_register_function gpio_func_register[128] = {
+    {GPIO_FUNC_GPIO_00, 0},
+    {GPIO_FUNC_GPIO_01, 0},
+    {GPIO_FUNC_GPIO_02, 0},
+    {GPIO_FUNC_GPIO_03, 0},
+    {GPIO_FUNC_GPIO_04, 0},
+    {GPIO_FUNC_GPIO_05, 0},
+    {GPIO_FUNC_GPIO_06, 0},
+    {GPIO_FUNC_GPIO_07, 0},
+    {GPIO_FUNC_GPIO_08, 0},
+    {GPIO_FUNC_GPIO_09, 0},
+    {GPIO_FUNC_GPIO_10, 0},
+    {GPIO_FUNC_GPIO_11, 0},
+    {GPIO_FUNC_GPIO_12, 0},
+    {GPIO_FUNC_GPIO_13, 0},
+    {GPIO_FUNC_GPIO_14, 0},
+    {GPIO_FUNC_GPIO_15, 0},
+    {GPIO_FUNC_GPIO_16, 0},
+    {GPIO_FUNC_GPIO_17, 0},
+    {GPIO_FUNC_GPIO_18, 0},
+    {GPIO_FUNC_GPIO_19, 0},
+    {GPIO_FUNC_GPIO_20, 0},
+    {GPIO_FUNC_GPIO_21, 0},
+    {GPIO_FUNC_GPIO_22, 0},
+    {GPIO_FUNC_GPIO_23, 0},
+    {GPIO_FUNC_GPIO_24, 0},
+    {GPIO_FUNC_GPIO_25, 0},
+    {GPIO_FUNC_GPIO_26, 0},
+    {GPIO_FUNC_GPIO_27, 0},
+    {GPIO_FUNC_GPIO_28, 0},
+    {GPIO_FUNC_GPIO_29, 0},
+    {GPIO_FUNC_GPIO_30, 0},
+    {GPIO_FUNC_GPIO_31, 0},
+    {GPIO_FUNC_GPIO_32, 0},
+    {GPIO_FUNC_GPIO_33, 0},
+    {GPIO_FUNC_GPIO_34, 0},
+    {GPIO_FUNC_GPIO_35, 0},
+    {GPIO_FUNC_GPIO_36,   0},
+    {GPIO_FUNC_MMC1_DAT3, 5}, // GPIO_37
+    {GPIO_FUNC_MMC1_DAT2, 5}, // GPIO_38
+    {GPIO_FUNC_MMC1_DAT1, 5}, // GPIO_39
+    {GPIO_FUNC_MMC1_DAT0, 5}, // GPIO_40
+    {GPIO_FUNC_MMC1_CMD, 5},  //GPIO_41
+    {GPIO_FUNC_MMC1_CLK, 5},  //GPIO_42
+    {GPIO_FUNC_MMC1_CD , 1},  //GPIO_43
+    {0,0},{0,0},{0,0},{0,0},
+    {GPIO_FUNC_SDIO_DAT3, 1}, //GPIO_48
+    {GPIO_FUNC_GPIO_49, 0},
+    {GPIO_FUNC_GPIO_50, 0},
+    {GPIO_FUNC_GPIO_51, 0},
+    {GPIO_FUNC_GPIO_52, 0},
+    {GPIO_FUNC_GPIO_53, 0},
+    {GPIO_FUNC_GPIO_54, 0},
+    {GPIO_FUNC_SDIO_DAT2, 1}, //GPIO_55
+    {GPIO_FUNC_SDIO_DAT1, 1}, //GPIO_56
+    {GPIO_FUNC_SDIO_DAT0, 1}, //GPIO_57
+    {GPIO_FUNC_SDIO_CMD, 1},  //GPIO_58
+    {GPIO_FUNC_SDIO_CLK, 1},  //GPIO_59
+    {GPIO_FUNC_GPIO_60, 0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},
+    {GPIO_FUNC_DVL_0, 1},//GPIO_67
+    {GPIO_FUNC_DVL_1, 1},//GPIO_68
+    {GPIO_FUNC_GPIO_69, 0},
+    {GPIO_FUNC_GPIO_70, 0},
+    {GPIO_FUNC_QSPI_DAT3, 1}, //GPIO_71
+    {GPIO_FUNC_QSPI_DAT2, 1}, //GPIO_72
+    {GPIO_FUNC_QSPI_DAT1, 1}, //GPIO_73
+    {GPIO_FUNC_QSPI_DAT0, 1}, //GPIO_74
+    {GPIO_FUNC_QSPI_CLK, 1},  //GPIO_75
+    {GPIO_FUNC_QSPI_CS1, 1},  //GPIO_76
+    {GPIO_FUNC_GPIO_77, 0},
+    {GPIO_FUNC_GPIO_78, 0},
+    {GPIO_FUNC_GPIO_79, 0},
+    {GPIO_FUNC_GPIO_80, 0},
+    {GPIO_FUNC_USIM_UCLK, 1},//GPIO_81
+    {GPIO_FUNC_USIM_UIO, 1},//GPIO_82
+    {GPIO_FUNC_USIM_URSTn, 1},//GPIO_83
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},
+    {GPIO_FUNC_USB_ID, 1},//GPIO_99
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},{0,0},{0,0},{0,0},
+    {0,0},
+    {GPIO_FUNC_PRI_TDI, 1},         //GPIO_117
+    {GPIO_FUNC_PRI_TMS, 1},         //GPIO_118
+    {GPIO_FUNC_PRI_TCK, 1},         //GPIO_119
+    {GPIO_FUNC_PRI_TDO, 1},         //GPIO_120
+    {GPIO_FUNC_QSPI_VMODE_GPIO, 1}, //GPIO_121
+    {GPIO_FUNC_VBUS_DRV, 1},        //GPIO_122
+    {GPIO_FUNC_CLK_REQ, 1},         //GPIO_123
+    {0,0},
+    {GPIO_FUNC_VCXO_REQ, 1},        //GPIO_125
+    {GPIO_FUNC_VCXO_OUT, 1},        //GPIO_126
+    {0,0},
+};
+
+#endif
+
+static int mbtk_gpio_adc(channel)
+{
+    int ret = 0;
+
+    ret =  mbtk_adc_get(channel);
+#if DEBUG_GPIO_TEST
+    printf("ADC_%d_value =%d\n", channel, ret);
+#endif
+    if(ret >= 500 ){	//TODO: 各项目高电平标准?
+        ret = 1;
+    }
+    else if (ret>=0 && ret<=480){
+        ret = 0;
+    }
+    else{
+        ret = -1;
+    }
+    return ret;
+}
+
+
+static int hwacc_register(int rw, unsigned int addr, unsigned int *data)
+{
+	int fid;
+	unsigned int pagesize, len, len_aligned;
+	unsigned int addr_aligned;
+	volatile unsigned int *pa;
+	void *vpa;
+
+	len = pagesize = sysconf(_SC_PAGESIZE);
+	if((fid = open(HWMAP_DEVICE, O_RDWR)) < 0)
+	{
+		printf("Failed to open %s\n", HWMAP_DEVICE);
+		exit(-1);
+	}
+
+	// Align the length so the mapped area is page-aligned and contains the requested area
+	addr_aligned = addr & PAGE_MASK_BITS(pagesize);
+	len_aligned =((addr + len - addr_aligned) + pagesize - 1) & PAGE_MASK_BITS(pagesize);
+
+	/* Notes on flags: MAP_PRIVATE results in copy on write; MAP_SHARED allows normal write */
+	/*   MAP_SHARED required O_RDWR in open above, otherwise mmap fails with errno=EACCES   */
+	/* Notes on prot:  PROT_WRITE allows read and write; PROT_READ allows read only         */
+	/* Notes on off: an unsigned 32-bit value, should be aligned to page size according to mmap manpage */
+	if((vpa = mmap(0, len_aligned, PROT_READ|PROT_WRITE, MAP_SHARED, fid, addr_aligned)) == MAP_FAILED)
+	{
+		printf("mmap failed (%d)\n", errno);
+	}
+	else
+	{
+		pa = (volatile unsigned int *)((unsigned char *)vpa + (addr & PAGE_OFFS_BITS(pagesize)));
+		if(rw == 0)
+		{
+			*data = *pa;
+			gpio_log("Value read from 0x%.8x via MVA=0x%p is 0x%.8x\n", addr, pa, *data);
+		}
+		else if(rw == 1)
+		{
+			*pa = *data;
+			gpio_log("Value %.8x written to 0x%.8x via MVA=0x%p\n", *data, addr, pa);
+#if defined(HWACC_DEBUG)
+			{
+				unsigned int val;
+				val = *pa;
+				printf("Value read from 0x%.8x via MVA=0x%p is 0x%.8x\n", addr, pa, val);
+			}
+#endif
+		}
+		munmap(vpa, len);
+	}
+
+	close(fid);
+	return 0;
+}
+/*
+设置GPIO 模式:第一步读GPIO22默认function
+root@OpenWrt:/# hwacc r 0xd401e134
+Option = r Addr = d401e134
+Value read from 0xd401e134 via MVA=0x0xb6fc3134 is 0x0000d040   //默认GPIO功能
+Bit0~bit2值对应上面表格各function,0代表GPIO功能
+ */
+static int gpio_register_read(int reg)
+{
+    int ret = -1;
+#if 0
+    FILE * fp;
+    // "/bin/hwacc r 0xd401e134";
+    char command[36] = {0};
+    char buffer[1024];
+    int i = 0;
+
+    sprintf(command, "/bin/hwacc r 0x%x", reg);
+    fp = popen(command, "r");
+    while(1)
+    {
+        if( fgets (buffer, sizeof(buffer), fp)!=NULL ) {
+            buffer[strlen(buffer) - 1] = 0;
+            // gpio_log("out [%d]: %s\n", strlen(buffer), buffer);
+        }else{
+            break;
+        }
+        i = strstr_n(buffer, "is");
+        if(i)
+        {
+            ret = str_to_hex(&buffer[i + 2]);
+            gpio_log("read 0x%x value:%s, %x\n", reg, &buffer[i + 2], ret);
+        }
+    }
+    pclose(fp);
+#else
+#ifndef MBTK_PROJECT_PN1803
+    usleep(50);
+#endif
+    hwacc_register(0, reg, &ret);
+#ifndef MBTK_PROJECT_PN1803
+    usleep(50);
+#endif
+#endif
+    return ret;
+}
+/*
+设置输入输出状态,设置PDR寄存器GPIO22为output
+root@OpenWrt:/# hwacc w 0xD401900c 0x00c03800
+Option = w Addr = d401900c Data=00c03800
+Value 00c03800 written to 0xd401900c via MVA=0x0xb6f9f00c
+ */
+static void gpio_register_write(int reg, int value)
+{
+#if 0
+    FILE * fp;
+    //  "/bin/hwacc w 0xD401900c 0x00c03800"
+    char command[36] = {0};
+    char buffer[1024];
+
+    sprintf(command, "/bin/hwacc w 0x%x 0x%x", reg, value);
+    gpio_log("command: %s\n", command);
+    fp = popen(command, "r");
+    while(1)
+    {
+        if( fgets (buffer, sizeof(buffer), fp)!=NULL ) {
+            gpio_log("%s\n", buffer);
+        }else{
+            break;
+        }
+    }
+    pclose(fp);
+
+#else
+#ifndef MBTK_PROJECT_PN1803
+    usleep(50);
+#endif
+    hwacc_register(1, reg, &value);
+#ifndef MBTK_PROJECT_PN1803
+    usleep(50);
+#endif
+#endif
+}
+/*
+AF SEL<p>This field is used for alternate function selection for a pin.
+It selects between the eight possible alternate functions for the pin.
+Alternate function 0 is always the reset case.
+
+<p>0x0 = Alternate function 0 (primary function at reset)
+<p>0x1 = Alternate function 1
+<p>0x2 = Alternate function 2
+<p>0x3 = Alternate function 3
+<p>0x4 = Alternate function 4
+<p>0x5 = Alternate function 5
+<p>0x6 = Alternate function 6
+<p>0x7 = Alternate function 7
+ */
+static int gpio_register_set_func_0(int port)
+{
+    int ret;
+    struct gpio_register_function *reg = NULL;
+    if(port > 128)
+        return -1;
+    reg = &gpio_func_register[port];
+    if(0 == reg->reg)
+        return -1;
+    ret = gpio_register_read(reg->reg);
+    if((ret & 0x7) != reg->func_gpio)
+    {
+        //printf("Gpio set func [%d] [0x%x]!\n", reg->func_gpio, (ret & 0xfffffff8) | reg->func_gpio);
+        gpio_register_write(reg->reg, (ret & 0xfffffff8) | reg->func_gpio);
+    }
+    return 0;
+}
+/*
+设置GPIO  方向
+读取输入输出状态,读PDR寄存器:0x0c
+root@OpenWrt:/# hwacc r 0xD401900c
+Option = r Addr = d401900c
+Value read from 0xd401900c via MVA=0x0xb6f3900c is 0x00803800  //bit22为0,代表Input
+ */
+static void gpio_register_set_direction(int port, int dir)
+{
+    int ret;
+    int reg = 0xD4019000;
+
+    if(port > (32 - 1))
+        reg = 0xD4019004;
+    if(port > (32 * 2 - 1))
+        reg = 0xD4019008;
+    if(port > (32 * 3 - 1))
+        reg = 0xD4019100;
+
+    reg += 0x0c;
+    port = port % 0x20;
+    ret = gpio_register_read(reg);
+    //printf("[Direction] reg_value=%x\n", ret);
+    // 设置 输出 0 && 1
+    if(!(ret & (0x1 << port)) && dir)
+    {
+        gpio_register_write(reg, ret | (0x1 << port));  //set the gpio bit
+        //printf("[Direction out] reg_value=%x\n",  gpio_register_read(reg));
+    }
+    // 设置 输入 1 && 0
+    if((ret & (0x1 << port)) && !dir)
+    {
+#if 1
+        gpio_register_write(reg, ret & (~(0x1 << port)));  //clear the gpio bit,mbtk_tanggaoyou
+#else
+	     gpio_register_write(reg, ret | !(0x1 << port)); //这是错误配置,实际没有任何作用,还是原来的值
+#endif
+        //printf("[Direction in] reg_value=%x\n",  gpio_register_read(reg));
+    }
+}
+/*
+设置GPIO 输出电平
+
+读取电平状态,先读PLR寄存器:0x00
+root@OpenWrt:/# hwacc r 0xD4019000
+Option = r Addr = d4019000
+Value read from 0xd4019000 via MVA=0x0xb6f1c000 is 0x81e82a30
+对应下面具体BIT
+1000 0001 1110 1000 0010 1010 0011 0000   BIT22默认电平高
+
+设置输出高:设置PSR寄存器:0x18(只写寄存器)
+root@OpenWrt:/# hwacc w 0xD4019018 0x400000
+Option = w Addr = d4019018 Data=00400000
+Value 00400000 written to 0xd4019018 via MVA=0x0xb6f56018 //bit22写1,输出高
+
+设置输出低:设置PCR寄存器:0x24
+root@OpenWrt:/# hwacc w 0xD4019024 0x400000
+Option = w Addr = d4019024 Data=00400000
+Value 00400000 written to 0xd4019024 via MVA=0x0xb6faa024   //Bit22写1,GPIO22输出低
+
+ */
+static void gpio_register_set_value(int port, int value)
+{
+    int ret;
+    int reg = 0xD4019000;
+
+    if(port > (32 - 1))
+        reg = 0xD4019004;
+    if(port > (32 * 2 - 1))
+        reg = 0xD4019008;
+    if(port > (32 * 3 - 1))
+        reg = 0xD4019100;
+
+    if(value)
+    {
+        reg += 0x18;
+    }
+    else
+        reg += 0x24;
+
+    port = port % 0x20;
+    ret = gpio_register_read(reg);
+    //printf("[Value] reg_value=%x\n", gpio_register_read(0xD4019004));
+    // 设置 高电平 0 && 1
+    if(value)
+    {
+        gpio_register_write(reg, ret | (0x1 << port));
+        //printf("[Value high] reg_value=%x\n", gpio_register_read(0xD4019004));
+        return;
+    }
+    // 设置 低电平 1 && 0
+    if(!(ret & (0x1 << port)) && !value)
+    {
+        gpio_register_write(reg, ret | (0x1 << port));
+        //printf("[Value low] reg_value=%x\n", gpio_register_read(0xD4019004));
+    }
+}
+/*
+读取电平状态,先读PLR寄存器:0x00
+root@OpenWrt:/# hwacc r 0xD4019000
+Option = r Addr = d4019000
+Value read from 0xd4019000 via MVA=0x0xb6f1c000 is 0x81e82a30
+对应下面具体BIT
+1000 0001 1110 1000 0010 1010 0011 0000   BIT22默认电平高
+ */
+static int gpio_register_get_value(int port)
+{
+    int ret = -1;
+    int reg = 0xD4019000;
+
+    if(port > (32 - 1))
+        reg = 0xD4019004;
+    if(port > (32 * 2 - 1))
+        reg = 0xD4019008;
+    if(port > (32 * 3 - 1))
+        reg = 0xD4019100;
+    port = port % 0x20;
+    ret = gpio_register_read(reg);
+    if(ret & (0x1 << port))
+    {
+        return 1;
+    }
+    return 0;
+}
+
+void gpio_debug_set(int enable)
+{
+    gpio_debug = enable;
+}
+
+
+
+#if defined(MBTK_PROJECT_PN1803)
+int gpio_register_test_out(int port, int value)
+{
+    int ret;
+    int i;
+    int valueh = 0;
+    int valuel = 1;
+
+    //printf("Gpio port [%d] test start!\n", port);
+    ret = gpio_register_set_func_0(port);           //设功能为GPIO
+    if(ret){
+        printf("gpio_port can't support!\n");
+        return -1;
+    }
+    gpio_register_set_direction(port, 1);           //设方向为输出
+    ret = gpio_register_get_value(port);
+    //printf("gpio default value is : %d.\n", ret);
+
+
+    //[High]
+    for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port, 1);
+        usleep(50);
+        valueh = gpio_register_get_value(port);
+        //printf("set high? %d\n",valueh);
+        if(1 == valueh){
+            break;
+        }
+    }
+    //usleep(10000);
+    for(i = 0; i <= 35; i++){
+        ret = mbtk_gpio_adc(0);
+        usleep(3000);
+        if(1 == ret){
+            break;
+        }
+    }
+    if(1 != ret){
+        ret=-1;
+        goto exit;
+    }
+    printf("******gpio should is high: %d.******\n", ret);
+
+
+    //[Low]
+     usleep(200);
+     for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port, 0);               //输出低
+        usleep(50);
+        valuel = gpio_register_get_value(port);
+        //printf("set low? %d\n",valuel);
+        if(0 == valuel){
+            break;
+        }
+    }
+    //usleep(10000);
+    for(i = 0; i <= 35; i++){
+        ret = mbtk_gpio_adc(0);
+        usleep(3000);
+        if(0 == ret){
+            break;
+        }
+    }
+    printf("******gpio should is low: %d.******\n", ret);
+    if(0 != ret){
+        ret=-1;
+        goto exit;
+    }
+
+exit:
+    //gpio_register_set_direction(port, 0);  //设方向为输入
+    return ret;
+}
+
+int mbtk_at_gpio(bool gnss_support, void* arg)
+{
+    int test_gpio[] = {
+     56, 55, 58, 57, 48, 59, 12, 20, 5, 43, 21,
+     49, 50, 27, 28, 26, 25, 16, 17, 15, 126, 125,
+      4,  0, 3, 18, 7, 6, 1, 2, /*54,*/ 19, 13,
+     32, 31, 23, 24, 22, /*122,*/ 33, 35, 36, 34, 14,
+     99,/* 53,*/ 37, 38, 39, 40, 41, 42};
+
+    int i, j, ret, total, n = 0;
+    int *fail_io = (int *)arg;
+    total = (sizeof(test_gpio)/sizeof(int));
+    //printf("Start test gpio total: %d\n", total);
+
+    /* [1 all gpio set to low] */
+    for(j = 0; j < 6 ; j++){
+        for(i = 0; i < total; i++){
+            gpio_register_set_func_0(test_gpio[i]);
+            gpio_register_set_direction(test_gpio[i], 1);
+            gpio_register_set_value(test_gpio[i], 0);
+        }
+      //usleep(10000);
+      for(i = 0; i <= 35; i++){
+          ret = mbtk_gpio_adc(0);
+          usleep(3000);
+          if(0 == ret){
+              break;
+          }
+      }
+      printf("pre set ADC: %d, times: %d\n",ret, j);
+      if(0 == ret){
+          break;
+      }
+    }
+	if(0 != ret){
+		printf("Fail, please retest");
+		return -1;
+	}
+
+
+    /* [2 GPIOTEST] */
+    for(i = 0; i < total; i++){
+        ret = gpio_register_test_out(test_gpio[i], 0);
+        if(-1 == ret){
+            printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio[i]);
+            fail_io[n] = test_gpio[i];
+            n++;
+        }else{
+            //printf("############gpio [%d] test success############\n", test_gpio[i]);
+        }
+    }
+    mbtk_adc_close();
+    return n;
+}
+
+#elif defined(MBTK_PROJECT_L508)
+
+
+#define READ_GPIO_NUM 22
+
+#define DEBUG_GPIO_TEST 1
+
+mbtk_gpio_test_pin_and_gpio *p_test_gpio =NULL;
+mbtk_gpio_test_pin_and_gpio *p_gnss_gpio = NULL;
+int test_gpio_group_total_pin = 0;
+int gnss_gpio_group_total_pin = 0;
+
+int gpio_test_set_group_pin_to_low(mbtk_gpio_test_pin_and_gpio *p_pin_group_array, int total_num)
+{
+    int i;
+    int gpio_num = 0;
+    int ret = 0;
+
+    if(p_pin_group_array == NULL)
+       return -1;
+
+	for(i=0; i < total_num; i++)
+	{
+       gpio_num = p_pin_group_array[i].gpio_num;
+	   ret += gpio_register_set_func_0(gpio_num);
+	   gpio_register_set_direction(gpio_num, MBTK_GPIO_OUTPUT);
+	   gpio_register_set_value(gpio_num, 0);
+	}
+	return ret;
+}
+
+
+int gpio_test_init(void)
+{
+	int i,j,ret;
+    int gpio_num = 0;
+
+
+
+
+	system("i2cset -y -f 2 0x31 0x12 0x46");
+	system("echo 53 > /sys/class/gpio/export");  //gnss uart rx
+	system("echo out > /sys/class/gpio/gpio53/direction");
+	system("echo 54 > /sys/class/gpio/export");//gnss uart tx
+	system("echo out > /sys/class/gpio/gpio54/direction");
+	system("echo 22 > /sys/class/gpio/export");//check pin
+
+	gpio_register_set_func_0(READ_GPIO_NUM);
+	gpio_register_set_direction(READ_GPIO_NUM, 1);	//输出
+
+	usleep(500);
+/*
+     GPIO22默认是上拉,如果改成GPIO输入模式,其PIN脚电压是高电平,必须改成下拉后GPIO22才处于低电平状态,否则测试PIN拉低失败
+*/
+	gpio_register_set_direction(READ_GPIO_NUM, MBTK_GPIO_INPUT);	//设置输入模式
+	gpio_register_write(GPIO_FUNC_GPIO_22,0xb040);  //PULL DOWN
+
+
+    gpio_test_set_group_pin_to_low(p_gnss_gpio,gnss_gpio_group_total_pin); //set all gnss reserver pin to low
+
+
+	/* [1 all gpio set to low] */
+    for(j = 0; j < 6 ; j++){
+         gpio_test_set_group_pin_to_low(p_test_gpio,test_gpio_group_total_pin);
+
+		for(i = 0; i <= 5; i++){
+			ret = gpio_register_get_value(READ_GPIO_NUM);
+			if(0 == ret){
+				break;
+			}
+			usleep(3000);
+		}
+
+		if(0 == ret){
+			break;
+		}
+	}
+
+	if(0 != ret){
+		printf("[GPIOTEST]set all low Fail, please retest\n");
+		return -1;
+	}
+	printf("[GPIOTEST]pre set SUCCESS\n");
+	return 0;
+}
+
+int gpio_test(void* arg,int index,mbtk_gpio_test_pin_and_gpio *p_pin_group_array,int total)
+{
+	int ret,i;
+	int *fail_io = (int *)arg;
+	int failed_num = index;
+	int gpio_num = 0;
+	int pin_num = 0;
+    bool falied_flag = FALSE;
+
+	for(i = 0; i < total; i++){
+        gpio_num = p_pin_group_array[i].gpio_num;
+		pin_num = p_pin_group_array[i].pin_num;
+		falied_flag = FALSE;
+
+#if DEBUG_GPIO_TEST
+		ret = gpio_register_get_value(gpio_num);
+		printf("[GPIOTEST]pin_num%d default value= %d\n", pin_num, ret);
+#endif
+
+		//set high
+		gpio_register_set_value(gpio_num, 1);
+
+#if DEBUG_GPIO_TEST
+		ret = gpio_register_get_value(gpio_num);
+		printf("[GPIOTEST]pin_num%d set high= %d\n", pin_num, ret);
+#endif
+		//get
+		ret = gpio_register_get_value(READ_GPIO_NUM);
+		if(1 != ret){
+            printf("[GPIOTEST]pin%d test high failed\n", pin_num);
+            falied_flag = TRUE;
+        }else{
+            printf("[GPIOTEST]pin[%d] test high success\n", pin_num);
+        }
+
+		//set low
+	    gpio_register_set_value(gpio_num, 0);
+#if DEBUG_GPIO_TEST
+		ret = gpio_register_get_value(gpio_num);
+		printf("[GPIOTEST]pin_num%d set low= %d\n", pin_num, ret);
+#endif
+		//get
+		ret = gpio_register_get_value(READ_GPIO_NUM);
+		if(0 != ret){
+            printf("[GPIOTEST]pin_num%d test low failed\n", pin_num);
+			falied_flag = TRUE;
+
+        }else{
+            printf("[GPIOTEST]pin_num%d test low success\n", pin_num);
+        }
+
+		if(falied_flag)
+		{
+            fail_io[failed_num] = p_pin_group_array[i].pin_num;
+#if DEBUG_GPIO_TEST
+		 printf("[GPIOTEST]NO.%d pin_num%d failed %d\n",i,pin_num, failed_num);
+#endif
+			failed_num++;
+		}
+	}
+	return failed_num;
+}
+
+
+int mbtk_at_gpio(bool gnss_support,void* arg)
+{
+	int n = 0;
+	mbtk_gpio_test_pin_and_gpio test_gpio[] =
+	{
+		//{GPIO , PIN}
+		{0,100}, //RMII_RX-DV
+		{1,101}, //RMII_RXD0
+		{2,102},//RMII_RXD1
+		{3,103},//RMII_CLK
+		{6,104},//RMII_TXD0
+		{7,105},//RMII_TXD1
+		{15,106},//RMII_TX_EN
+		{16,109},//RMII_MDC
+		{17,110},//RMII_MDIO
+		{18,107},//RMII_INT
+		{99,16},//USB_ID
+		{34,9}, //SPI0_CS
+		{36,8},//SPI0_TXD
+		{35,7},//SPI0_RXD
+		{33,6},//SPI0_CLK
+		{14,51}, //NET_LIGHT
+		{13,49}, //STATUS LED
+		{12,50},//WAKE_IN
+		{49,55}, //I2C SCL
+		{50,56}, //I2C SDA
+		{19,53}, //USIM_DET
+		{43,48}, //SD_DET
+		{118,52}, //WAKE OUT
+		{120,54}, //FLIGHT MODE
+
+
+		{20,45}, //NORMAL GPIO
+		{59,122},  //SDIO_CLK
+		{56,117}, //SDIO_DATA1
+		{55,118},//SDIO_DATA2
+		{58,119},//SDIO_CMD
+		{48,120},//SDIO_DATA3
+		{57,121},//SDIO_DATA0
+		{5,84}, //NORMAL GPIO
+		{4,30},//NORMAL GPIO
+		{21,28}, //NORMAL GPIO
+		{23,69}, //UART_RING
+		{24,70}, //UART_DCD
+		{27,73}, //PCM_OUT
+		{28,74}, //PCM_IN
+		{26,75}, //PCM_SYNC
+		{25,76}, //PCM_CLK
+
+		{126,112},//NORMAL GPIO or pwm3
+		{117,123},	//PWM
+		{125,116}, //CLK_REQ
+
+		//{54,114}, //debug uart2, no need be tested
+		//{53,115}, //debug uart2, no need be tested
+
+	};
+
+	mbtk_gpio_test_pin_and_gpio GNSS_test_gpio[] = {
+		{54,114}, //GPS UTXD, UART1_TXD,L508LAN+L508CN(D)+L508EN+L508LEN+L508TLCN NOT CONNECTED
+		{53,115}, //GPS URXD,UART1-RXD,L508LAN+L508CN(D)+L508EN+L508LEN+L508TLCN NOT CONNECTED
+		{32,66}, //PIN66,host wake GPS, RTS, L508TLCN_V2+L508LEN_V2+L508EN_V2 NOT CONNECTED
+		{31,67}, //PIN67,GPS wake Host,CTS, L508TLCN_V2+L508LEN_V2+L508EN_V2 NOT CONNECTED
+		{123,42},//GPS_EN, L508TLCN_V2+L508LEN_V2+L508EN_V2 NOT CONNECTED
+		{122,35},  //32K OUT, L508TLCN_V2+L508LEN_V2+L508EN_V2 not connected
+	};
+	p_gnss_gpio = GNSS_test_gpio;
+	gnss_gpio_group_total_pin = (sizeof(GNSS_test_gpio)/sizeof(GNSS_test_gpio[0]));
+
+    p_test_gpio = test_gpio;
+	test_gpio_group_total_pin = (sizeof(test_gpio)/sizeof(test_gpio[0]));
+
+   if(!gnss_support)
+       n = test_gpio_group_total_pin+gnss_gpio_group_total_pin;
+    else
+       n = test_gpio_group_total_pin;
+
+	printf("[init] L508 XX GPIOTEST v1.3 total pin=%d\n",n);
+
+	n = gpio_test_init();
+	if(-1 == n)
+	{
+		goto gpiotest_finished;
+	}
+    n = 0;
+
+	n = gpio_test(arg,0,p_test_gpio,test_gpio_group_total_pin);
+
+   //if the module has gnss chip, don't test the gnss's pins
+    if(!gnss_support)
+	{
+    	n = gpio_test(arg,n,p_gnss_gpio,gnss_gpio_group_total_pin);
+	}
+
+gpiotest_finished:
+	system("echo 53 > /sys/class/gpio/unexport"); //unexport gnss uart rx
+	system("echo 54 > /sys/class/gpio/unexport");//unexportgnss uart tx
+	system("echo 22 > /sys/class/gpio/unexport");//unexportcheck pin
+
+	printf("\n[GPIOTEST] Finished %d!!\n\n",n);
+	return n;
+}
+
+
+
+#elif defined(MBTK_PROJECT_L509)
+//测低
+static uint16 mbtk_gpio_test_all_low(mbtk_gpio_paired_info_struct *pin_array, uint16 MAX_pin_num)
+{
+    uint16 index = 0;
+    uint16 OUT_pin, Read_pin;
+    uint32 read_high_value;
+    uint32 read_low_value;
+    uint16 fail_num = 0;
+    //int res;
+
+    printf("[GPIOTEST][run test all pin low]\n");
+
+    for(index = 0; index < MAX_pin_num; index++){
+       OUT_pin = pin_array[index].output_gpio;
+       Read_pin = pin_array[index].input_gpio;
+
+       //输出低
+       gpio_register_set_direction(OUT_pin, 1);
+       gpio_register_set_value(OUT_pin, 0);
+
+       //输入脚设为输入
+       gpio_register_set_direction(Read_pin,0);
+   }
+
+    for(index = 0; index < MAX_pin_num; index++){
+        OUT_pin = pin_array[index].output_gpio;
+        Read_pin = pin_array[index].input_gpio;
+        read_low_value = gpio_register_get_value(Read_pin);
+
+        //结果检测
+        if(read_low_value != 0){
+           printf("[GPIOTEST][!Low Failed!]: GPIO%d PIN%d\n", Read_pin, pin_array[index].input_pin);
+           pin_array[index].mbtk_gpio_test_result = 1;
+           fail_num ++;
+        }
+#if DEBUG_GPIO_TEST
+        else{
+			printf("[GPIOTEST][-Low Success-]: GPIO%d \n", Read_pin);
+        }
+#endif
+    }
+    return fail_num;
+}
+
+
+//测高
+static uint16 mbtk_gpio_test_pin_high(mbtk_gpio_paired_info_struct *pin_array, uint16 MAX_pin_num)
+{
+    uint16 index = 0;
+    uint16 OUT_pin, Read_pin;
+    uint32 read_high_value;
+    uint32 read_low_value;
+    uint16 fail_num = 0;
+    int i = 0;
+
+    printf("[GPIOTEST][run test pin high]\n");
+
+    for(index = 0; index < MAX_pin_num; index++){
+        OUT_pin = pin_array[index].output_gpio;
+        Read_pin = pin_array[index].input_gpio;
+
+        //设高
+        gpio_register_set_direction(OUT_pin,1);
+        gpio_register_set_direction(Read_pin,0);
+        gpio_register_set_value(OUT_pin, 1);
+        usleep(10000);
+        read_high_value = gpio_register_get_value(Read_pin);
+#if DEBUG_GPIO_TEST
+        printf("[GPIOTEST][test_high]: PIN%d: get value =%d \n", pin_array[index].input_pin, read_high_value);
+#endif
+
+        //设高后重新设低
+        usleep(10000);
+        gpio_register_set_value(OUT_pin, 0);
+        usleep(10000);
+        for(i = 0; i < 10; i++){
+            read_low_value = gpio_register_get_value(Read_pin);
+            if(0 == read_low_value){
+                break;
+            }
+            usleep(20000);
+        }
+#if DEBUG_GPIO_TEST
+		printf("[GPIOTEST][test_low]: PIN%d: get value =%d  \n", pin_array[index].input_pin, read_low_value);
+#endif
+		if(read_high_value != 1 || read_low_value != 0){
+			printf("[GPIOTEST][!High Failed!]: Gpio%d PIN%d\n", Read_pin,pin_array[index].input_pin);
+			pin_array[index].mbtk_gpio_test_result = 2;
+			fail_num ++;
+        }
+#if DEBUG_GPIO_TEST
+        else{
+            printf("[GPIOTEST][-High Success-]: Gpio%d \n", Read_pin);
+		}
+#endif
+    }
+	return fail_num;
+}
+
+
+static void gpio_test_init_test_gpio_mode(mbtk_gpio_paired_info_struct pin_array[], int MAX_pin_num)
+{
+	int index = 0;
+	int OUT_pin, Read_pin;
+
+	printf("[GPIOTEST] L509 GPIOTEST v2.2 --init\n");
+
+	gpio_register_set_func_0(125);
+	gpio_register_set_direction(125, 1);
+	gpio_register_set_value(125, 1);			//RS2299开关的使能脚
+
+	system("i2cset -y -f 2 0x31 0x12 0x46");	//使能0x12地址的VLDO, 某组GPIO的供电
+
+	gpio_register_write(GPIO_FUNC_GPIO_53, 0xb040);  //GPIO53 DTR set PULL DOWN
+
+	for(index = 0; index < MAX_pin_num; index++){
+		OUT_pin = pin_array[index].output_gpio;
+		Read_pin = pin_array[index].input_gpio;
+		pin_array[index].mbtk_gpio_test_result = 0;	 //init as passed
+		gpio_register_set_func_0(OUT_pin);
+		gpio_register_set_func_0(Read_pin);
+		gpio_register_set_value(OUT_pin, 0);
+	}
+
+#if DEBUG_GPIO_TEST
+	printf("[GPIOTEST]gpio_test_init_test_gpio_mode FINISH\n");
+#endif
+
+}
+
+
+int mbtk_at_gpio(bool gnss_support, void* arg)
+{
+	int i, num;
+	int *fail_io = (int *)arg;
+	/*OPEN SWITCH */
+	uint16 test_fail_count = 0;
+	uint16 test_MAX_pin_num = 0;
+	char buf[STR_MAX_LEN];
+	//uint16 str_len = 0;
+	uint16 temp_len =0;
+	uint16 Out_pin;
+	uint16 in_pin;
+	//uint16 fail_print_num = 0;
+
+	mbtk_gpio_paired_info_struct  test_pin_array[] ={
+        //output_pin, output_gpio,    input_gpio, input_pin,    test_result
+        {122, 16,	 	   17,  121,         0},		/* RGMII/RMII_MD_CLK	<---SW RS2299--->		RGMII/RMII_MD_IO	*/
+
+        {78,  7,           2,   73, 	     0},		/* RGMII/RMII_TX_1		<---SW RS2299--->		RGMII/RMII_RXD1		*/
+        {77,  6,           1,   76,          0}, 	    /* RGMII/RMII_TXD0		<---SW RS2299--->		RGMII/RMII_RXD0		*/
+        {81,  15,          3,   75, 	     0},		/* RGMII/RMII_TX_EN		<---SW RS2299--->		RGMII/RMII_CLK		*/
+        {74,  0,           18,  120,	     0},		/* RGMII/RMII_RX_DV		<---SW RS2299--->		RGMII/RMII_INT		*/
+
+        {1,   117,         120, 2,	         0}, 	    /* WAKEUP_IN			<---SW RS2299--->		AP_READY			*/
+        {4,   118,         19,  13,	         0},		/* FLIGHTMODE			<---SW RS2299--->		USIM_CD				*/
+        {5,   123,         126, 6,           0},		/* NET_MODE				<---SW RS2299--->		NET_STATUS			*/
+        {23,  43,          23,  62, 	     0},		/* MMC1_CD				<---SW RS2299--->		UART_RI				*/
+
+        {79,  4,           5,   82, 	     0},		/* RGMII_RX_2			<---SW RS2299--->		RGMII_RX_3			*/
+        {80,  13,          14,  84, 	     0},		/* RGMII_TX_2			<---SW RS2299--->		RGMII_TX_3			*/
+        {129, 48,          55,  130,	     0},		/* WLAN_DAT3			<---SW RS2299--->		WLAN_DAT2			*/
+        {131, 56,          57,  132,	     0},		/* WLAN_DAT1			<---SW RS2299--->		WLAN_DAT0			*/
+
+        {24,  28,          27,  25,          0},		/* PCM_IN				<---SW RS2299--->		PCM_OUT				*/
+        {26,  26,          25,  27, 	     0},		/* PCM_SYNC				<---SW RS2299--->		PCM_CLK				*/
+        {37,  34,          33,  40, 	     0}, 	    /* SPI_CS				<---SW RS2299--->		SPI_CLK				*/
+        {38,  36,          35,  39, 	     0},		/* SPI_DOUT				<---SW RS2299--->		SPI_DIN				*/
+
+        {133, 59,          58,  134,	     0},		/* WLAN_CLK/PCIE_RSTN	<---SW RS2299--->		WLAN_CMD/PCIE_WK	*/
+        {135, 21,          99,  139,	     0},		/* WLAN_WAKE_HOST		<---SW RS2299--->		USB_ID				*/
+        {119, 20,          22,  136,	     0}, 	    /* RGMII/RMII_RST_N		<---SW RS2299--->		WLAN_EN				*/
+        {83,  12,          122, 118,	     0},        /* RGMII_CLK_TX			<---SW RS2299--->		WLAN_SLP_CLK		*/
+
+        {41,  49,          50,  42, 	     0},		/* I2C_SCL				<---SW RS2299--->		I2C_SDA				*/
+        {143, 10,          11,  144,	     0},		/* GRFC1				<---SW RS2299--->		GRFC2				*/
+        {64,  32,          31,  65, 	     0},		/* UART_CTS				<---SW RS2299--->		UART_RTS			*/
+        {63,  54,          53,  66, 	     0},        /* UART_DCD				<---SW RS2299--->		UART_DTR			*/
+    };
+
+
+	/* [1]初始化待测GPIO */
+	test_MAX_pin_num = sizeof(test_pin_array) / sizeof(test_pin_array[0]);
+    if(gnss_support){    //TODO: When the hardware does not have GNSS, do not test GPIO53, 54
+                          //bad implement, need modify
+        test_MAX_pin_num = test_MAX_pin_num - 1;
+    }
+	gpio_test_init_test_gpio_mode(test_pin_array, test_MAX_pin_num);
+
+
+	/* [2]测试过程 */
+	test_fail_count = mbtk_gpio_test_all_low(test_pin_array, test_MAX_pin_num);
+
+	if(!test_fail_count){ //set all pin to low success
+		printf("[GPIOTEST]set all pin to low: success\n");
+		test_fail_count = mbtk_gpio_test_pin_high(&test_pin_array, test_MAX_pin_num);
+	}
+	else{
+		printf("[GPIOTEST]set all pin low: failed num=%d!!!\n", test_fail_count);
+	}
+
+
+	//memset(buf,0,STR_MAX_LEN);
+	/* [3]测试结果检测与上报 */
+	if(test_fail_count ){
+		//printf( "GPIOTEST Fail %02d PINs:\n", test_fail_count*2);
+		sprintf(buf, "GPIOTEST Fail %02d PINs:", test_fail_count * 2);
+		temp_len = strlen(buf);
+
+		num = 0;
+		for(i = 0; i < test_MAX_pin_num; i++){
+			if(test_pin_array[i].mbtk_gpio_test_result){
+				Out_pin = test_pin_array[i].output_pin;
+				in_pin = test_pin_array[i].input_pin;
+				fail_io[num++] = Out_pin;
+				fail_io[num++] = in_pin;
+			}
+		}
+	}
+
+	else{
+		printf(buf, "ALL GPIO TEST PASS\r\n");
+	}
+
+    printf("\n[GPIOTEST] Finished !!\n\n");
+	return  test_fail_count * 2;
+}
+
+
+#elif defined(MBTK_PROJECT_L508_X6)
+int gpio_register_test_out_0(int port)
+{
+    int ret;
+    int i;
+    int valueh = 0;
+    int valuel = 1;
+
+    //printf("Gpio port [%d] test start!\n", port);
+    ret = gpio_register_set_func_0(port);           //设功能为GPIO
+    if(ret){
+        printf("gpio_port can't support!\n");
+        return -1;
+    }
+    gpio_register_set_direction(port, 1);           //设方向为输出
+    //ret = gpio_register_get_value(port);
+    //printf("gpio default value is : %d.\n", ret);
+
+
+    //[High]
+    for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port, 1);
+        usleep(50);
+        valueh = gpio_register_get_value(port);
+        //printf("set high? %d\n",valueh);
+        if(1 == valueh){
+            break;
+        }
+    }
+    usleep(5000);
+    for(i = 0; i <= 10; i++){
+        ret = mbtk_gpio_adc(0);
+        usleep(3000);
+        if(1 == ret){
+            break;
+        }
+    }
+	//printf("******gpio should is high: %d.******\n", ret);
+    if(1 != ret){
+        ret=-1;
+        goto exit;
+    }
+
+
+
+    //[Low]
+     usleep(200);
+     for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port, 0);               //输出低
+        usleep(50);
+        valuel = gpio_register_get_value(port);
+        //printf("set low? %d\n",valuel);
+        if(0 == valuel){
+            break;
+        }
+    }
+    usleep(5000);
+    for(i = 0; i <= 10; i++){
+        ret = mbtk_gpio_adc(0);
+        usleep(3000);
+        if(0 == ret){
+            break;
+        }
+    }
+    printf("******gpio should is low: %d.******\n", ret);
+    if(0 != ret){
+        ret=-1;
+        goto exit;
+    }
+
+exit:
+	gpio_register_set_value(port, 0);
+    //gpio_register_set_direction(port, 0);  //设方向为输入
+    return ret;
+}
+
+int gpio_register_test_out_1(int port)
+{
+    int ret;
+    int i;
+    int valueh = 0;
+    int valuel = 1;
+
+    //printf("Gpio port [%d] test start!\n", port);
+    ret = gpio_register_set_func_0(port);           //设功能为GPIO
+    if(ret){
+        printf("gpio_port can't support!\n");
+        return -1;
+    }
+    gpio_register_set_direction(port, 1);           //设方向为输出
+    //ret = gpio_register_get_value(port);
+    //printf("gpio default value is : %d.\n", ret);
+
+
+    //[High]
+    for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port, 1);
+        usleep(50);
+        valueh = gpio_register_get_value(port);
+        //printf("set high? %d\n",valueh);
+        if(1 == valueh){
+            break;
+        }
+    }
+    usleep(5000);
+    for(i = 0; i <= 10; i++){
+        ret = mbtk_gpio_adc(1);
+        usleep(3000);
+        if(1 == ret){
+            break;
+        }
+    }
+    if(1 != ret){
+        ret=-1;
+        goto exit;
+    }
+    //printf("******gpio should is high: %d.******\n", ret);
+
+
+    //[Low]
+     usleep(200);
+     for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port, 0);               //输出低
+        usleep(50);
+        valuel = gpio_register_get_value(port);
+        //printf("set low? %d\n",valuel);
+        if(0 == valuel){
+            break;
+        }
+    }
+    usleep(10000);
+    for(i = 0; i <= 10; i++){
+        ret = mbtk_gpio_adc(1);
+        usleep(3000);
+        if(0 == ret){
+            break;
+        }
+    }
+    //printf("******gpio should is low: %d.******\n", ret);
+    if(0 != ret){
+        ret=-1;
+        goto exit;
+    }
+
+exit:
+    gpio_register_set_value(port, 0);
+    //error: no need set direction in gpio_register_set_direction(port, 0);
+    return ret;
+}
+
+
+int gpio_register_test_out_2(int port_in, int port_out)
+{
+    int ret_in;
+	int ret_out;
+    int i;
+    int valueh = 0;
+    int valuel = 1;
+
+    //printf("Gpio port [%d] test start!\n", port_out);
+    ret_in = gpio_register_set_func_0(port_in);           //设功能为GPIO
+	ret_out = gpio_register_set_func_0(port_out);
+    if((ret_in+ret_out)){
+        printf("gpio_port can't support!\n");
+        return -1;
+    }
+    gpio_register_set_direction(port_out, 1);           //设方向为输出
+	gpio_register_set_direction(port_in, 0);           //设方向为输入
+    //ret_in = gpio_register_get_value(port_in);
+    //printf("gpio default value is : %d.\n", ret_in);
+
+
+    //[High]
+    for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port_out, 1);
+        usleep(50);
+        valueh = gpio_register_get_value(port_out);
+        //printf("set high? %d\n",valueh);
+        if(1 == valueh){
+            break;
+        }
+    }
+
+	usleep(5000);
+    for(i = 0; i <= 10; i++){
+       ret_in = gpio_register_get_value(port_in);
+        usleep(3000);
+        if(1 == ret_in){
+            break;
+        }
+    }
+    if(1 != ret_in){
+        ret_in=-1;
+		printf("get high failed! \n");
+        goto exit;
+    }
+    //printf("******gpio should is high: %d.******\n", ret_in);
+
+
+    //[Low]
+     usleep(200);
+     for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port_out, 0);               //输出低
+        usleep(50);
+        valuel = gpio_register_get_value(port_out);
+        //printf("set low? %d\n",valuel);
+        if(0 == valuel){
+            break;
+        }
+    }
+
+	usleep(5000);
+    for(i = 0; i <= 10; i++){
+        ret_in = gpio_register_get_value(port_in);
+        usleep(3000);
+        if(0 == ret_in){
+            break;
+        }
+    }
+    //printf("******gpio should is low: %d.******\n", ret_in);
+    if(0 != ret_in){
+        ret_in=-1;
+		printf("get low failed! \n");
+        goto exit;
+    }
+
+exit:
+    gpio_register_set_value(port_out, 0);
+    //gpio_register_set_direction(port_out, 0);
+    return ret_in;
+}
+
+
+static int gpio_test_init_test_gpio_mode(void )
+{
+	const int test_gpio_1[] = {
+		40, 33, 34, 39, 99, 10, 11, 88, 87, 86, 85, 84, 89,
+		56, 55, 58, 57, 48, 59, 10, 90, 20, 53, 19, 46, 127,
+		49, 50, 32, 31, 6, 7
+	};
+
+	const int test_gpio_0[] = {
+		8, 27, 28, 26, 25, 15, 1, 3, 0,
+		37, 38,35, 36, 42, 41, 21, 22, 24, 23,
+		54, 125, 18, 13, 14, 17, 16, 5, 4, 2, 12,
+		43, 44, 45, 47, 117, 119
+	};
+    int i, j, ret_0, ret_1, total_1, total_0, n = 0;
+    total_0 = (sizeof(test_gpio_0)/sizeof(int));
+    total_1 = (sizeof(test_gpio_1)/sizeof(int));
+
+	//system("at at+gpsinit=0");
+	system("i2cset -y -f 2 0x32 0x0d 0x00");
+	system("i2cset -y -f 2 0x31 0x18 0x8f");
+	usleep(10000);
+
+       //printf("[init]gpio_test_init_test_gpio_mode FINISH\n");
+		/* [1 all gpio set to low] */
+    for(j = 0; j < 6 ; j++){
+        for(i = 0; i < total_0; i++){
+            gpio_register_set_func_0(test_gpio_0[i]);
+            gpio_register_set_direction(test_gpio_0[i], 1);
+            gpio_register_set_value(test_gpio_0[i], 0);
+        }
+        for(i = 0; i < total_1; i++){
+            gpio_register_set_func_0(test_gpio_1[i]);
+            gpio_register_set_direction(test_gpio_1[i], 1);
+            gpio_register_set_value(test_gpio_1[i], 0);
+        }
+
+        usleep(50000);
+        for(i = 0; i <= 10; i++){
+            ret_0 = mbtk_gpio_adc(0);
+            usleep(3000);
+            ret_1 = mbtk_gpio_adc(1);
+
+            if(ret_0 ==0  && ret_1 == 0){
+                break;
+            }
+        }
+        printf("pre set ADC0: %d, ADC1: %d, times: %d\n", ret_0, ret_1, j);
+        if(ret_0 ==0  && ret_1 == 0){
+            break;
+        }
+    }
+	if(!(ret_0 ==0  && ret_1 == 0)){
+
+		printf("Fail, please retest");
+		return -1;
+	}
+	gpio_register_set_value(119, 1);
+	gpio_register_set_value(117, 1);
+    return 0;
+}
+
+int mbtk_at_gpio(bool gnss_support, void* arg)
+{
+	const int test_gpio_0[] = {
+		35, 93,
+		36, 94,
+		42, 97,
+		41, 98,
+		21, 100,
+		22, 101,
+		24, 102,
+		23, 103,
+		54, 107,
+		125, 108,
+		18, 109,
+		13, 114,
+		14, 115,
+		17, 116,
+		16, 117,
+		5, 119,
+		4, 127,
+		2, 120,
+		12, 126,
+		0, 90,
+		27, 73,
+		28, 74,
+		26, 75,
+		25, 76,
+		15, 86,
+		1, 88,
+		3, 89,
+		37, 91,
+		38, 92,
+		8, 72
+	};
+
+    const int test_gpio_1[] = {
+		40,	6,
+		33, 7,
+		34, 8,
+		39, 9,
+		99, 16,
+		56, 27,
+		58, 29,
+		55, 28,
+		57, 30,
+		48, 31,
+		59, 32,
+		20, 49,
+		53, 50,
+		19, 51,
+		49, 55,
+		50, 56,
+		32, 66,
+		31, 67,
+		6, 68,
+		11, 83,
+		10, 84,
+		7, 69,
+		90, 48,
+		46, 52,
+		127, 54,
+		88, 21,
+		87, 22,
+		86, 23,
+		85, 24,
+		84, 25,
+		89, 26,
+	};
+
+	const int test_gpio_2[] = {		//GPS组
+		43, 53,
+		47, 95,
+		45, 71,
+		44, 70,
+	};
+
+    int i, j, ret_0, ret_1, ret_2, total_1, total_0, total_2, n = 0;
+    int *fail_io = (int *)arg;
+    total_0 = (sizeof(test_gpio_0)/sizeof(int));	//GPIO+PIN
+    total_1 = (sizeof(test_gpio_1)/sizeof(int));
+	total_2 = (sizeof(test_gpio_2)/sizeof(int));
+	if(gnss_support == 1){
+		total_2 = total_2 - 4;
+	}
+    printf("L508-X6 Start test gpio V1.1\n");
+    /* [1 all gpio Init] */
+    gpio_test_init_test_gpio_mode();
+
+
+    /* [2 GPIOTEST] */
+	//Test 0
+	for(i = 0; i < total_0; i=i+2){
+        ret_0 = gpio_register_test_out_0(test_gpio_0[i]);
+        if(-1 == ret_0){
+            printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio_0[i]);
+            fail_io[n] = test_gpio_0[i+1];
+            n++;
+        }else{
+            //printf("############gpio [%d] test success############\n", test_gpio_0[i]);
+        }
+    }
+
+	//Test 1
+    for(i = 0; i < total_1; i=i+2){
+        ret_1 = gpio_register_test_out_1(test_gpio_1[i]);
+        if(-1 == ret_1){
+            printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio_1[i]);
+            fail_io[n] = test_gpio_1[i+1];
+            n++;
+        }else{
+            //printf("############gpio [%d] test success############\n", test_gpio_1[i]);
+        }
+    }
+
+	//Test 2
+    for(i = 0; i < total_2; i=i+4){
+        ret_2 = gpio_register_test_out_2(test_gpio_2[i], test_gpio_2[i+2]);
+        if(-1 == ret_2){
+            printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio_2[i+2]);
+            fail_io[n] = test_gpio_2[i+3];
+            n++;
+        }else{
+            //printf("############gpio [%d] test success############\n", test_gpio_2[i+2]);
+        }
+    }
+
+    mbtk_adc_close();
+    return n;
+}
+
+#elif 0//(MBTK_PROJECT_T108)
+int gpio_register_test_out(int port, int value)
+{
+    int ret;
+    int i;
+    int valueh = 0;
+    int valuel = 1;
+
+    //printf("Gpio port [%d] test start!\n", port);
+    ret = gpio_register_set_func_0(port);           //设功能为GPIO
+    if(ret){
+        printf("gpio_port can't support!\n");
+        return -1;
+    }
+    gpio_register_set_direction(port, 1);           //设方向为输出
+    //ret = gpio_register_get_value(port);
+    //printf("gpio default value is: %d\n", ret);
+
+
+    //[High]
+    for(i = 0; i <= 9; i++){
+        gpio_register_set_value(port, 1);
+        usleep(50);
+        //valueh = gpio_register_get_value(port);
+        //printf("set high? %d\n", valueh);
+        if(1 == valueh){
+            break;
+        }
+    }
+
+    for(i = 0; i <= 35; i++){
+        ret = gpio_register_get_value(118);
+        if(1 == ret){
+            break;
+        }
+		usleep(3000);
+    }
+	printf("******gpio should is high: %d.******\n", ret);
+    if(1 != ret){
+        ret=-1;
+        goto exit;
+    }
+
+    //[Low]
+	usleep(200);
+	for(i = 0; i <= 9; i++){
+		gpio_register_set_value(port, 0);               //输出低
+		usleep(50);
+		//valuel = gpio_register_get_value(port);
+		//printf("set low? %d\n", valuel);
+		if(0 == valuel){
+			break;
+		}
+	}
+
+    for(i = 0; i <= 35; i++){
+        ret = gpio_register_get_value(118);
+        if(0 == ret){
+            break;
+        }
+        usleep(3000);
+    }
+    //printf("******gpio should is low: %d.******\n", ret);
+    if(0 != ret){
+        ret=-1;
+        goto exit;
+    }
+
+exit:
+	gpio_register_set_value(port, 0);
+    gpio_register_set_direction(port, 0);  //设方向为输入
+    return ret;
+}
+
+int gpio_test_init_test_gpio_mode(void)
+{
+    const int test_gpio[] = {
+		99,
+		117,
+		21,22,23,24,44,41,120,
+		8,127,46,59,58,57,56,55,48,19,34,33,35,36,49,
+		50,25,28,26,122,20,10,11,
+		39,40,37,38,
+		51,52,31,32,
+	};
+
+    int i, j, ret, total, n = 0;
+    total = (sizeof(test_gpio)/sizeof(int));
+    printf("[init]gpio_test_init_test_gpio_mode BEGIN\n");
+
+	/* [1 all gpio set to low] */
+	gpio_register_set_func_0(118);
+	gpio_register_set_direction(118, 0);
+	system("echo in  > /sys/class/gpio/gpio118/direction");
+
+    for(j = 0; j < 6 ; j++){
+        for(i = 0; i < total; i++){
+            gpio_register_set_func_0(test_gpio[i]);
+            gpio_register_set_direction(test_gpio[i], 1);
+            gpio_register_set_value(test_gpio[i], 0);
+			//ret = gpio_register_get_value(test_gpio[i]);
+			//printf("[init]get gpio%d=%d\n", test_gpio[i], ret);
+        }
+
+		for(i = 0; i <= 35; i++){
+		  ret = gpio_register_get_value(118);
+		  printf("[init]get gpi118=%d\n", ret);
+		  usleep(3000);
+		  if(0 == (ret)){
+			  break;
+		  }
+		}
+
+		printf("pre set ADC: %d, times: %d\n",(ret), j);
+		if(0 == (ret)){
+		  break;
+		}
+    }
+	if(0 != (ret)){
+		printf("!!!Set all low FAIL, please retest\n");
+		return -1;
+	}
+	return 0;
+}
+
+int mbtk_at_gpio(bool gnss_support, void* arg)
+{
+
+    const int test_gpio[] = {
+	  //GPIO	PIN		GPIO	PIN		GPIO	PIN		GPIO	PIN
+		99,		170,	117,	59,		21,		61,		22,		62,
+		23,		144,	24,		147,	44,		5,		41,		159,
+		120,	143,	8,		171,	127,	160,	46,		149,
+		59,		19,		58,		18,		57,		20,		56,		21,
+		55,		22,		48,		23,		19,		3,		34,		79,
+		33,		80,		35,		78,		36,		77,		49,		43,
+		50,		42,		25,		67,		28,		66,		26,		65,
+		122,	169,	20,		152,	10,		74,		11,		73,
+		39,		166,	40,		164,	37,		165,	38,		163,
+		51,		58,		52,		60,		31,		57,		32,		56,
+	};
+
+    int i, n = 0, ret, total;
+    int *fail_io = (int *)arg;
+	int try_count = 0;
+    total = (sizeof(test_gpio)/sizeof(int));
+	printf("T108 Start test gpio V1.0, total gpio=%d\n", (total/2));
+
+	for(try_count; try_count < 4; try_count++){
+	    n = 0;
+	    /* [1 all gpio Init] */
+	    gpio_test_init_test_gpio_mode();
+
+	    /* [2 GPIOTEST] */
+		for(i = 0; i < total; i = i + 2){
+	        ret = gpio_register_test_out(test_gpio[i], 0);
+	        if(-1 == ret){
+				n++;
+	            printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio[i]);
+				if(try_count != 3){
+					printf(" ---TEST FAILED! RETRY!--- \n");
+        			usleep(5000);
+					break;
+				}
+	            fail_io[n - 1] = test_gpio[i+1];
+	        }else{
+	            //printf("############gpio [%d] test success############\n", test_gpio[i]);
+	        }
+	    }
+	    if(0 == n){
+	    	break;
+		}
+    }
+    return n;
+}
+
+
+#elif (MBTK_PROJECT_T108)
+static int gpio_test(int port)
+{
+    int ret;
+    int i;
+    int valueh = 0;
+    int valuel = 1;
+
+    //printf("Gpio port [%d] test start!\n", port);
+    ret = gpio_register_set_func_0(port);
+    if(ret){
+        printf("gpio_port can't support!\n");
+        return -1;
+    }
+    gpio_register_set_direction(port, 1);
+    //ret = gpio_register_get_value(port);
+    //printf("gpio default value is: %d\n", ret);
+
+
+    //[High]
+    for(i = 0; i <= 5; i++){
+        gpio_register_set_value(port, 1);
+        usleep(50);
+        //valueh = gpio_register_get_value(port);
+        //printf("set high? %d\n", valueh);
+        if(1 == valueh){
+            break;
+        }
+    }
+
+    for(i = 0; i <= 5; i++){
+        ret = gpio_register_get_value(118);
+        if(1 == ret){
+
+            break;
+        }
+		usleep(3000);
+    }
+    //printf("count=%d \n", i);
+  	//printf("******gpio should is high: %d.******\n", ret);
+    if(1 != ret){
+        ret=-1;
+        goto exit;
+    }
+
+    //[Low]
+	usleep(200);
+	for(i = 0; i <= 9; i++){
+		gpio_register_set_value(port, 0);
+		usleep(50);
+		//valuel = gpio_register_get_value(port);
+		//printf("set low? %d\n", valuel);
+		if(0 == valuel){
+			break;
+		}
+	}
+
+    for(i = 0; i <= 5; i++){
+        ret = gpio_register_get_value(118);
+        if(0 == ret){
+
+            break;
+        }
+        usleep(3000);
+    }
+    //printf("count=%d \n", i);
+    //printf("******gpio should is low: %d.******\n", ret);
+    if(0 != ret){
+        ret=-1;
+        goto exit;
+    }
+
+exit:
+    gpio_register_set_value(port, 0);
+    gpio_register_set_direction(port, 0);
+    return ret;
+
+}
+
+static int gpio_test_init_test_gpio_mode(void)
+{
+	const int test_gpio[] = {
+      99,8,117,21,22,23,24,41,120,19,123,
+      58,59,57,56,55,48,125,127,36,35,34,
+      33,54,47,53,46,50,49,11,10,26,28,25,
+      27,32,31,51,52,39,40,37,38,
+      44,45
+	};
+
+    int i, j, ret, total, n = 0;
+    total = (sizeof(test_gpio)/sizeof(int));
+    //printf("[init]gpio_test_init_test_gpio_mode BEGIN\n");
+
+	/* [1 all gpio set to low] */
+	gpio_register_set_func_0(118);
+	gpio_register_set_direction(118, 0);
+
+    for(j = 0; j < 5 ; j++){
+        for(i = 0; i < total; i++){
+            gpio_register_set_func_0(test_gpio[i]);
+            gpio_register_set_direction(test_gpio[i], 1);
+            gpio_register_set_value(test_gpio[i], 0);
+			//ret = gpio_register_get_value(test_gpio[i]);
+			//printf("[init]get gpio%d=%d\n", test_gpio[i], ret);
+        }
+
+
+		for(i = 0; i <= 10; i++){
+		  ret = gpio_register_get_value(118);
+		  //printf("[init]get gpi118=%d\n", ret);
+		  usleep(3000);
+		  if(0 == (ret)){
+			  break;
+		  }
+		}
+
+		//printf("pre set 118: %d, times: %d\n",(ret), j);
+		if(0 == (ret)){
+		  break;
+		}
+    }
+	if(0 != (ret)){
+		printf("!!!Set all low FAIL, please retest\n");
+		return -1;
+	}
+	return 0;
+}
+
+int mbtk_at_gpio(bool gnss_support, void* arg)
+{
+    const int test_gpio[] = {
+	//GPIO	PIN		GPIO	PIN		GPIO	PIN		GPIO	PIN
+	99,		170,	8,		171,	117,	59,		21,		61,
+	22,		62,		23,		144,	24,		147,	41,		159,
+	120,	143,	19,		3,		123,	5,		58,		18,
+	59,		19,		57,		20,		56,		21,		55,		22,
+	48,		23,		125,	149,	127,	160,	36,		77,
+	35,		78,		34,		79,		33,		80,		54,		163,
+	#if 0	//Hard Ware ERROR!
+	47,		164,
+	46,		166,
+	#endif
+	53,		165,	50,		42,		49,		43,		11,		73,
+	10,		74,		26,		65,		28,		66,		25,		67,
+	27,		68,		32,		56,		31,		57,		51,		58,
+	52,		60,		39,		192,	40,		193,	37,		194,
+	38,		195,
+	#if 0	//undefine GNSS
+	44,		161,
+	45,		151,
+	#endif
+	};
+
+    int i, n = 0, ret, total;
+    int *fail_io = (int *)arg;
+    int try_count;
+    total = (sizeof(test_gpio)/sizeof(int));
+	printf("T108 V2 Start test gpio V0.8, total gpio=%d\n", (total/2));
+
+    for(try_count = 0; try_count < 4; try_count++){
+        n = 0;
+        /* [1 all gpio Init] */
+        gpio_test_init_test_gpio_mode();
+
+        /* [2 GPIOTEST] */
+    	for(i = 0; i < total; i = i + 2){
+            ret = gpio_test(test_gpio[i]);
+            if(-1 == ret){
+				n++;
+				printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio[i]);
+				if(try_count != 3){
+					printf(" ---TEST FAILED! RETRY!--- \n");
+        			usleep(5000);
+					break;
+				}
+                fail_io[n - 1] = test_gpio[i + 1];
+            }else{
+                //printf("############gpio [%d] test success############\n", test_gpio[i]);
+            }
+        }
+        if(0 == n){
+			printf(" ---ALL PASS---\n");
+            break;
+        }
+    }
+    return n;
+}
+
+
+#else
+int mbtk_at_gpio(bool gnss_support, void* arg)
+{
+    return -1;
+}
+
+#endif
+
diff --git a/mbtk/mbtk_at/src/factory/mbtk_power.c b/mbtk/mbtk_at/src/factory/mbtk_power.c
new file mode 100755
index 0000000..f823bf8
--- /dev/null
+++ b/mbtk/mbtk_at/src/factory/mbtk_power.c
@@ -0,0 +1,703 @@
+#if 1
+#include <fcntl.h>
+#include <stdint.h>
+#include <libubox/blobmsg_json.h>
+#include <libubus.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/in.h>
+#include <pthread.h>
+#include <sys/epoll.h>
+
+/****************************DEFINE***************************************/
+#define MBTK_POWER_RESULT_FAIL -1
+
+#define MBTK_POWER_CLOSE_FAIL -1
+#define MBTK_POWER_CLOSE_SUCCESS 0
+
+#define GNSS_SOCK_PATH "/tmp/mbtk_gnss_sock"
+void mbtk_log(int level, const char *format, ...);
+
+#define LOG_DEBUG_LEVEL 5
+#define LOG(fmt, args...) mbtk_log(LOG_DEBUG_LEVEL, fmt, ##args)
+#define LOGE LOG
+
+typedef enum{
+    MBTK_POWER_RESULT_SUCCESS = 0,
+    MBTK_POWER_RESULT_GNSS_TIMEOUT,
+    MBTK_POWER_RESULT_GNSS_CLOSE_FAIL,
+    MBTK_POWER_RESULT_NO_SLEEP_NODE,
+    MBTK_POWER_RESULT_UKNOWN_ERROR
+}mbtk_power_result_type;
+
+
+static int sock_listen_fd = -1;
+
+typedef enum {
+    GNSS_CMD_INIT = 0,
+    GNSS_CMD_DEINIT,
+    GNSS_CMD_SETTING,
+    GNSS_CMD_DL
+} gnss_cmd_enum;
+
+
+/****************************DEFINE***************************************/
+
+/****************************VARIABLE***************************************/
+const struct blobmsg_policy mbtk_power_cb_policy1[] = {
+    [0] = {
+        .name = "event",
+        .type = BLOBMSG_TYPE_INT32,
+    },
+};
+/****************************VARIABLE***************************************/
+
+/****************************FUNC***************************************/
+static void mbtk_power_gnss_callback(struct ubus_request *req, int type, struct blob_attr *msg)
+{
+    UNUSED(type);
+
+    struct blob_attr *tb[1];
+    struct blob_attr *cur;
+    unsigned int event;
+    int *ubus_gnss_result = (int *)req->priv;
+    int rc;
+
+    /*parsing blob to be accessed easily with tb array - parse "1" argument*/
+    rc = blobmsg_parse(mbtk_power_cb_policy1, 1, tb, blob_data(msg), blob_len(msg));
+    if (rc < 0)
+    {
+        LOGE("[MBTK_POWER] blobmsg_parse fail.");
+        //printf("blobmsg_parse fail\n");
+        *ubus_gnss_result = MBTK_POWER_CLOSE_FAIL;
+        return;
+    }
+
+    /*parse first parameter*/
+    cur = tb[0];
+    if (!cur)
+    {
+        LOGE("[MBTK_POWER] missing parameter.");
+        //printf("missing parameter\n");
+        *ubus_gnss_result = MBTK_POWER_CLOSE_FAIL;
+        return;
+    }
+
+    event = blobmsg_get_u32(cur);
+    LOGE("[MBTK_POWER] get event = [%d].", event);
+    //printf("get event = [%d].\n", event);
+
+#if 1
+    if(event != 0)
+#else
+    if(event != 7)
+#endif
+    {
+        *ubus_gnss_result = MBTK_POWER_CLOSE_FAIL;
+    }
+
+    return ;
+}
+
+static int mbtk_power_ubus_uloop_init(struct ubus_context **ctx)
+{
+    int ret = -1;
+    if(ctx == NULL)
+    {
+        LOGE("[MBTK_POWER] ctx is NULL");
+        return MBTK_POWER_RESULT_FAIL;
+    }
+
+    ret = uloop_init();
+    if(ret != 0)
+    {
+        LOGE("[MBTK_POWER] uloop_init fail.ret = [%d]", ret);
+        return MBTK_POWER_RESULT_FAIL;
+    }
+
+    if(*ctx != NULL)
+    {
+        LOGE("[MBTK_POWER] mbtk_gnss_ctx not NULL.");
+        return MBTK_POWER_RESULT_FAIL;
+    }
+
+    *ctx = ubus_connect(NULL);
+    if( !(*ctx) )
+    {
+        LOGE("[MBTK_POWER] ubus_connect fail.");
+        return MBTK_POWER_RESULT_FAIL;
+    }
+
+    ubus_add_uloop(*ctx);
+
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+
+static int mbtk_power_ubus_uloop_deinit(struct ubus_context *ctx)
+{
+    if(ctx != NULL)
+    {
+        ubus_free(ctx);
+        ctx = NULL;
+    }
+
+    uloop_done();
+
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+
+static int mbtk_power_invoke_reply_data_cb(const char *service, const char *method, struct blob_attr *msg,
+                         ubus_data_handler_t cb, void *cb_param, int timeout, struct ubus_context *ctx)
+{
+	int rc = -1;
+	uint32_t id;
+	struct ubus_request req;
+
+	/* Look up the target object id by the object path */
+    rc = ubus_lookup_id(ctx, service, &id);
+	if(rc)
+    {
+        LOGE("[MBTK_POWER] ubus_lookup_id fail.rc = [%d]", rc);
+		return MBTK_POWER_RESULT_FAIL;
+    }
+
+	rc = ubus_invoke(ctx, id, method, msg, cb, cb_param, timeout);
+    if(rc)
+    {
+        LOGE("[MBTK_POWER] ubus_invoke fail.rc = [%d]", rc);
+		return MBTK_POWER_RESULT_FAIL;
+    }
+	return MBTK_POWER_RESULT_SUCCESS;
+}
+
+                 //mbtk wyq for AT+MGPSC add start
+
+#if 0//#ifndef MBTK_GNSS_FACTORY_TEST_MODE
+                 if(strncasecmp((char const *)line, "AT+MGPSC=", strlen("AT+MGPSC=")) == 0)
+                 {
+                     int mode,ret = 0;
+                     (void)sscanf((const char *)line, "%*[^0-9]%d", &mode);
+                     if(mode == 1 || mode == 5)
+                     {
+                         if(modem_if.echo_mode == MODEM_ECHO_MODE)
+                         {
+                             writen(ppp_uart2_fd, line, 10);
+                         }
+
+                         ret = mbtk_GPS_process(GNSS_CMD_INIT, &mode);
+
+                         if(-1 == ret)
+                         {
+                             const char RESP_BUFF[] = "\r\n+GPS: gps server timeout.\r\n\r\nERROR\r\n";
+                             writen(ppp_uart2_fd, RESP_BUFF, sizeof(RESP_BUFF) - 1);
+                         }
+                         else
+                         {
+                             const char RESP_BUFF[] = "\r\n+GPS: gps init success\r\n";
+                             writen(ppp_uart2_fd, RESP_BUFF, sizeof(RESP_BUFF) - 1);
+                         }
+                         continue;
+                     }
+                 }
+#endif
+                 //mbtk wyq for AT+MGPSC add end
+
+ static int mbtk_GPS_process(gnss_cmd_enum cmd, void *arg)
+ {
+     if(sock_listen_fd < 0) {
+         sock_listen_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
+         if(sock_listen_fd < 0)
+         {
+             LOGE("[MBTK_POWER]socket() fail[%d].", errno);
+             return -1;
+         }
+
+         struct sockaddr_un cli_addr;
+         memset(&cli_addr, 0, sizeof(cli_addr));
+         cli_addr.sun_family = AF_LOCAL;
+         strcpy(cli_addr.sun_path, GNSS_SOCK_PATH);
+         if(connect(sock_listen_fd, (struct sockaddr *)&cli_addr, sizeof(cli_addr)))
+         {
+             LOGE("[MBTK_POWER]connect() fail[%d].", errno);
+             close(sock_listen_fd);
+             sock_listen_fd = -1;
+             return -1;
+         }
+     }
+
+     char buff[100] = {0};
+     if(cmd == GNSS_CMD_INIT) {
+         if(arg) {
+             sprintf(buff, "gnss_init:%d", *(int*)arg);
+         } else {
+             return -1;
+         }
+     } else if(cmd == GNSS_CMD_DEINIT) {
+         sprintf(buff, "gnss_deinit");
+     } else if(cmd == GNSS_CMD_SETTING) {
+         sprintf(buff, "gnss_setting:%s", arg);
+     } else if(cmd == GNSS_CMD_DL) {
+         sprintf(buff, "gnss_dl:%s", arg);
+     } else {
+         LOGE("[MBTK_POWER]Unknown cmd.");
+         return -1;
+     }
+
+     write(sock_listen_fd, buff, strlen(buff));
+
+     int len = 0;
+     while(1) {
+         memset(buff, 0, sizeof(buff));
+         len = read(sock_listen_fd, buff, sizeof(buff));
+         if(len > 0) {
+             LOGE("[MBTK_POWER]RSP : %s", buff);
+             if(cmd == GNSS_CMD_INIT) {
+                 if(strstr(buff, "gnss_init") != 0) {
+                     return 0;
+                 } else {
+                     LOGE("[MBTK_POWER]gnss_init response error.");
+                     return -1;
+                 }
+             } else if(cmd == GNSS_CMD_DEINIT) {
+                 if(strstr(buff, "gnss_deinit") != 0) {
+                     return 0;
+                 } else {
+                     LOGE("[MBTK_POWER]gnss_deinit response error.");
+                     return -1;
+                 }
+             } else if(cmd == GNSS_CMD_SETTING) {
+                 if(strstr(buff, "gnss_setting") != 0) {
+                     return 0;
+                 } else {
+                     LOGE("[MBTK_POWER]gnss_setting response error.");
+                     return -1;
+                 }
+             } else if(cmd == GNSS_CMD_DL) {
+                 if(strstr(buff, "gnss_dl") != 0) {
+                     return 0;
+                 } else {
+                     LOGE("[MBTK_POWER]gnss_dl response error.");
+                     return -1;
+                 }
+             } else {
+                 LOGE("[MBTK_POWER]Unknown response.\n");
+                 return -1;
+             }
+         } else if(len == 0) {
+             LOGE("[MBTK_POWER]RSP is null.");
+             return -1;
+         } else {
+             LOGE("[MBTK_POWER]read = %d:errno = %d", len, errno);
+         }
+     }
+ }
+
+
+ int mbtk_mgpsc_set(int arg)
+ {
+    int ret = 0;
+    int *p = 3;
+
+    if (arg == 1)
+    {
+        ret = mbtk_GPS_process(GNSS_CMD_INIT, &p);
+
+        if (-1 == ret)
+        {
+            LOGE("[MBTK_POWER] mbtk_mgpsc_set fail.");
+            return -1;
+        }
+    }
+    else
+    {
+        ret = mbtk_GPS_process(GNSS_CMD_DEINIT, NULL);
+
+        if (-1 == ret)
+        {
+            LOGE("[MBTK_POWER] mbtk_mgpsc_set fail.");
+            return -1;
+        }
+    }
+
+    return 0;
+ }
+
+
+
+static int mbtk_power_gnss_close(void)
+{
+    int ret = 0;
+
+    ret = mbtk_GPS_process(GNSS_CMD_DEINIT, NULL);
+
+    if (-1 == ret)
+    {
+        LOGE("[MBTK_POWER] mbtk_power_gnss_close fail.");
+        return MBTK_POWER_CLOSE_FAIL;
+    }
+
+    return MBTK_POWER_CLOSE_SUCCESS;
+}
+
+static int gpio_direct_set(char *value,int gpio)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    file = open(buffer, O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("[MBTK_POWER] Open gpio[%d] direct fail.", gpio);
+        return MBTK_POWER_RESULT_FAIL;
+    }
+
+    result = write(file,value,strlen(value));
+    if(result != strlen(value))
+    {
+        LOGE("[MBTK_POWER] Set gpio[%d] direct fail.", gpio);
+        close(file);
+        return MBTK_POWER_RESULT_FAIL;
+    }
+    close(file);
+
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+
+static int gpio_value_set(int value, int gpio)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
+    file = open(buffer,O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("[MBTK_POWER] Open gpio[%d] value fail.", gpio);
+        return MBTK_POWER_RESULT_FAIL;
+    }
+    if(value == 0) {
+        result = write(file,"0",1);
+    } else {
+        result = write(file,"1",1);
+    }
+    if(result != 1)
+    {
+        LOGE("[MBTK_POWER] Set gpio[%d] value fail.", gpio);
+        close(file);
+        return MBTK_POWER_RESULT_FAIL;
+    }
+    close(file);
+
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+
+//type:0 value 0
+//type:1 value 1
+//type:2 direction "out"
+//type:3 direction "in"
+
+static int one_gpio_export(int gpio, int type)
+{
+    int index=0;
+    int file=-1;
+    int file1=-1;
+    int result =-1;
+    char pin_index_buffer[5]= {0};
+    char buffer[50]= {0};
+    int ret =0;
+
+    file = open("/sys/class/gpio/export",O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("[MBTK_POWER] Open gpio export file fail.");
+        return MBTK_POWER_RESULT_FAIL;
+    }
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d", gpio);
+    file1 = open(buffer,O_RDONLY);
+    if(file1 != -1)
+    {
+        //file is created
+        close(file1);
+    }
+    else
+    { // create gpio
+        memset(pin_index_buffer,0,5);
+        sprintf(pin_index_buffer,"%d",gpio);
+        result = write(file,pin_index_buffer,strlen(pin_index_buffer));
+        if(result < 0)
+        {
+            LOGE("[MBTK_POWER] Gpio[%d] export fail.", gpio);
+            return MBTK_POWER_RESULT_FAIL;
+        }
+    }
+
+    close(file);
+
+
+    switch(type)
+    {
+        case 0 :
+        {
+            ret = gpio_value_set(0, gpio);
+            break;
+        }
+        case 1:
+        {
+            ret = gpio_value_set(1, gpio);
+            break;
+        }
+        case 2:
+        {
+            ret = gpio_direct_set("out", gpio);
+            break;
+        }
+        case 3:
+        {
+            ret = gpio_direct_set("in", gpio);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+
+    return ret;
+}
+
+/****************************FUNC***************************************/
+
+/****************************API***************************************/
+#if defined(MBTK_PROJECT_T108)
+int mbtk_system_sleep(void)
+{
+    int ubus_ret = 0;
+
+    ubus_ret = mbtk_power_gnss_close();
+    if(ubus_ret < 0)
+    {
+        LOGE("[MBTK_POWER] mbtk_power_gnss_close() fail.");
+        return MBTK_POWER_RESULT_GNSS_CLOSE_FAIL;
+    }
+
+    // echo off > /sys/devices/mbtk-dev-op.10/gps_power && echo mem > /sys/power/autosleep
+    // echo 1 > /sys/devices/asr-rfkill.0/pwr_ctrl && sleep 2 && echo 0 > /sys/devices/asr-rfkill.0/pwr_ctrl
+
+    if(!access("/sys/power/autosleep", W_OK))
+    {
+        system("echo mem > /sys/power/autosleep");
+    }
+    else
+    {
+        LOGE("[MBTK_POWER] /sys/power/autosleep can not write.");
+        //printf("/sys/power/autosleep can not write.");
+        return MBTK_POWER_RESULT_NO_SLEEP_NODE;
+    }
+
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+
+#elif defined(MBTK_PROJECT_L508_X6)
+int mbtk_system_sleep(void)
+{
+    int ubus_ret = 0;
+
+    ubus_ret = mbtk_power_gnss_close();
+    if(ubus_ret < 0)
+    {
+        LOGE("[MBTK_POWER] mbtk_power_gnss_close() fail.");
+        return MBTK_POWER_RESULT_GNSS_CLOSE_FAIL;
+    }
+
+    // echo off > /sys/devices/mbtk-dev-op.10/gps_power && echo mem > /sys/power/autosleep
+    // echo 1 > /sys/devices/asr-rfkill.0/pwr_ctrl && sleep 2 && echo 0 > /sys/devices/asr-rfkill.0/pwr_ctrl
+    //close Ldo6
+    system("i2cset -y -f 2 0x31 0x18 0x0f");
+    //GPS_WAKE_HOST to GPIO
+    system("hwacc w 0xd401e198 0x1040");
+    //HOST_WAKE_GPS to GPIO
+    //system("hwacc w 0xd401e0c0 0x1040");
+    //gpio34 to GPIO
+#if 1
+    system("hwacc w 0xd401e164 0x1040");
+	system("hwacc w 0xd401e166 0x1040");
+	system("hwacc w 0xd401e1b4 0x1040");
+
+    system("hwacc w 0xd401e2ec 0xa441");
+    system("hwacc w 0xd401e2f0 0xa441");
+    system("hwacc w 0xd401e2f4 0xa441");
+    system("hwacc w 0xd401e2f8 0xa441");
+    system("hwacc w 0xd401e2fc 0xa441");
+    system("hwacc w 0xd401e300 0xa441");
+#endif
+    one_gpio_export(117, 2);
+    one_gpio_export(117, 0);
+
+    one_gpio_export(119, 2);
+    one_gpio_export(119, 0);
+
+    one_gpio_export(127, 2);
+    one_gpio_export(127, 0);
+
+    one_gpio_export(33, 2);
+    one_gpio_export(33, 0);
+
+    one_gpio_export(34, 2);
+    one_gpio_export(34, 0);
+
+    one_gpio_export(54, 2);
+    one_gpio_export(54, 0);
+
+    one_gpio_export(21, 2);
+    one_gpio_export(21, 0);
+
+    one_gpio_export(118, 2);
+    one_gpio_export(118, 0);
+
+    if(!access("/sys/power/autosleep", W_OK))
+    {
+        system("echo mem > /sys/power/autosleep");
+    }
+    else
+    {
+        LOGE("[MBTK_POWER] /sys/power/autosleep can not write.");
+        //printf("/sys/power/autosleep can not write.");
+        return MBTK_POWER_RESULT_NO_SLEEP_NODE;
+    }
+
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+
+#elif defined(MBTK_PROJECT_L509)
+int mbtk_system_sleep(void)
+{
+    int ubus_ret = 0;
+
+    ubus_ret = mbtk_power_gnss_close();
+    if(ubus_ret < 0)
+    {
+        LOGE("[MBTK_POWER] mbtk_power_gnss_close() fail.");
+        return MBTK_POWER_RESULT_GNSS_CLOSE_FAIL;
+    }
+
+    // echo off > /sys/devices/mbtk-dev-op.10/gps_power && echo mem > /sys/power/autosleep
+    // echo 1 > /sys/devices/asr-rfkill.0/pwr_ctrl && sleep 2 && echo 0 > /sys/devices/asr-rfkill.0/pwr_ctrl
+
+    one_gpio_export(120, 2);
+    one_gpio_export(120, 0);
+
+    one_gpio_export(21, 2);
+    one_gpio_export(21, 0);
+
+    one_gpio_export(118, 2);
+    one_gpio_export(118, 0);
+
+    if(!access("/sys/power/autosleep", W_OK))
+    {
+        system("echo mem > /sys/power/autosleep");
+    }
+    else
+    {
+        LOGE("[MBTK_POWER] /sys/power/autosleep can not write.");
+        //printf("/sys/power/autosleep can not write.");
+        return MBTK_POWER_RESULT_NO_SLEEP_NODE;
+    }
+
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+
+#elif defined(MBTK_PROJECT_L508)
+int mbtk_system_sleep(void)
+{
+    int ubus_ret = 0;
+
+    ubus_ret = mbtk_power_gnss_close();
+    if(ubus_ret < 0)
+    {
+        LOGE("[MBTK_POWER] mbtk_power_gnss_close() fail.");
+        return MBTK_POWER_RESULT_GNSS_CLOSE_FAIL;
+    }
+
+    // echo off > /sys/devices/mbtk-dev-op.10/gps_power && echo mem > /sys/power/autosleep
+    // echo 1 > /sys/devices/asr-rfkill.0/pwr_ctrl && sleep 2 && echo 0 > /sys/devices/asr-rfkill.0/pwr_ctrl
+
+    one_gpio_export(119, 2);
+    one_gpio_export(119, 0);
+
+    one_gpio_export(21, 2);
+    one_gpio_export(21, 0);
+
+    one_gpio_export(118, 2);
+    one_gpio_export(118, 0);
+
+    if(!access("/sys/power/autosleep", W_OK))
+    {
+        system("echo mem > /sys/power/autosleep");
+    }
+    else
+    {
+        LOGE("[MBTK_POWER] /sys/power/autosleep can not write.");
+        //printf("/sys/power/autosleep can not write.");
+        return MBTK_POWER_RESULT_NO_SLEEP_NODE;
+    }
+
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+
+#elif defined(MBTK_PROJECT_PN1803)
+int mbtk_system_sleep(void)
+{
+    int ubus_ret = 0;
+
+    ubus_ret = mbtk_power_gnss_close();
+    if(ubus_ret < 0)
+    {
+        LOGE("[MBTK_POWER] mbtk_power_gnss_close() fail.");
+        return MBTK_POWER_RESULT_GNSS_CLOSE_FAIL;
+    }
+
+    // echo off > /sys/devices/mbtk-dev-op.10/gps_power && echo mem > /sys/power/autosleep
+    // echo 1 > /sys/devices/asr-rfkill.0/pwr_ctrl && sleep 2 && echo 0 > /sys/devices/asr-rfkill.0/pwr_ctrl
+
+    one_gpio_export(119, 2);
+    one_gpio_export(119, 0);
+
+    one_gpio_export(21, 2);
+    one_gpio_export(21, 0);
+
+    one_gpio_export(118, 2);
+    one_gpio_export(118, 0);
+
+    if(!access("/sys/power/autosleep", W_OK))
+    {
+        system("echo mem > /sys/power/autosleep");
+    }
+    else
+    {
+        LOGE("[MBTK_POWER] /sys/power/autosleep can not write.");
+        //printf("/sys/power/autosleep can not write.");
+        return MBTK_POWER_RESULT_NO_SLEEP_NODE;
+    }
+
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+
+#else
+int mbtk_system_sleep(void)
+{
+    return MBTK_POWER_RESULT_SUCCESS;
+}
+#endif
+/****************************API***************************************/
+#endif
diff --git a/mbtk/mbtk_at/src/mbtk_at.c b/mbtk/mbtk_at/src/mbtk_at.c
new file mode 100755
index 0000000..3389857
--- /dev/null
+++ b/mbtk/mbtk_at/src/mbtk_at.c
@@ -0,0 +1,229 @@
+/*
+*
+*
+* Author : lb
+* Date   : 2021/11/5 10:53:49
+*
+*/
+#include "telutl.h"
+#include "mbtk_at.h"
+#include <dlfcn.h>
+#include <include/log.h>
+#include <stdarg.h>
+#include <errno.h>
+
+// See utlAtParameterOp_T
+static char *at_op_list[] = {"UNKNOWN", "EXEC", "GET", "SET", "ACTION", "TEST", NULL};
+
+
+//void* mbtk_cmd_line_ex = NULL;
+#ifdef MBTK_DATA_MODE_SUPPORT
+static mbtk_data_mode_callback_func data_mode_cb = NULL;
+static TelAtParserID mbtk_atp_index = TEL_AT_CMD_ATP_0;
+static char datamode_buff[4096];
+static int datamode_buff_len = 0;
+#endif
+
+#if 0
+mbtk_audio_exec_f mbtk_at_play = NULL;
+mbtk_audio_exec_f mbtk_at_rec = NULL;
+#endif
+
+typedef struct {
+    /*mbtk_at_func_type_enum type;*/
+    char lib_name[50];
+    void *handle;
+} mbtk_at_lib_info_t;
+
+mbtk_at_func_t *func_list = NULL;
+static mbtk_at_lib_info_t lib_list[] = {
+    {"/lib/libmbtk_lib.so", NULL},      /* MBTK_AT_FUNC_TYPE_BASIC */
+    //{"/lib/libmbtk_factory.so", NULL},  /* MBTK_AT_FUNC_TYPE_FACTORY */
+    //{"/lib/libmbtk_audio.so", NULL},    /* MBTK_AT_FUNC_TYPE_AUDIO */
+    //{"/lib/libmbtk_gnss.so", NULL},     /* MBTK_AT_FUNC_TYPE_GNSS */
+    //{"/lib/libmbtk_ecall.so", NULL},    /* MBTK_AT_FUNC_TYPE_ECALL */
+    //{"/lib/libmbtk_socket.so", NULL},   /* MBTK_AT_FUNC_TYPE_SOCKET */
+    //{"/lib/libmbtk_tcpip.so", NULL},    /* MBTK_AT_FUNC_TYPE_TCPIP */
+    //{"/lib/libmbtk_http.so", NULL},     /* MBTK_AT_FUNC_TYPE_HTTP */
+    //{"/lib/libmbtk_ftp.so", NULL}       /* MBTK_AT_FUNC_TYPE_FTP */
+};
+
+BOOL getExtValue( const utlAtParameterValue_P2c param_value_p,
+                  int index,
+                  int *value_p,
+                  int minValue,
+                  int maxValue,
+                  int DefaultValue);
+
+BOOL getExtUValue(const utlAtParameterValue_P2c param_value_p,
+                  int index,
+                  unsigned int *value_p,
+                  unsigned int minValue,
+                  unsigned int maxValue,
+                  unsigned int DefaultValue);
+
+BOOL getExtString( const utlAtParameterValue_P2c param_value_p,
+                    int index,
+                    CHAR *outString,
+                    INT16 maxStringLength,
+                    INT16 *outStringLength,
+                    CHAR *defaultString);
+
+void mbtk_log(int level, const char *format, ...)
+{
+	char *timestr;
+	char buf[1024];
+	va_list ap;
+	struct timeval log_time;
+	int length = 0;
+
+	va_start(ap, format);
+	length = vsnprintf(buf,1024,format,ap);
+	if(length > 0) {
+        __android_log_printf(LOG_ID_RADIO, level, "%s", buf);
+    }
+
+	va_end(ap);
+}
+
+char *op2str(utlAtParameterOp_T op)
+{
+    return at_op_list[op];
+}
+
+static bool str_empty(const void *str)
+{
+    if (str && strlen((char*)str) > 0)
+        return false;
+
+    return true;
+}
+
+void func_add(mbtk_at_func_type_enum type, char *name)
+{
+    if(!str_empty(name)) {
+        mbtk_at_func_t *func_ptr = (mbtk_at_func_t*)malloc(sizeof(mbtk_at_func_t));
+        if(func_ptr) {
+            memset(func_ptr, 0x0, sizeof(mbtk_at_func_t));
+            func_ptr->type = type;
+            memcpy(func_ptr->name, name, strlen(name));
+
+            func_ptr->next = func_list;
+            func_list = func_ptr;
+        }
+    }
+}
+
+mbtk_at_func_t *func_get(char *name)
+{
+    mbtk_at_func_t *func_ptr = func_list;
+    while(func_ptr) {
+        if(!strcmp(func_ptr->name, name)) {
+            return func_ptr;
+        }
+        func_ptr = func_ptr->next;
+    }
+
+    return func_ptr;
+}
+
+void mbtk_at_proc_null()
+{
+    LOG("MBTK_AT function not found in so.");
+}
+
+int mbtk_lib_init()
+{
+    #define MBTK_FUNC_INIT
+    #include "mbtk_at_func.h"
+    #undef MBTK_FUNC_INIT
+
+    set_service_log_tag("MBTK_AT");
+    mbtk_at_func_t *func_ptr = func_list;
+    while(func_ptr) {
+        if(lib_list[func_ptr->type].handle == NULL) {
+            lib_list[func_ptr->type].handle = dlopen(lib_list[func_ptr->type].lib_name , RTLD_LAZY);
+        }
+
+        if(lib_list[func_ptr->type].handle) {
+            func_ptr->func = dlsym(lib_list[func_ptr->type].handle, func_ptr->name);
+            if(func_ptr->func == NULL) {
+                LOG("%s() dlsym from %s fail.", func_ptr->name, lib_list[func_ptr->type].lib_name);
+                //return -1;
+                func_ptr->func = mbtk_at_proc_null;
+            } else {
+                LOG("%s function : %s", lib_list[func_ptr->type].lib_name, func_ptr->name);
+            }
+        } else {
+            LOG("dlopen() %s fail : %d", lib_list[func_ptr->type].lib_name, errno);
+            //return -1;
+            func_ptr->func = mbtk_at_proc_null;
+        }
+
+        func_ptr = func_ptr->next;
+    }
+    return 0;
+}
+
+#ifdef MBTK_DATA_MODE_SUPPORT
+static utlReturnCode_T mbtk_utlAtTxLineDataFunction_P(const unsigned char *octets_p, const size_t n, void *arg_p)
+{
+    if(n > 0) {
+        LOG("DATA[%d]:%s", n, octets_p);
+        LOG("ARG:%s", arg_p);
+        if(datamode_buff_len + n > 4096) {
+            utlAtParserOp(aParser_p[mbtk_atp_index], utlAT_PARSER_OP_DISABLE_BYPASS_MODE);
+            ATRESP(MAKE_AT_HANDLE(mbtk_atp_index), ATCI_RESULT_CODE_ERROR, 0, NULL);
+            return utlSUCCESS;
+        }
+
+        memcpy(datamode_buff + datamode_buff_len, octets_p, n);
+        datamode_buff_len += n;
+
+        // control-z(0x1a)
+        if(datamode_buff[datamode_buff_len - 1] == 0x1a) {
+            utlAtParserOp(aParser_p[mbtk_atp_index], utlAT_PARSER_OP_DISABLE_BYPASS_MODE);
+            datamode_buff[datamode_buff_len - 1] = '\0';
+            datamode_buff_len--;
+
+            ATRESP(MAKE_AT_HANDLE(mbtk_atp_index), ATCI_RESULT_CODE_OK, 0, datamode_buff);
+            //ATRESP(MAKE_AT_HANDLE(mbtk_atp_index), ATCI_RESULT_CODE_OK, 0, "OK");
+
+            if(data_mode_cb) {
+                data_mode_cb(datamode_buff, datamode_buff_len);
+                data_mode_cb = NULL;
+            }
+        }
+    }
+
+    return utlSUCCESS;
+}
+
+utlReturnCode_T mbtk_data_mode_enter(TelAtParserID atp_index, mbtk_data_mode_callback_func cb)
+{
+    data_mode_cb = cb;
+    utlReturnCode_T result = utlAtParserOp(aParser_p[atp_index], utlAT_PARSER_OP_ENABLE_BYPASS_MODE);
+    if (result != utlSUCCESS)
+    {
+    	LOG("(utlAT_PARSER_OP_ENABLE_BYPASS_MODE)Enter data mode fail[%d].", result);
+    	result = ATRESP(MAKE_AT_HANDLE(atp_index), ATCI_RESULT_CODE_ERROR, 0, NULL);
+    } else {
+        result = utlAtParserOp(aParser_p[atp_index], utlAT_PARSER_OP_SET_TX_LINE_DATA_HANDLER, mbtk_utlAtTxLineDataFunction_P);
+        if (result == utlSUCCESS)
+        {
+            // ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "\r\n>>\r\n");
+            LOG("Enter data mode success.");
+            mbtk_atp_index = atp_index;
+            memset(datamode_buff, 0x0, 4096);
+            datamode_buff_len = 0;
+
+            result = ATRESP(MAKE_AT_HANDLE(atp_index), ATCI_RESULT_CODE_OK, 0, ">>");
+        } else {
+            LOG("(utlAT_PARSER_OP_SET_TX_LINE_DATA_HANDLER)Enter data mode fail[%d].", result);
+            result = ATRESP(MAKE_AT_HANDLE(atp_index), ATCI_RESULT_CODE_ERROR, 0, NULL);
+        }
+    }
+
+    return result;
+}
+#endif
\ No newline at end of file
diff --git a/mbtk/mbtk_at/src/mbtk_at_basic.c b/mbtk/mbtk_at/src/mbtk_at_basic.c
new file mode 100755
index 0000000..55638ef
--- /dev/null
+++ b/mbtk/mbtk_at/src/mbtk_at_basic.c
@@ -0,0 +1,2322 @@
+/*
+* MBTK Basic AT Process.
+*
+* Author : lb
+* Date   : 2021/11/5 10:14:32
+*
+*/
+#include "mbtk_at.h"
+#include "mbtk_device_info.h"
+#include "mbtk/mbtk_type.h"
+#include "mbtk/mbtk_device.h"
+#include <dlfcn.h>
+
+//#include <sys/statfs.h>
+#include <sys/vfs.h>
+#include <errno.h>
+#include <linux/magic.h>
+#include <time.h>
+#include <sys/time.h>
+#include <signal.h>
+#include <pthread.h>
+#include <time.h>
+#include <sys/time.h>
+#include <cutils/properties.h>
+#include "configwrapper.h"
+#include<linux/msg.h>
+
+//#include "gps.h"
+#include "atcmdsvr_ubus.h"
+
+#define MAX_GPIO_TEST_NUM 60
+
+typedef int (*mbtk_dev_info_read_func)(mbtk_device_info_item_enum, void *, int);
+
+#define MBTK_LIB_PATH "/lib/libmbtk_lib.so"
+const struct blobmsg_policy gps_user_cb_policy1[] = {
+    [0] = {
+        .name = "event",
+        .type = BLOBMSG_TYPE_INT32,
+    },
+};
+
+bool mbtk_urc_enable = TRUE;
+
+int mbtk_at_loopback(int type);
+int mbtk_at_play(const char *args);
+int mbtk_at_rec(const char *args);
+
+typedef struct
+{
+    int gpio;
+    bool busy;
+    bool state;
+} mbtk_gpio_state_t;
+
+static bool gpio_test_usable = true;
+
+static mbtk_gpio_state_t gpio_pins[] =
+{
+    {22, FALSE, FALSE},     // IN
+    {33,FALSE,FALSE},
+    {35,FALSE,FALSE},
+    {36,FALSE,FALSE},
+    {34,FALSE,FALSE},
+    {21,FALSE,FALSE},
+    {4,FALSE,FALSE},
+    {123,FALSE,FALSE},
+    {20,FALSE,FALSE},
+    {43,FALSE,FALSE},
+    {13,FALSE,FALSE},
+//    {12,FALSE,FALSE},
+    {14,FALSE,FALSE},
+    {118,FALSE,FALSE},
+//    {19,FALSE,FALSE},
+    {120,FALSE,FALSE},
+    {49,FALSE,FALSE},
+    {50,FALSE,FALSE},
+    {32,FALSE,FALSE},
+    {31,FALSE,FALSE},
+    {51,FALSE,FALSE},
+//    {23,FALSE,FALSE},
+    {24,FALSE,FALSE},
+    {52,FALSE,FALSE},
+    {27,FALSE,FALSE},
+    {28,FALSE,FALSE},
+    {26,FALSE,FALSE},
+    {25,FALSE,FALSE},
+    {5,FALSE,FALSE},
+    {0,FALSE,FALSE},
+    {1,FALSE,FALSE},
+    {2,FALSE,FALSE},
+    {3,FALSE,FALSE},
+    {6,FALSE,FALSE},
+    {7,FALSE,FALSE},
+    {15,FALSE,FALSE},
+    {18,FALSE,FALSE},
+    {16,FALSE,FALSE},
+    {17,FALSE,FALSE},
+    {54,FALSE,FALSE},
+    {53,FALSE,FALSE},
+    {48,FALSE,FALSE},
+    {55,FALSE,FALSE},
+    {58,FALSE,FALSE},
+    {57,FALSE,FALSE},
+    {29,FALSE,FALSE},
+    {30,FALSE,FALSE},
+    {99,FALSE,FALSE},
+    {126,FALSE,FALSE},
+    {125,FALSE,FALSE},
+    {56,FALSE,FALSE},
+    {59,FALSE,FALSE},
+    {117,FALSE,FALSE},
+//    {122,FALSE,FALSE}
+};
+
+int gpio_register_auto_test_out(int *result);
+
+#define MBTK_GPIO_NUM (sizeof(gpio_pins)/sizeof(mbtk_gpio_state_t))
+
+static bool dev_info_inited = FALSE;
+static mbtk_device_info_basic_t info_basic;
+static mbtk_device_info_modem_t info_modem;
+
+static int dev_info_get()
+{
+    if(dev_info_inited) {
+        return 0;
+    }
+    void *handle = dlopen(MBTK_LIB_PATH , RTLD_LAZY);
+    if(handle == NULL)
+    {
+        DBGMSG(MBTK_AT, "dlopen() %s fail : %d", MBTK_LIB_PATH, errno);
+        return -1;
+    }
+
+    mbtk_dev_info_read_func dev_info_read = (mbtk_dev_info_read_func)dlsym(handle, "mbtk_dev_info_read");
+    if(dev_info_read == NULL)
+    {
+        DBGMSG(MBTK_AT, "dlsym(mbtk_dev_info_read) fail : %d", errno);
+        return -1;
+    }
+
+    memset(&info_basic, 0, sizeof(mbtk_device_info_basic_t));
+    memset(&info_modem, 0, sizeof(mbtk_device_info_modem_t));
+
+    // mbtk_dev_info_read()
+    int result = dev_info_read(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));
+    if(result) {
+        DBGMSG(MBTK_AT, "mbtk_dev_info_read(BASIC) fail.");
+        return -1;
+    }
+
+    result = dev_info_read(MBTK_DEVICE_INFO_ITEM_MODEM, &info_modem, sizeof(mbtk_device_info_modem_t));
+    if(result) {
+        DBGMSG(MBTK_AT, "mbtk_dev_info_read(MODEM) fail.");
+        return -1;
+    }
+
+    dev_info_inited = TRUE;
+    return 0;
+}
+
+static char* band_area_2_str(mbtk_modem_band_area_enum band_area)
+{
+    switch(band_area) {
+        case MBTK_MODEM_BAND_AREA_CN:
+            return "CN";
+        case MBTK_MODEM_BAND_AREA_EU:
+            return "EU";
+        case MBTK_MODEM_BAND_AREA_SA:
+            return "SA";
+        default:
+            return "DEF";
+    }
+}
+
+static int gpio_export(void)
+{
+    int index=0;
+    int file=-1;
+    int result =-1;
+    char pin_index_buffer[5]= {0};
+
+    for(index = 0; index < MBTK_GPIO_NUM; index++)
+    {
+        file = open("/sys/class/gpio/export",O_WRONLY);
+        if(file == -1)
+        {
+            LOG("Open gpio export file fail.");
+            return -1;
+        }
+
+        memset(pin_index_buffer,0,5);
+        sprintf(pin_index_buffer,"%d",gpio_pins[index].gpio);
+        result = write(file,pin_index_buffer,strlen(pin_index_buffer));
+        if(result < 0)
+        {
+            LOG("Gpio[%d] export fail.", gpio_pins[index].gpio);
+            gpio_pins[index].busy = TRUE;
+        }
+        close(file);
+    }
+
+    return 0;
+}
+
+static int gpio_unexport(void)
+{
+    int index=0;
+    int file=-1;
+    int result =-1;
+    char pin_index_buffer[5]= {0};
+
+    for(index = 0; index < MBTK_GPIO_NUM; index++)
+    {
+        if(!gpio_pins[index].busy)
+        {
+            file = open("/sys/class/gpio/unexport",O_WRONLY);
+            if(file == -1)
+            {
+                LOG("Open gpio unexport file fail.");
+                return -1;
+            }
+
+            memset(pin_index_buffer,0,5);
+            sprintf(pin_index_buffer,"%d",gpio_pins[index].gpio);
+            result=write(file,pin_index_buffer,strlen(pin_index_buffer));
+            if(result < 0)
+            {
+                close(file);
+                LOG("Gpio[%d] unexport fail.",gpio_pins[index].gpio);
+                return -1;
+            }
+            close(file);
+        }
+    }
+
+    return 0;
+}
+
+static int gpio_direct_set(char *value,int gpio)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    file = open(buffer, O_WRONLY);
+    if(file == -1)
+    {
+        LOG("Open gpio[%d] direct fail.", gpio);
+        return -1;
+    }
+
+    result = write(file,value,strlen(value));
+    if(result != strlen(value))
+    {
+        LOG("Set gpio[%d] direct fail.", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+static int gpio_value_get(int gpio)
+{
+    char buffer[50];
+    char path[10];
+    int file =-1;
+    int result =-1;
+    int value;
+
+    memset(path,0,50);
+    memset(buffer,0,10);
+    sprintf(path,"/sys/class/gpio/gpio%d/value", gpio);
+    file = open(path,O_RDONLY);
+    if(file == -1)
+    {
+        LOG("Open gpio[%d] fail.", gpio);
+        return -1;
+    }
+    result = read(file,buffer,5);
+    if(result <= 0)
+    {
+        LOG("Get gpio[%d] value fail", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+    value = atoi(buffer);
+    return value;
+}
+
+static int gpio_value_set(int value, int gpio)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
+    file = open(buffer,O_WRONLY);
+    if(file == -1)
+    {
+        LOG("Open gpio[%d] value fail.", gpio);
+        return -1;
+    }
+    if(value == 0) {
+        result = write(file,"0",1);
+    } else {
+        result = write(file,"1",1);
+    }
+    if(result != 1)
+    {
+        LOG("Set gpio[%d] value fail.", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+//type:0 value 0
+//type:1 value 1
+//type:2 direction "out"
+//type:3 direction "in"
+
+static int one_gpio_export(int gpio, int type)
+{
+    int index=0;
+    int file=-1;
+    int file1=-1;
+    int result =-1;
+    char pin_index_buffer[5]= {0};
+    char buffer[50]= {0};
+    int ret =0;
+
+    file = open("/sys/class/gpio/export",O_WRONLY);
+    if(file == -1)
+    {
+        LOG("Open gpio export file fail.");
+        return -1;
+    }
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d", gpio);
+    file1 = open(buffer,O_RDONLY);
+    if(file1 != -1)
+    {
+        //file is created
+    }
+    else{ // create gpio
+        memset(pin_index_buffer,0,5);
+        sprintf(pin_index_buffer,"%d",gpio);
+        result = write(file,pin_index_buffer,strlen(pin_index_buffer));
+        if(result < 0)
+        {
+            ATRESP(IND_REQ_HANDLE , ATCI_RESULT_CODE_NULL, 0, "Gpio export fail");
+            LOG("Gpio[%d] export fail.", gpio);
+            return -1;
+        }
+    }
+
+    close(file);
+
+
+    switch(type)
+    {
+        case 0 :
+        {
+            ret = gpio_value_set(0, gpio);
+            break;
+        }
+        case 1:
+        {
+            ret = gpio_value_set(1, gpio);
+            break;
+        }
+        case 2:
+        {
+            ret = gpio_direct_set("out", gpio);
+            break;
+        }
+        case 3:
+        {
+            ret = gpio_direct_set("in", gpio);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+
+    return ret;
+}
+
+
+static int gpio_test(void)
+{
+    int index = 0;
+    int fail_count = 0;
+    gpio_export();
+
+    gpio_direct_set("in", gpio_pins[0].gpio);
+    //set all gpio low level start
+    for(index = 1; index < MBTK_GPIO_NUM; index++)
+    {
+        if(!gpio_pins[index].busy)
+        {
+            gpio_direct_set("out", gpio_pins[index].gpio);
+            gpio_value_set(0, gpio_pins[index].gpio);
+        }
+    }
+
+    if(gpio_value_get(gpio_pins[0].gpio) != 0)
+    {
+        LOG("gpio_test set all gpio level[%d] fail", gpio_pins[0].gpio);
+        gpio_unexport();
+        return -1;
+    }
+    //set all gpio low level end
+
+#if 1
+    for(index = 1; index < MBTK_GPIO_NUM; index++)
+    {
+        if(!gpio_pins[index].busy)
+        {
+            gpio_value_set(1, gpio_pins[index].gpio);
+            if(gpio_value_get(gpio_pins[index].gpio) == 1 && gpio_value_get(gpio_pins[0].gpio) == 1)
+            {
+                gpio_pins[index].state = TRUE;
+            }
+            else
+            {
+                LOG("gpio[%d] input not match output level [1]", gpio_pins[index].gpio);
+                gpio_pins[index].state = FALSE;
+                fail_count++;
+                continue;
+            }
+        }
+    }
+
+    if(fail_count > 0) {
+        gpio_unexport();
+        return fail_count;
+    }
+
+    for(index = 1; index < MBTK_GPIO_NUM; index++)
+    {
+        if(!gpio_pins[index].busy)
+        {
+            gpio_value_set(0, gpio_pins[index].gpio);
+            if(gpio_value_get(gpio_pins[index].gpio) == 0 && gpio_value_get(gpio_pins[0].gpio) == 0)
+            {
+                gpio_pins[index].state = TRUE;
+            }
+            else
+            {
+                LOG("gpio[%d] input not match output level [0]", gpio_pins[index].gpio);
+                gpio_pins[index].state = FALSE;
+                fail_count++;
+                continue;
+            }
+        }
+    }
+
+    gpio_unexport();
+#endif
+    return fail_count;
+}
+
+static int gpio_test2(void)
+{
+    int index=0;
+    int value=0;
+    int fail_count = 0;
+    //export all test gpio
+    gpio_export();
+
+
+    //set main control gpio in
+    gpio_direct_set("in", gpio_pins[0].gpio);
+    for(index = 1; index < MBTK_GPIO_NUM; index++)
+    {
+        gpio_direct_set("out",gpio_pins[index].gpio);
+        gpio_value_set(1, gpio_pins[index].gpio);
+    }
+
+    if(gpio_value_get(gpio_pins[0].gpio) != 1)
+    {
+        LOG("gpio_test set all gpio level[%d] fail", gpio_pins[0].gpio);
+        gpio_unexport();
+        return -1;
+    }
+
+    //set all gpio value as 0
+    for(index = 1; index < MBTK_GPIO_NUM; index++)
+    {
+        gpio_value_set(0, gpio_pins[index].gpio);
+    }
+
+    //set gpio direct in except main control gpio
+    for(index = 1; index < MBTK_GPIO_NUM; index++)
+    {
+        gpio_direct_set("in",gpio_pins[index].gpio);
+    }
+
+    //set main control gpio out
+    gpio_direct_set("out",gpio_pins[0].gpio);
+    gpio_value_set(1,gpio_pins[0].gpio);
+    for(index = 1; index < MBTK_GPIO_NUM; index++)
+    {
+        value = -1;
+        value=gpio_value_get(gpio_pins[index].gpio);
+        if(1==value)
+        {
+            gpio_pins[index].state = TRUE;
+        }
+        else
+        {
+            LOG("gpio[%d] input not match output level [0]", gpio_pins[index].gpio);
+            gpio_pins[index].state = FALSE;
+            fail_count++;
+            continue;
+        }
+    }
+    //unexport gpio
+    gpio_unexport();
+
+    return fail_count;
+//set main
+}
+
+
+uint64 partion_space_get(const char *path)
+{
+    unsigned long long totle = 0;
+    unsigned long long blocksize = 0;
+    struct statfs diskInfo;
+
+    if(path == NULL){
+        return 0;
+    }
+    memset(&diskInfo, 0, sizeof(diskInfo));
+
+    if(statfs(path, &diskInfo)){
+        LOG("statfs() fail - %d.", errno);
+        return 0;
+    }
+    blocksize = diskInfo.f_bsize;
+    LOG("path=%s [totle=%lld MB] :f_type= %lld, f_bsize=%lld, f_blocks=%lld, f_bfree=%lld, f_bavail%lld\n", path,totle,
+	diskInfo.f_type, diskInfo.f_bsize,diskInfo.f_blocks,diskInfo.f_bfree, diskInfo.f_bavail);
+
+    // MSDOS_SUPER_MAGIC     0x4d44
+    if((diskInfo.f_type & 0x0ffff) == MSDOS_SUPER_MAGIC) {
+        totle = (diskInfo.f_blocks * blocksize) >> 20;
+        return totle;
+    } else {
+        LOG("Unknow fs type : %x", diskInfo.f_type);
+        return 0;
+    }
+}
+
+static unsigned int shell_at_handle;
+static void shell_cb_func(char *buf,int buf_size)
+{
+    if(buf && buf_size > 0)
+    {
+        char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+        snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "+MSHELL: %d\r\n%s\r\n",
+                 buf_size, buf);
+        //MBTK_FUNC(log_hex)("+MSHELL", buf, buf_size);
+        ATRESP(shell_at_handle, ATCI_RESULT_CODE_NULL, 0, resp_buf);
+    }
+}
+
+int metis_strptime(char *str_time)
+{
+    struct tm stm;
+    char dateTime[30];
+    struct timeval tv;
+    if( strptime(str_time, "%Y-%m-%d %H:%M:%S",&stm) != NULL)
+    {
+        printf("success\n");
+    }
+    else{
+        printf("error\n");
+        return -1;
+    }
+
+//    printf("设置系统时间前的时间是:\n");
+//    system("date");
+    time_t _t = mktime(&stm);
+//    stime(&_t);
+    tv.tv_sec = _t;
+//    tv.tv_usec = USEC(pnew_time_packet->transmit_timestamp.fine);
+    settimeofday(&tv, NULL);
+
+    printf("设置系统时间HOU的时间是:\n");
+//    system("date");
+
+    return 0;
+}
+
+extern int mbtk_time_type;
+
+#if 0
+static void gpio_timer_alrm_func(int signo)
+{
+    LOG("TIMEOUT : %d", signo);
+    if(SIGALRM == signo) {
+        gpio_test_usable = true;
+        LOG("gpio_test_usable has reset to true.");
+    }
+}
+#else
+static void* gpio_thread_func(void *arg)
+{
+    sleep(1);
+    gpio_test_usable = true;
+    LOG("gpio_test_usable has reset to true.");
+    return NULL;
+}
+#endif
+#ifdef MBTK_DATA_MODE_SUPPORT
+static void data_mode_callback_cb(const char *data, int data_len)
+{
+    LOG("DATA - %d:%s", data_len, data);
+}
+#endif
+
+utlReturnCode_T MBTK_AT_MTEST_PROCESS(const utlAtParameterOp_T op,
+                                      const char *command_name_p,
+                                      const utlAtParameterValue_P2c parameter_values_p,
+                                      const size_t num_parameters,
+                                      const char *info_text_p,
+                                      unsigned int *xid_p,
+                                      void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlSUCCESS;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    unsigned int svc_id = 0;
+    *xid_p = At_handle;
+
+    const static int arg2_len_max = 10;
+    static int arg1 = 0;
+    static char arg2[MBTK_AT_RESP_LEN_MAX];
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            sprintf(resp_buf, "%s : %d,\"%s\"\r\n", command_name_p, arg1, arg2);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            int len = 0;
+            memset(arg2, 0x0, MBTK_AT_RESP_LEN_MAX);
+            if(!getExtString(parameter_values_p, 1, arg2, arg2_len_max, &len, "test"))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        case TEL_EXT_ACTION_CMD :
+        {
+            // ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "ACTION_OK");
+#ifdef MBTK_DATA_MODE_SUPPORT
+            ret = mbtk_data_mode_enter(sAtp_index, data_mode_callback_cb);
+#else
+			ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "ACTION_OK");
+#endif
+            break;
+        }
+
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+
+}
+
+
+utlReturnCode_T MBTK_AT_MINFO_PROCESS(const utlAtParameterOp_T op,
+                                       const char *command_name_p,
+                                       const utlAtParameterValue_P2c parameter_values_p,
+                                       const size_t num_parameters,
+                                       const char *info_text_p,
+                                       unsigned int *xid_p,
+                                       void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", command_name_p, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+            if(!dev_info_get()) {
+                snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX,
+                    "Revision:%s\r\n"
+                    "Custom_Model:%s\r\n"
+                    "Module_Type:%s\r\n",
+                    strlen(info_basic.revision_out) > 0 ? info_basic.revision_out: "Unknown",
+                    strlen(info_basic.project_cust) > 0 ? info_basic.project_cust: "Unknown",
+                    band_area_2_str(info_modem.band_area));
+            } else {
+                snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX,
+                    "Revision:%s\r\n"
+                    "Custom_Model:%s\r\n"
+                    "Module_Type:%s\r\n",
+                    "Unknown", "Unknown", "Unknown");
+            }
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_SYSTIME_PROCESS(const utlAtParameterOp_T op,
+                                      const char *command_name_p,
+                                      const utlAtParameterValue_P2c parameter_values_p,
+                                      const size_t num_parameters,
+                                      const char *info_text_p,
+                                      unsigned int *xid_p,
+                                      void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlSUCCESS;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    unsigned int svc_id = 0;
+    *xid_p = At_handle;
+
+    const static int arg2_len_max = 10;
+    static int arg1 = 0;
+
+    printf("MBTK_AT_SYSTIME_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            char time_type[10] = {0};
+            property_get("persist.mbtk.time_type", time_type, "0");
+            mbtk_time_type = atoi(time_type);
+            sprintf(resp_buf, "%s: %d\r\n", command_name_p, mbtk_time_type);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 2, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            if(num_parameters > 1) {
+    		    const static int cmd_len_max = MBTK_AT_RESP_LEN_MAX;
+                static char time_str[MBTK_AT_RESP_LEN_MAX];
+                int len = 0;
+                memset(time_str, 0x0, MBTK_AT_RESP_LEN_MAX);
+                if(!getExtString(parameter_values_p, 1, time_str, cmd_len_max, &len, ""))
+                {
+                    ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                    LOG("Get CMD Fail.");
+                    break;
+                }
+
+                if(strlen(time_str) > 0)
+                {
+                    ret = metis_strptime(time_str);
+                }
+            }
+
+            mbtk_time_type = arg1;
+            char type_str[10] = {0};
+            sprintf(type_str, "%d", mbtk_time_type);
+            property_set("persist.mbtk.time_type", type_str);
+            if(ret < 0)
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+            }
+            else
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+
+			break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_MTESTF_PROCESS(const utlAtParameterOp_T op,
+                                       const char *command_name_p,
+                                       const utlAtParameterValue_P2c parameter_values_p,
+                                       const size_t num_parameters,
+                                       const char *info_text_p,
+                                       unsigned int *xid_p,
+                                       void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlSUCCESS;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    unsigned int svc_id = 0;
+    *xid_p = At_handle;
+
+    const static int arg2_len_max = 10;
+    static int arg1 = 0;
+    static char arg2[MBTK_AT_RESP_LEN_MAX];
+
+    LOG("MBTK_AT_MTESTF_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            sprintf(resp_buf, "%s : %d,\"%s\"\r\n", command_name_p, arg1, arg2);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            int len = 0;
+            memset(arg2, 0x0, MBTK_AT_RESP_LEN_MAX);
+            if(!getExtString(parameter_values_p, 1, arg2, arg2_len_max, &len, "test"))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        case TEL_EXT_TEST_CMD :
+        {
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "+MTESTF=(0,1),\"\"");
+            break;
+        }
+        case TEL_EXT_ACTION_CMD :
+        {
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "ACTION_OK");
+            break;
+        }
+
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+
+}
+
+
+utlReturnCode_T MBTK_AT_MSHELL_PROCESS(const utlAtParameterOp_T op,
+                                       const char *command_name_p,
+                                       const utlAtParameterValue_P2c parameter_values_p,
+                                       const size_t num_parameters,
+                                       const char *info_text_p,
+                                       unsigned int *xid_p,
+                                       void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    shell_at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = shell_at_handle;
+
+    LOG("MBTK_AT_MSHELL_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_SET_CMD :
+        {
+            const static int cmd_len_max = MBTK_AT_RESP_LEN_MAX;
+            static char cmd[MBTK_AT_RESP_LEN_MAX];
+            int len = 0;
+            memset(cmd, 0x0, MBTK_AT_RESP_LEN_MAX);
+            if(!getExtString(parameter_values_p, 0, cmd, cmd_len_max, &len, ""))
+            {
+                ret = ATRESP(shell_at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get CMD Fail.");
+                break;
+            }
+
+            //if(strlen(cmd) > 0 && mbtk_cmd_line_ex(cmd, shell_cb_func))
+            if(strlen(cmd) > 0 && MBTK_FUNC(mbtk_cmd_line_ex)(cmd, shell_cb_func))
+            {
+                ret = ATRESP(shell_at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+            else
+            {
+                LOG("CMD length error.");
+                break;
+            }
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+
+}
+
+utlReturnCode_T MBTK_AT_ISLKVRSCAN_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("MBTK_AT_ISLKVRSCAN_PROCESS enter with command_op [%s]", op2str(op));
+
+#ifndef MBTK_BUILD_TIME
+#define MBTK_BUILD_TIME "Unknown"
+#endif
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+            if(!dev_info_get()) {
+                snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Version: %s\r\nBuild time: %s\r\n",
+                     strlen(info_basic.revision_out) > 0 ? info_basic.revision_out: "Unknown",
+                     strlen(info_basic.build_time) > 0 ? info_basic.build_time: "Unknown");
+            } else {
+                snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Version: %s\r\nBuild time: %s\r\n",
+                     "Unknown", "Unknown");
+            }
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+
+}
+
+utlReturnCode_T MBTK_AT_SDTEST_PROCESS(const utlAtParameterOp_T op,
+                                       const char *command_name_p,
+                                       const utlAtParameterValue_P2c parameter_values_p,
+                                       const size_t num_parameters,
+                                       const char *info_text_p,
+                                       unsigned int *xid_p,
+                                       void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", command_name_p, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            // SDVOLUME:xxxMB
+            // OK
+            // /mnt/mmcblk0p1
+            #if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108) || defined(MBTK_PROJECT_L509) || defined(MBTK_PROJECT_L508))
+            int i =0 ;
+            uint64 size = 0;
+            for(i = 0; i < 3; i++)
+            {
+                if(i == 0)
+                {
+                    size = partion_space_get("/sdcard");
+                }
+                else if(i == 1)
+                {
+                    size = partion_space_get("/system/etc/www/webdav/sdcard");
+                }
+                else
+                {
+                    system("mkfs.vfat -F 32 /dev/mmcblk0");
+                    system("mount -t vfat /dev/mmcblk0 /mnt");
+                    size = partion_space_get("/mnt");
+                }
+
+                if(size > 0)
+                {
+                    LOG("[SDTEST] i = %d, size = %d", i, size);
+                    break;
+                }
+
+                size = 0;
+            }
+            #else
+            uint64 size = partion_space_get("/mnt/mmcblk0p1");
+            #endif
+            char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+            if(size > 0) {
+                snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "SDVOLUME:%lldMB\r\n", size);
+            } else {
+                snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "SDVOLUME:0MB\r\n");
+            }
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
+utlReturnCode_T MBTK_AT_SPKTEST_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("MBTK_AT_SPKTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            // SDVOLUME:MB
+            // OK
+            char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+            mbtk_at_play(NULL);
+
+            snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Audio spk test.\r\nBuild time: %s\r\n",
+                     MBTK_BUILD_TIME);
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_MICTEST_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("MBTK_AT_MICTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            // SDVOLUME:MB
+            // OK
+            char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+            mbtk_at_rec(NULL);
+            snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Audio record test.\r\nBuild time: %s\r\n",
+                     MBTK_BUILD_TIME);
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_REVTEST_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    int arg1 = 0;
+
+    static bool loopback_running = FALSE;
+
+    LOG("MBTK_AT_REVTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            sprintf(resp_buf, "%s : %d\r\n", command_name_p, arg1);
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            #if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108))
+            if(arg1 == 1)
+            {
+                system("ubus call audio_if loopback_enable '{\"param0\":1}'");
+            }
+            else
+            {
+                system("ubus call audio_if loopback_disable");
+            }
+            #else
+            LOG("MBTK_AT_REVTEST_PROCESS arg1 [%d]", arg1);
+            mbtk_at_loopback(arg1);
+            //sprintf(resp_buf, "%s : ,\"%s\"\r\n", command_name_p, "TEL_EXT_SET_CMD");
+            #endif
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        case TEL_EXT_ACTION_CMD :
+        {
+            if(!loopback_running) {
+                #if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108))
+                system("ubus call audio_if loopback_enable '{\"param0\":1}'");
+                #else
+                mbtk_at_loopback(1);
+                #endif
+                loopback_running = TRUE;
+            } else {
+                #if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108))
+                system("ubus call audio_if loopback_disable");
+                #else
+                mbtk_at_loopback(0);
+                #endif
+                loopback_running = FALSE;
+            }
+            //snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Audio loopback test.\r\nBuild time: %s\r\n",
+            //         MBTK_BUILD_TIME);
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_GPIOTEST_PROCESS(const utlAtParameterOp_T op,
+        const char *command_name_p,
+        const utlAtParameterValue_P2c parameter_values_p,
+        const size_t num_parameters,
+        const char *info_text_p,
+        unsigned int *xid_p,
+        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    int gnss_support = 0;
+    *xid_p = at_handle;
+
+    LOG("MBTK_AT_GPIOTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &gnss_support, 0, 1, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+        }
+        case TEL_EXT_ACTION_CMD :
+        {
+            if(gpio_test_usable) {
+                gpio_test_usable = false;
+            } else { // GPIO test is busy.
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_SUPPRESS, 0, NULL);
+                break;
+            }
+
+#if 1
+			int test_result[MAX_GPIO_TEST_NUM];
+			memset(test_result,0,sizeof(test_result));
+            int result = mbtk_at_gpio((bool)gnss_support, test_result);
+            if(result < 0)
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "GPIO TEST FAIL\r\n");
+            }
+            else if(result == 0) {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "ALL GPIO TEST PASS\r\n");
+            }
+            else
+            {
+                char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+                int index;
+                sprintf(resp_buf, "GPIOTEST Fail %02d PINs:", result);
+                for(index = 0; index < result &&index < MAX_GPIO_TEST_NUM; index++)
+                {
+                    sprintf(resp_buf + strlen(resp_buf), "%03d,", test_result[index]);
+                }
+                resp_buf[strlen(resp_buf) - 1] = '\r';
+                resp_buf[strlen(resp_buf)] = '\n';
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            }
+#else
+            int fail_count = gpio_test();
+            if(fail_count < 0) {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "GPIO TEST FAIL\r\n");
+            } else if(fail_count == 0){
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "ALL GPIO TEST PASS\r\n");
+            } else {
+                char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+                int index;
+                sprintf(resp_buf, "GPIOTEST Fail %02d PINs:", fail_count);
+                for(index = 0; index < MBTK_GPIO_NUM; index++)
+                {
+                    if(!gpio_pins[index].state) {
+                        sprintf(resp_buf + strlen(resp_buf), "%03d,", gpio_pins[index].gpio);
+                    }
+                }
+                resp_buf[strlen(resp_buf) - 1] = '\r';
+                resp_buf[strlen(resp_buf)] = '\n';
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            }
+#endif
+
+            // Set gpio_test_usable to true after 1s.
+#if 0
+            signal(SIGALRM, gpio_timer_alrm_func);
+            struct itimerval val;
+            // Only time
+            val.it_interval.tv_sec  = 0;
+            val.it_interval.tv_usec = 0;
+            // Time
+            val.it_value.tv_sec  = 1;
+            val.it_value.tv_usec = 0;
+            if (setitimer(ITIMER_REAL, &val, NULL) == -1)
+            {
+                LOG("setitimer fail.[errno - %d]",errno);
+            }
+#else
+            pthread_t gpio_thread_id;
+            if (pthread_create(&gpio_thread_id, NULL, gpio_thread_func, NULL) != 0)
+            {
+                LOG("%s errno: %d (%s)",__func__, errno, strerror(errno));
+            }
+#endif
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_ADCGETV_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    int arg1 = 0;
+    *xid_p = at_handle;
+
+    LOG("MBTK_AT_ADCGETV_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            // SDVOLUME:MB
+            // OK
+            snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "ADC Version: %s\r\nBuild time: %s\r\n",
+                     MBTK_DEVICES_REVISION, MBTK_BUILD_TIME);
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            int adc_ret;
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 2, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            adc_ret = mbtk_at_adc(arg1);
+            LOG("MBTK_AT_ADC_PROCESS adc [%d]", adc_ret);
+            sprintf(resp_buf, "%s:%d,%d\r\n", command_name_p, arg1, adc_ret);
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_RGMIITEST_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("MBTK_AT_RGMIITEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            #if defined(MBTK_PROJECT_T108)
+            int result = -1;
+            int rgmii_test_num = 0;
+            char buf[50] = {0};
+            static char rgmii_flag = 0;
+            //mbtk_mdio("eth0", 0, 0x9800, 0xc834);
+            //mbtk_mdio("eth0", 0,  0x0, 0xa000);
+            for(rgmii_test_num = 0; rgmii_test_num < 3; rgmii_test_num++)
+            {
+                if(!rgmii_flag)
+                {
+                    system("/bin/mbtk_mdio eth0 0x9800 0xc834");
+                    system("/bin/mbtk_mdio eth0 0x0 0xa000");
+                }
+                result = mbtk_rgmii_loopback();
+                if(result < 0)
+                {
+                    //
+                }
+                else
+                {
+                    memcpy(buf, "+RGMIITEST: phy loopback ok", strlen("+RGMIITEST: phy loopback ok"));
+                    ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, buf);
+                    rgmii_flag = 1;
+                    break;
+                }
+            }
+
+            if(result < 0)
+            {
+                memcpy(buf, "+RGMIITEST: phy loopback fail", strlen("+RGMIITEST: phy loopback fail"));
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, buf);
+            }
+            break;
+            #endif
+        }
+        default:
+        {
+            ret = ATRESP( at_handle, ATCI_RESULT_CODE_CME_ERROR, CME_OPERATION_NOT_SUPPORTED, NULL);
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_MGPSC_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    int arg1 = 0;
+    *xid_p = at_handle;
+
+    LOG("MBTK_AT_MGPSC_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_SET_CMD :
+        {
+            int gnss_ret;
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 11, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+#if 1
+            if (arg1 == 5 || arg1 == 1 || arg1 ==0)
+            {
+                if (1 == arg1)
+                {
+                    gnss_ret = mbtk_mgpsc_set(arg1);
+                    if (gnss_ret < 0)
+                    {
+                        ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, "+GPS: init fail.\r\n");
+                    }
+                    else
+                    {
+                        ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "+GPS: init success.\r\n");
+                    }
+                }
+                else if (arg1 == 5)
+                {
+                    ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+                }
+                else
+                {
+                    gnss_ret = mbtk_mgpsc_set(arg1);
+                    if (gnss_ret < 0)
+                    {
+                        ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, "+GPS: deinit fail.\r\n");
+                    }
+                    else
+                    {
+                        ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "+GPS: deinit success.\r\n");
+                    }                }
+            }
+            else
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+#else
+            if(1 == arg1 || 11 == arg1 || 10 == arg1 || 9 == arg1)
+                gnss_ret = MBTK_FUNC(mbtk_at_gnss)(arg1, at_gnss_handler_function);
+            else if (6 == arg1)
+                gnss_ret = at_gnss_firmware_update();
+            else
+                gnss_ret = MBTK_FUNC(mbtk_at_gnss)(arg1, NULL);
+
+            LOG("%s gnss [%d]", __FUNCTION__, gnss_ret);
+            sprintf(resp_buf, "%s:%d,%d\r\n", command_name_p, arg1, gnss_ret);
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+#endif
+
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CGNETLED_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("MBTK_AT_CGNETLED_PROCESS enter with command_op [%s]", op2str(op));
+    switch(op)
+    {
+        case TEL_EXT_SET_CMD :
+        {
+            int led_switch;
+            if(!getExtValue(parameter_values_p, 0, &led_switch, 0, 1, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            if(led_switch == 0 || led_switch == 1) {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_SYSSLEEP_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    TelAtParserID origParserId = *(TelAtParserID *)arg_p;
+
+    LOG("MBTK_AT_SYSSLEEP_PROCESS enter with command_op [%s]", op2str(op));
+    switch(op)
+    {
+        case TEL_EXT_SET_CMD:
+        case TEL_EXT_ACTION_CMD:
+        {
+            // [ -e /sys/class/devfreq/devfreq-ddr/polling_interval ] && {
+            //    echo 50 > /sys/class/devfreq/devfreq-ddr/polling_interval
+            // }
+
+            // [ -e /sys/power/autosleep ] && {
+            //    echo booting 8000000000 > /sys/power/wake_lock
+            //    echo mem > /sys/power/autosleep
+            // }
+
+            //close GPS set gpio 21/118: out / 0
+            int result = -1;
+            result = mbtk_system_sleep();
+            if(result != 0)
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+            }
+            else
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+#if 0
+            int ubus_ret = 0;
+            ubus_ret = invoke_reply_data_cb(origParserId, "gps", "gnss_deinit", NULL, (ubus_data_handler_t *)gps_usr_callback_hdl, &at_handle, 4000);
+            if(ubus_ret < 0)
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_SUPPRESS, 0, "BUSY");
+                break;
+            }
+            else if(ubus_ret > 0)
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+#ifdef MBTK_PROJECT_L508
+            system("echo 0 > /sys/class/gpio/gpio119/value");
+#else
+#ifdef MBTK_PROJECT_PN1803
+            system("echo 0 > /sys/class/gpio/gpio119/value");
+#else
+#ifdef MBTK_PROJECT_L509
+            system("echo 0 > /sys/class/gpio/gpio120/value");
+#endif
+#endif
+#endif
+
+#ifdef MBTK_PROJECT_L508_X6
+            //close Ldo6
+            system("i2cset -y -f 2 0x31 0x18 0x0f");
+            //GPS_WAKE_HOST to GPIO
+            system("hwacc w 0xd401e198 0x1040");
+            //HOST_WAKE_GPS to GPIO
+            //system("hwacc w 0xd401e0c0 0x1040");
+            //gpio34 to GPIO
+            #if 1
+            system("hwacc w 0xd401e164 0x1040");
+			system("hwacc w 0xd401e166 0x1040");
+			system("hwacc w 0xd401e1b4 0x1040");
+
+            system("hwacc w 0xd401e2ec 0xa441");
+            system("hwacc w 0xd401e2f0 0xa441");
+            system("hwacc w 0xd401e2f4 0xa441");
+            system("hwacc w 0xd401e2f8 0xa441");
+            system("hwacc w 0xd401e2fc 0xa441");
+            system("hwacc w 0xd401e300 0xa441");
+
+            if(one_gpio_export(117, 2))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+            if(one_gpio_export(117, 0))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+			if(one_gpio_export(119, 2))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+            if(one_gpio_export(119, 0))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+
+
+            if(one_gpio_export(127, 2))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+            if(one_gpio_export(127, 0))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+			 if(one_gpio_export(34, 2))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+            if(one_gpio_export(34, 0))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+			 if(one_gpio_export(33, 2))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+            if(one_gpio_export(33, 0))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+		    if(one_gpio_export(54, 2))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+            if(one_gpio_export(54, 0))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+
+            #endif
+#endif
+
+#ifdef MBTK_PROJECT_T108
+
+#else
+            if(one_gpio_export(21, 2))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+            if(one_gpio_export(21, 0))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+            if(one_gpio_export(118, 2))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+            if(one_gpio_export(118, 0))
+            {
+                LOG("GPIO SET ERROR.");
+            }
+#endif
+            // echo off > /sys/devices/mbtk-dev-op.10/gps_power && echo mem > /sys/power/autosleep
+            // echo 1 > /sys/devices/asr-rfkill.0/pwr_ctrl && sleep 2 && echo 0 > /sys/devices/asr-rfkill.0/pwr_ctrl
+
+            if(!access("/sys/power/autosleep", W_OK))
+                system("echo mem > /sys/power/autosleep");
+            else
+                LOG("/sys/power/autosleep can not write.");
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+#endif
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+static int port_config(mbtk_port_type_enum type, mbtk_port_mode_enum mode) {
+
+    char type_buff[32] = {0};
+    char mode_buff[32] = {0};
+    switch(type)
+    {
+        case MBTK_PORT_TYPE_UART1:
+            strcpy(type_buff, "persist.mbtk.dev_ttyS1");
+            break;
+        case MBTK_PORT_TYPE_USB1:
+            strcpy(type_buff, "persist.mbtk.dev_ttyGS0");
+            break;
+        case MBTK_PORT_TYPE_USB2:
+            strcpy(type_buff, "persist.mbtk.dev_ttymodem0");
+            break;
+        default:
+            return -1;
+    }
+    switch(mode)
+    {
+        case MBTK_PORT_MODE_AT:
+            strcpy(mode_buff, "at");
+            break;
+        case MBTK_PORT_MODE_ADB:
+            strcpy(mode_buff, "adb");
+            break;
+        case MBTK_PORT_MODE_CUSTOM:
+            strcpy(mode_buff, "custom");
+            break;
+        default:
+            return -1;
+    }
+    return property_set(type_buff, mode_buff);
+}
+
+utlReturnCode_T MBTK_AT_MPORTCFG_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+    char resp_buf[1024] = {0};
+
+    LOG("MBTK_AT_MPORTCFG_PROCESS enter with command_op [%s]", op2str(op));
+    switch(op)
+    {
+        case TEL_EXT_SET_CMD:
+		{
+            int arg;
+            if(!getExtValue(parameter_values_p, 0, &arg, 0, 2, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            mbtk_port_type_enum type = (mbtk_port_type_enum)arg;
+            if(!getExtValue(parameter_values_p, 1, &arg, 0, 2, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            mbtk_port_mode_enum mode = (mbtk_port_mode_enum)arg;
+
+            if(port_config(type, mode)) {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+            } else {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+
+            break;
+		}
+        case TEL_EXT_GET_CMD :
+        {
+            int len = 0;
+            char port_config[32] = {0};
+            property_get("persist.mbtk.dev_ttyS1", port_config, "at");
+            if(!strcmp(port_config, "adb")) {
+                len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_UART1, MBTK_PORT_MODE_ADB);
+            } else if(!strcmp(port_config, "custom")) {
+                len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_UART1, MBTK_PORT_MODE_CUSTOM);
+            } else {
+                len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_UART1, MBTK_PORT_MODE_AT);
+            }
+
+            memset(port_config, 0, 32);
+            property_get("persist.mbtk.dev_ttyGS0", port_config, "at");
+            if(!strcmp(port_config, "adb")) {
+                len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB1, MBTK_PORT_MODE_ADB);
+            } else if(!strcmp(port_config, "custom")) {
+                len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB1, MBTK_PORT_MODE_CUSTOM);
+            } else {
+                len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB1, MBTK_PORT_MODE_AT);
+            }
+
+            memset(port_config, 0, 32);
+            property_get("persist.mbtk.dev_ttymodem0", port_config, "at");
+            if(!strcmp(port_config, "adb")) {
+                len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB2, MBTK_PORT_MODE_ADB);
+            } else if(!strcmp(port_config, "custom")) {
+                len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB2, MBTK_PORT_MODE_CUSTOM);
+            } else {
+                len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB2, MBTK_PORT_MODE_AT);
+            }
+
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_MURCECHO_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    static int arg1 = 0;
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            sprintf(resp_buf, "%s : %d\r\n", command_name_p, mbtk_urc_enable);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            mbtk_urc_enable = (bool)arg1;
+
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+RETURNCODE_T  MBTK_AT_READVER_PROCESS(            const utlAtParameterOp_T        op,
+        const char                      *command_name_p,
+        const utlAtParameterValue_P2c   parameter_values_p,
+        const size_t                    num_parameters,
+        const char                      *info_text_p,
+        unsigned int                    *xid_p,
+        void                            *arg_p)
+{
+
+    UNUSEDPARAM(command_name_p);
+	UNUSEDPARAM(parameter_values_p);
+	UNUSEDPARAM(num_parameters);
+	UNUSEDPARAM(info_text_p);
+
+    /*
+     *  Put parser index into the variable
+     */
+        RETURNCODE_T      rc = INITIAL_RETURN_CODE;
+        CiReturnCode          ret = CIRC_FAIL;
+        UINT32                atHandle = MAKE_AT_HANDLE(* (TelAtParserID *) arg_p);
+
+        *xid_p = atHandle;
+    //  DBGMSG("%s: atHandle = %d.\n", __FUNCTION__, atHandle);
+
+    /*
+     * process operation
+     */
+    switch ( op )
+    {
+        case TEL_EXT_ACTION_CMD: /* AT*READVER */
+            {
+                char tmpBuf[512];
+#if 0
+                sprintf(tmpBuf, "*READVER: \r\nrelease_version:%s\r\nrelease_time:%s\r\n", SYSTEM_RELEASE_NAME, SYSTEM_RELEASE_CREATION_DATE);
+#else
+                {
+                    char rel_version[128] = {0};
+                    char sdk[64] = {0};
+                    char rel_date[64] = {0};
+                    char dsp_version[128]={0};
+                    char dsp_date[64]={0};
+                    char rf_version[128] = {0};
+                    int num = 0;
+
+                    char internalRevisionId[400 + 1] = {0};
+                    char buildTimeStr[100 + 1] = {0};
+
+                    //GetDspFWVersionAndDate(dsp_version1,dsp_date1);
+                    //p_string = GetRFBinFWVersion();
+                    //p_string2 = GetRFBinFWDate();
+                    property_get("dev.cp.rel.revision", rel_version, "NULL");
+                    property_get("dev.cp.dsp.revision", dsp_version, "NULL");
+                    property_get("dev.cp.rf.revision", rf_version, "NULL");
+		            property_get("dev.cp.rel.time", rel_date, "NULL");
+                    property_get("dev.cp.dsp.time", dsp_date, "NULL");
+
+                    #if 1
+                    if(strncmp(rel_version, "NULL", strlen("NULL")) != 0)
+                    {
+                        char *p1 = NULL;
+                        p1 = strstr(rel_version, "SDK");
+                        if(p1 != NULL)
+                        {
+                            memcpy(sdk, p1, strlen(p1));
+                            p1 = strstr(sdk, "_");
+                            if(p1 != NULL)
+                            {
+                                *p1 = '\0';
+                            }
+                        }
+                        else
+                        {
+                            strcpy(sdk, "NULL");
+                        }
+                    }
+                    else
+                    {
+                        strcpy(sdk, "NULL");
+                    }
+                    #endif
+
+                    sprintf(tmpBuf, "*READVER: \r\nRelease_Version: %s (SDK %s)\r\nRelease_Time: %s\r\n(DSP: %s %s)\r\n(RF: %s %s)\r\n(HW: %s by %s)\r\n",
+                        rel_version,sdk,rel_date,
+                        dsp_version,dsp_date,
+                        rf_version,"NULL",
+                        "NULL","NULL");
+                }
+#endif
+                ret = ATRESP( atHandle, ATCI_RESULT_CODE_OK, 0, tmpBuf);
+                break;
+            }
+
+
+        default:
+                ret = ATRESP( atHandle, ATCI_RESULT_CODE_CME_ERROR, CME_OPERATION_NOT_SUPPORTED, NULL );
+            break;
+    }
+
+
+    rc = HANDLE_RETURN_VALUE(ret);
+    return(rc);
+}
+
+utlReturnCode_T MBTK_AT_CGDRT_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    static int mode = 0;
+    static int cert = 0;
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &mode, 0, 139, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            if(!getExtValue(parameter_values_p, 1, &cert, 0, 1, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+
+             if(cert)  //out
+             {
+                 ret = one_gpio_export(mode, 2);
+             }
+             else   //in
+             {
+                 ret = one_gpio_export(mode, 3);
+             }
+
+
+             if(ret)
+             {
+                 ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+             }
+             else
+             {
+                 ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+             }
+
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CGSETV_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    static int mode = 0;
+    static int cert = 0;
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &mode, 0, 139, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            if(!getExtValue(parameter_values_p, 1, &cert, 0, 1, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+             if(cert) //hight
+             {
+                 ret = one_gpio_export(mode, 1);
+             }
+             else   //low
+             {
+                 ret = one_gpio_export(mode, 0);
+             }
+
+
+             if(ret)
+             {
+                 ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+             }
+             else
+             {
+                 ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+             }
+
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
+utlReturnCode_T MBTK_AT_MDUMP_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    int arg1 = 0;
+    *xid_p = at_handle;
+
+    LOG("MBTK_AT_MDUMP_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            char dump[10];
+            memset(dump, 0, 10);
+            property_get("persist.mbtk.dump", dump, "0");
+            snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "+MDUMP: %d\r\n", atoi(dump));
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            int adc_ret;
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            char dump[10];
+            memset(dump, 0, 10);
+            if(arg1 == 1) {
+                memcpy(dump, "1", 1);
+            } else {
+                memcpy(dump, "0", 1);
+            }
+            if(property_set("persist.mbtk.dump", dump))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+            } else {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
diff --git a/mbtk/mbtk_at/src/mbtk_at_ftp.c b/mbtk/mbtk_at/src/mbtk_at_ftp.c
new file mode 100755
index 0000000..8b38c7d
--- /dev/null
+++ b/mbtk/mbtk_at/src/mbtk_at_ftp.c
@@ -0,0 +1,976 @@
+#include "mbtk_at.h"
+//#include <sys/statfs.h>
+#include <sys/vfs.h>
+#include <errno.h>
+#include <linux/magic.h>
+#include <time.h>
+#include <sys/time.h>
+#include <signal.h>
+#include <pthread.h>
+#include <time.h>
+#include <sys/time.h>
+#include <cutils/properties.h>
+#include "configwrapper.h"
+#include<linux/msg.h>
+
+#include "atcmdsvr_ubus.h"
+
+//mbtk_ftp
+struct my_msg   //消息队列结构体
+{
+	long int my_msg_type;
+    char *ptr;
+}mbtk_at_msg;
+
+void mbtk_at_printf()
+{
+	int msgid;
+	mbtk_at_msg.my_msg_type=3;
+	msgid=msgget(12,0666|IPC_CREAT);
+    MBTK_FUNC(mbtk_at_msgid)(&msgid);
+    //char read_buf[MAXMSG];
+	while(1)
+	{
+	    msgrcv(msgid,&mbtk_at_msg,4,mbtk_at_msg.my_msg_type,0);
+       	if(strncmp(mbtk_at_msg.ptr,"end",3)==0)
+		    break;
+        ATRESP(IND_REQ_HANDLE , ATCI_RESULT_CODE_NULL, 0, mbtk_at_msg.ptr);
+        free(mbtk_at_msg.ptr);
+        mbtk_at_msg.ptr=NULL;
+	}
+	msgctl(msgid,IPC_RMID,0);
+}
+
+utlReturnCode_T MBTK_AT_CFTPPORT_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    static int arg1 = 0;
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            MBTK_FUNC(mbtk_at_get_ftp_info)(0,&arg1, NULL, NULL, NULL, NULL, NULL, NULL);
+            sprintf(resp_buf, "+CFTPPORT: <%d>\r\n", arg1);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &arg1, 1, 65535, 21))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            MBTK_FUNC(mbtk_at_ftp)(0,arg1, NULL, NULL, NULL, NULL, NULL, NULL);
+
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPUN_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            static char name[MBTK_AT_FTP_NAME_LEN_MAX];
+            MBTK_FUNC(mbtk_at_get_ftp_info)(3,NULL, NULL, NULL, name, NULL, NULL, NULL);
+            sprintf(resp_buf, "+CFTPUN: \"<%s>\"\r\n",name);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            const static int name_len_max = MBTK_AT_FTP_NAME_LEN_MAX;
+            static char name[MBTK_AT_FTP_NAME_LEN_MAX];
+            int len = 0;
+            memset(name, 0x0, MBTK_AT_FTP_NAME_LEN_MAX);
+            if(!getExtString(parameter_values_p, 0, name, name_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP NAME Fail.");
+                break;
+            }
+
+            MBTK_FUNC(mbtk_at_ftp)(3,NULL, NULL, NULL, name, NULL, NULL, NULL);
+
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPPW_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            static char pass[MBTK_AT_FTP_PASS_LEN_MAX];
+            MBTK_FUNC(mbtk_at_get_ftp_info)(2,NULL, NULL, pass, NULL, NULL, NULL, NULL);
+            sprintf(resp_buf, "+CFTPPW: \"<%s>\"\r\n",pass);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            const static int pass_len_max = MBTK_AT_FTP_PASS_LEN_MAX;
+            static char pass[MBTK_AT_FTP_PASS_LEN_MAX];
+            int len = 0;
+            memset(pass, 0x0, MBTK_AT_FTP_PASS_LEN_MAX);
+            if(!getExtString(parameter_values_p, 0, pass, pass_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP PASS Fail.");
+                break;
+            }
+
+            MBTK_FUNC(mbtk_at_ftp)(2,NULL, NULL, pass, NULL, NULL, NULL, NULL);
+
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPTLS_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    static int mode = 0;
+    static int cert = 0;
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            MBTK_FUNC(mbtk_at_get_ftp_info)(4,NULL, NULL, NULL, NULL, &mode, NULL, &cert);
+            sprintf(resp_buf, "+CFTPTLS: <%d>,<%d>\r\n", mode, cert);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            if(!getExtValue(parameter_values_p, 0, &mode, 0, 2, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            if(!getExtValue(parameter_values_p, 1, &cert, 0, 1, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            MBTK_FUNC(mbtk_at_ftp)(4,NULL, NULL, NULL, NULL, mode, NULL, cert);
+
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPSERV_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            static char addr[MBTK_AT_FTP_ADDR_LEN_MAX];
+            MBTK_FUNC(mbtk_at_get_ftp_info)(1,NULL, addr, NULL, NULL, NULL, NULL, NULL);
+            sprintf(resp_buf, "+CFTPSERV: %s", addr);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            const static int addr_len_max = MBTK_AT_FTP_ADDR_LEN_MAX;
+            static char addr[MBTK_AT_FTP_ADDR_LEN_MAX];
+            int len = 0;
+            memset(addr, 0x0, MBTK_AT_FTP_ADDR_LEN_MAX);
+            if(!getExtString(parameter_values_p, 0, addr, addr_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP ADDR Fail.");
+                break;
+            }
+
+            MBTK_FUNC(mbtk_at_ftp)(1,NULL, addr, NULL, NULL, NULL, NULL, NULL);
+
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPTYPE_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            int mbtk_ftp_type = -1;
+            static char ftp_type;
+            MBTK_FUNC(mbtk_at_get_ftp_info)(5,NULL, NULL, NULL, NULL, NULL, &mbtk_ftp_type, NULL);
+            if(mbtk_ftp_type == 0)
+                ftp_type='A';
+            else if(mbtk_ftp_type == 1)
+                ftp_type='I';
+            else
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, resp_buf);
+                break;
+            }
+            sprintf(resp_buf, "+CFTPTYPE:\"%c\"",ftp_type);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            static char ftp_type[2];
+            int addr_len_max = 2;
+            int len = 0;
+            int mbtk_ftp_type = -1;
+            if(!getExtString(parameter_values_p, 0, ftp_type, addr_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP PASS Fail.");
+                break;
+            }
+            //FTP_DATA_TYPE_I = 2 FTP_DATA_TYPE_A = 0
+            if(strstr(ftp_type,"A") != NULL)
+                mbtk_ftp_type = 0;
+            else if(strstr(ftp_type,"I") != NULL)
+                mbtk_ftp_type = 2;
+            else
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP PASS Fail.");
+                break;
+            }
+            MBTK_FUNC(mbtk_at_ftp)(5,NULL, NULL, NULL, NULL, NULL, mbtk_ftp_type, NULL);
+
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPMKD_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    pthread_t mbtk_at_thread_ID;      //定义线程id
+    pthread_create(&mbtk_at_thread_ID, NULL, &mbtk_at_printf, NULL);
+    pthread_detach(mbtk_at_thread_ID);	//设置线程结束收
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            static char remote_size[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            memset(remote_size, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+
+            MBTK_FUNC(mbtk_at_get_ftp_data_info)(remote_size,NULL,NULL,NULL,NULL);
+
+            sprintf(resp_buf, "+CFTPLIST: \"%s\"\r\n",remote_size);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            static char dir[MBTK_AT_FTP_DIR_LEN_MAX];
+            int dir_len_max = MBTK_AT_FTP_DIR_LEN_MAX;
+            int len = 0;
+            memset(dir, 0x0, MBTK_AT_FTP_DIR_LEN_MAX);
+            if(!getExtString(parameter_values_p, 0, dir, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP MKDIR Fail.");
+                break;
+            }
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            MBTK_FUNC(mbtk_at_ftp_mkrmdel)(0,dir);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPRMD_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    pthread_t mbtk_at_thread_ID;      //定义线程id
+    pthread_create(&mbtk_at_thread_ID, NULL, &mbtk_at_printf, NULL);
+    pthread_detach(mbtk_at_thread_ID);	//设置线程结束收
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            static char remote_size[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            memset(remote_size, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+
+            MBTK_FUNC(mbtk_at_get_ftp_data_info)(remote_size,NULL,NULL,NULL,NULL);
+
+            sprintf(resp_buf, "+CFTPMKD: \"%s\"\r\n",remote_size);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            static char dir[MBTK_AT_FTP_DIR_LEN_MAX];
+            int dir_len_max = MBTK_AT_FTP_DIR_LEN_MAX;
+            int len = 0;
+            memset(dir, 0x0, MBTK_AT_FTP_DIR_LEN_MAX);
+            if(!getExtString(parameter_values_p, 0, dir, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP RMDIR Fail.");
+                break;
+            }
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            MBTK_FUNC(mbtk_at_ftp_mkrmdel)(1,dir);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPDEL_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    pthread_t mbtk_at_thread_ID;      //定义线程id
+    pthread_create(&mbtk_at_thread_ID, NULL, &mbtk_at_printf, NULL);
+    pthread_detach(mbtk_at_thread_ID);	//设置线程结束收
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            static char remote_size[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            memset(remote_size, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+
+            MBTK_FUNC(mbtk_at_get_ftp_data_info)(remote_size,NULL,NULL,NULL,NULL);
+
+            sprintf(resp_buf, "+CFTPDELE: \"%s\"\r\n",remote_size);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            static char dir[MBTK_AT_FTP_DIR_LEN_MAX];
+            int dir_len_max = MBTK_AT_FTP_DIR_LEN_MAX;
+            int len = 0;
+            memset(dir, 0x0, MBTK_AT_FTP_DIR_LEN_MAX);
+            if(!getExtString(parameter_values_p, 0, dir, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP DEL FILE Fail.");
+                break;
+            }
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            MBTK_FUNC(mbtk_at_ftp_mkrmdel)(2,dir);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPPUTFILE_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    pthread_t mbtk_at_thread_ID;      //定义线程id
+    pthread_create(&mbtk_at_thread_ID, NULL, &mbtk_at_printf, NULL);
+    pthread_detach(mbtk_at_thread_ID);	//设置线程结束收
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            int rest_size = -1;
+            static char remote_size[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            static char local_path[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            memset(remote_size, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+            memset(local_path, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+
+            MBTK_FUNC(mbtk_at_get_ftp_data_info)(remote_size,local_path,&rest_size,NULL,NULL);
+
+            sprintf(resp_buf, "+CFTPPUTFILE: \"%s\", \"%s\",<%d>\r\n",remote_size,local_path,rest_size);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            int rest_size;
+            static char remote_path[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            static char local_path[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            int dir_len_max = MBTK_AT_FTP_DIR_LEN_MAX;
+            int len = 0;
+            memset(remote_path, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+            memset(local_path, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+            if(!getExtString(parameter_values_p, 0, remote_path, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP DEL FILE Fail.");
+                break;
+            }
+            if(!getExtString(parameter_values_p, 1, local_path, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP DEL FILE Fail.");
+                break;
+            }
+            if(!getExtValue(parameter_values_p, 2, &rest_size, 0, 2147483647, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            MBTK_FUNC(mbtk_at_ftp_upload)(remote_path,local_path,0,rest_size);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPPUT_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    pthread_t mbtk_at_thread_ID;      //定义线程id
+    pthread_create(&mbtk_at_thread_ID, NULL, &mbtk_at_printf, NULL);
+    pthread_detach(mbtk_at_thread_ID);	//设置线程结束收
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            int rest_size = -1;
+            int put_len = -1;
+            static char remote_size[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            memset(remote_size, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+
+            MBTK_FUNC(mbtk_at_get_ftp_data_info)(remote_size,NULL,&rest_size,NULL,&put_len);
+
+            sprintf(resp_buf, "+CFTPPUT: \"%s\",<%d>,<%d>\r\n",remote_size,rest_size,put_len);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            static char remote_path[MBTK_AT_FTP_DIR_LEN_MAX];
+            int dir_len_max = MBTK_AT_FTP_DIR_LEN_MAX;
+            int len = 0;
+            int rest_size;
+            int put_len;
+            memset(remote_path, 0x0, MBTK_AT_FTP_DIR_LEN_MAX);
+            if(!getExtString(parameter_values_p, 0, remote_path, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP DEL FILE Fail.");
+                break;
+            }
+            if(!getExtValue(parameter_values_p, 1, &rest_size, 0, 2147483647, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            if(!getExtValue(parameter_values_p, 2, &put_len, 1, 1500, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            MBTK_FUNC(mbtk_at_ftp_upload)(remote_path,NULL,put_len,rest_size);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+utlReturnCode_T MBTK_AT_CFTPGETFILE_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    pthread_t mbtk_at_thread_ID;      //定义线程id
+    pthread_create(&mbtk_at_thread_ID, NULL, &mbtk_at_printf, NULL);
+    pthread_detach(mbtk_at_thread_ID);	//设置线程结束收
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            int rest_size = -1;
+            int read_size = -1;
+            static char remote_size[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            static char local_path[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            memset(remote_size, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+            memset(local_path, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+
+            MBTK_FUNC(mbtk_at_get_ftp_data_info)(remote_size,local_path,&rest_size,&read_size,NULL);
+
+            sprintf(resp_buf, "+CFTPGETFILE: \"%s\", \"%s\",<%d>, <%d>\r\n",remote_size,local_path,rest_size,read_size);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            static char remote_path[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            static char local_path[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            int dir_len_max = MBTK_AT_FTP_DIR_LEN_MAX;
+            int len = 0;
+            int rest_size;
+            int read_size;
+            memset(remote_path, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+            memset(local_path, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+            if(!getExtString(parameter_values_p, 0, remote_path, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP DEL FILE Fail.");
+                break;
+            }
+            if(!getExtString(parameter_values_p, 1, local_path, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP DEL FILE Fail.");
+                break;
+            }
+            if(!getExtValue(parameter_values_p, 2, &rest_size, 0, 2147483647, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            if(!getExtValue(parameter_values_p, 3, &read_size, 0, 524288, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            MBTK_FUNC(mbtk_at_ftp_download)(remote_path,local_path,0,rest_size,read_size);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+
+}
+
+utlReturnCode_T MBTK_AT_CFTPGET_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    pthread_t mbtk_at_thread_ID;      //定义线程id
+    pthread_create(&mbtk_at_thread_ID, NULL, &mbtk_at_printf, NULL);
+    pthread_detach(mbtk_at_thread_ID);	//设置线程结束收
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            int rest_size = -1;
+            static char remote_size[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            memset(remote_size, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+
+            MBTK_FUNC(mbtk_at_get_ftp_data_info)(remote_size,NULL,&rest_size,NULL,NULL);
+
+            sprintf(resp_buf, "+CFTPGET: \"%s\",<%d>\r\n",remote_size,rest_size);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            static char remote_path[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            int dir_len_max = MBTK_AT_FTP_DIR_LEN_MAX;
+            int len = 0;
+            int rest_size;
+            int read_size;
+            memset(remote_path, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+            if(!getExtString(parameter_values_p, 0, remote_path, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP DEL FILE Fail.");
+                break;
+            }
+            if(!getExtValue(parameter_values_p, 1, &rest_size, 0, 2147483647, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            if(!getExtValue(parameter_values_p, 2, &read_size, 0, 524288, 0))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            MBTK_FUNC(mbtk_at_ftp_download)(remote_path,NULL,1,rest_size,read_size);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+
+}
+
+utlReturnCode_T MBTK_AT_CFTPLIST_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = At_handle;
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+
+    LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
+
+    pthread_t mbtk_at_thread_ID;      //定义线程id
+    pthread_create(&mbtk_at_thread_ID, NULL, &mbtk_at_printf, NULL);
+    pthread_detach(mbtk_at_thread_ID);	//设置线程结束收尸
+
+    switch(op)
+    {
+        case TEL_EXT_GET_CMD :
+        {
+            int rest_size = -1;
+            static char remote_size[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            memset(remote_size, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+
+            MBTK_FUNC(mbtk_at_get_ftp_data_info)(remote_size,NULL,NULL,NULL,NULL);
+
+            sprintf(resp_buf, "+CFTPLIST: \"%s\"\r\n",remote_size);
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            static char dir[MBTK_AT_FTP_DIR_LEN_MAX+1];
+            int dir_len_max = MBTK_AT_FTP_DIR_LEN_MAX;
+            int len = 0;
+            memset(dir, 0x0, MBTK_AT_FTP_DIR_LEN_MAX+1);
+            if(!getExtString(parameter_values_p, 0, dir, dir_len_max, &len, ""))
+            {
+                ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get FTP RMDIR Fail.");
+                break;
+            }
+            ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            MBTK_FUNC(mbtk_at_ftp_list)(dir);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
diff --git a/mbtk/mbtk_at/src/mbtk_at_http.c b/mbtk/mbtk_at/src/mbtk_at_http.c
new file mode 100755
index 0000000..aee2bb9
--- /dev/null
+++ b/mbtk/mbtk_at/src/mbtk_at_http.c
@@ -0,0 +1,1246 @@
+#include "mbtk_at.h"
+//#include <sys/statfs.h>
+#include <sys/vfs.h>
+#include <errno.h>
+#include <linux/magic.h>
+#include <time.h>
+#include <sys/time.h>
+#include <signal.h>
+#include <pthread.h>
+#include <time.h>
+#include <sys/time.h>
+#include <cutils/properties.h>
+#include "configwrapper.h"
+#include<linux/msg.h>
+
+#include "atcmdsvr_ubus.h"
+
+
+int http_handle = -1;
+int http_session = -1;
+int http_type = 0;
+int file_fd = -1;
+
+#define MODEM_FACTORY_TEST_TERM_DEVICE "/dev/ttyGS0"
+
+typedef struct mbtk_http_header {
+    char name[30];
+    char *value;
+} mbtk_http_header_t;
+
+mbtk_http_header_t req_h[30] ={0};
+
+
+
+typedef enum {
+    MBTK_HTTP_DATA_NON = 0,
+    MBTK_HTTP_DATA_HEADER,
+    MBTK_HTTP_DATA_CONTENT,
+    MBTK_HTTP_DATA_COMPLETE
+} mbtk_http_data_type_enum;
+
+typedef enum {
+    MBTK_HTTP_DATA_EFS_BUF = 0,  
+    MBTK_HTTP_DATA_EFS_SIZE,
+    MBTK_HTTP_DATA_EFS_BUF_SIZE
+} mbtk_http_data_file_type_enum;
+
+
+typedef enum {
+    HTTP_VERSION_1_0 = 0,
+    HTTP_VERSION_1_1,
+    HTTP_VERSION_2,
+    HTTP_VERSION_3
+} mbtk_http_version_enum;
+
+typedef enum {
+    HTTP_OPTION_HEAD = 0,
+    HTTP_OPTION_GET,
+    HTTP_OPTION_POST,
+    HTTP_OPTION_PUT,
+    HTTP_OPTION_DELETE,
+    HTTP_OPTION_OPTIONS,
+    HTTP_OPTION_TRACE,
+    HTTP_OPTION_CONNECT,
+    HTTP_OPTION_LINK,
+    HTTP_OPTION_UNLINK
+} mbtk_http_option_enum;
+
+typedef enum {
+    HTTP_TYPE_URC = 0,
+	HTTP_TYPE_EFS
+} mbtk_http_type_enum;
+
+typedef enum {
+    HTTP_SESSION_STATE_NON = 0,
+    HTTP_SESSION_STATE_CONN,
+    HTTP_SESSION_STATE_WRITE_HEADER,
+    HTTP_SESSION_STATE_WRITE_CONTENT,
+    HTTP_SESSION_STATE_WRITE_END,
+    HTTP_SESSION_STATE_READ_HEADER,
+    HTTP_SESSION_STATE_READ_CONTENT,
+    HTTP_SESSION_STATE_READ_END
+} http_session_state_e;
+
+typedef struct {
+    int header_cnt;
+    mbtk_http_header_t *req_h[30];
+
+    int content_len;    // Post content lenght
+    int content_len_send; // Post content lenght for send.
+    char *content;
+} mbtk_http_session_req_t;
+
+typedef struct {
+    int state_code;
+    mbtk_http_version_enum version;
+
+    int content_length;
+    bool is_chunked;
+    int header_cnt;
+    mbtk_http_header_t *rsp_h[30];
+} mbtk_http_session_rsp_t;
+
+typedef struct mbtk_http_session{
+    int handle_id;
+    int id;
+    int sock_fd;
+    int file_fd;
+    http_session_state_e state;
+    char host[50 + 1];
+    mbtk_http_option_enum option;
+    mbtk_http_type_enum type;
+    mbtk_http_version_enum version;
+    char uri[205 + 1];
+    int port;
+    bool is_ssl;
+
+    mbtk_http_session_req_t req;
+    mbtk_http_session_rsp_t rsp;
+} mbtk_http_session_t;
+
+
+#define   CS8	0000060
+#define  B115200  0010002
+
+#define DATABITS	CS8
+#define BAUD		B115200
+#define STOPBITS	0
+#define PARITYON	0
+#define PARITY		0
+#define FILTER_INFO_NUM 12
+#define CRTSCTS	  020000000000	/* flow control */
+#define VERASE 2
+#define VEOF 4
+#define VMIN 6
+#define VEOL 11
+#define IGNPAR	0000004
+#define CREAD	0000200
+#define CLOCAL	0004000
+
+#define	TCSANOW		0
+
+typedef unsigned char	cc_t;
+typedef unsigned int	speed_t;
+typedef unsigned int	tcflag_t;
+
+/* tcflush() and TCFLSH use these */
+#define	TCIFLUSH	0
+#define	TCOFLUSH	1
+#define	TCIOFLUSH	2
+
+
+#define NCCS 19
+struct termios {
+	tcflag_t c_iflag;		/* input mode flags */
+	tcflag_t c_oflag;		/* output mode flags */
+	tcflag_t c_cflag;		/* control mode flags */
+	tcflag_t c_lflag;		/* local mode flags */
+	cc_t c_line;			/* line discipline */
+	cc_t c_cc[NCCS];		/* control characters */
+};
+
+
+
+int mbtk_http_port_fd = -1;
+
+static int mbtk_http_open_device(int *fd_ptr, const char *file_path, int flag, int tty)
+{
+
+	int fd = -1;
+
+	if((fd = open(file_path, flag)) < 0)
+	{
+        LOG("Open %s fail.", file_path);
+		return -1;
+	}
+
+     LOG("Open %s success.", file_path);
+	if (tty) {
+		/* set newtio */
+		struct termios newtio;
+		memset(&newtio, 0, sizeof(newtio));
+		//(void)fcntl(fd, F_SETFL, 0);
+#ifdef UART2_AT
+		/* no flow control for uart by default */
+		newtio.c_cflag = BAUD | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
+#else
+		newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
+#endif
+		newtio.c_iflag = IGNPAR;
+                //newtio.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
+		newtio.c_oflag = 0;
+		newtio.c_lflag = 0;    /* disable ECHO, ICANON, etc... */
+
+		newtio.c_cc[VERASE]   = 0x8;      /* del */
+		newtio.c_cc[VEOF]     = 4;      /* Ctrl-d */
+		newtio.c_cc[VMIN]     = 1;      /* blocking read until 1 character arrives */
+		newtio.c_cc[VEOL]     = 0xD;      /* '\0' */
+
+		tcflush(fd, TCIFLUSH);
+		tcsetattr(fd, TCSANOW, &newtio);
+	}
+
+	*fd_ptr = fd;
+    return 0;
+}
+
+
+int mbtk_http_open_port(void)
+{
+    if(mbtk_http_port_fd < 0)
+    {
+        return mbtk_http_open_device(&mbtk_http_port_fd, MODEM_FACTORY_TEST_TERM_DEVICE, O_RDWR | O_NONBLOCK | O_NOCTTY, 0);
+    }
+    return 0;
+}
+
+void mbtk_http_close_port(void)
+{
+    if(mbtk_http_port_fd >= 0)
+    {
+        tcflush(mbtk_http_port_fd, TCIOFLUSH);
+        close(mbtk_http_port_fd);
+        mbtk_http_port_fd = -1;
+    }
+
+}
+
+int mbtk_http_write_data(void *data,int data_len)
+{
+    int ret = write(mbtk_http_port_fd, data, data_len);
+    if(ret < 0)
+    {
+        LOG("gnss_factory_test_port_fd write fail");
+        return -1;
+    }
+
+    return 0;
+}
+
+static void http_data_cb_func(
+    int session_id, mbtk_http_data_type_enum type,
+    void *data,int data_len)
+{
+	LOG("2type:%d,data_len:%d,data:%s ",type, data_len, data);
+
+    if(http_type)
+    {
+        if(type == MBTK_HTTP_DATA_HEADER) {
+
+        } else if(type == MBTK_HTTP_DATA_CONTENT){
+
+            if(file_fd >= 0)
+            {
+                int write_len = write(file_fd, data, data_len);
+                if(write_len < data_len) {
+                    LOG("write() fail.");
+                    // return -1;
+                }
+            }
+        } else {
+            LOG(">>>>>Complete<<<<<\n");
+        }
+    }
+    else
+    {
+        char buf[50]={0};
+        sprintf(buf, "$HTTPRECV: DATA,%d",data_len);
+        mbtk_http_write_data("\r\n", strlen("\r\n"));
+        mbtk_http_write_data(buf, strlen(buf));
+        mbtk_http_write_data("\r\n", strlen("\r\n"));
+
+        if(type == MBTK_HTTP_DATA_HEADER) {
+
+            mbtk_http_write_data(data, data_len);
+
+            LOG("Header(%d):%s\n",data_len,(char*)data);
+    	
+        } else if(type == MBTK_HTTP_DATA_CONTENT) {
+            mbtk_http_write_data(data, data_len);
+
+        } else {
+            LOG(">>>>>Complete<<<<<\n");
+        }
+
+    }
+
+}
+
+static void http_data_file_cb_func(mbtk_http_data_file_type_enum type,void *data,int data_len)
+{
+    if(type == MBTK_HTTP_DATA_EFS_BUF) {   //read file data
+
+        char buf[50]={0};
+        sprintf(buf, "$HTTPRECV: DATA,%d",data_len);
+        mbtk_http_write_data("\r\n", strlen("\r\n"));
+        mbtk_http_write_data(buf, strlen(buf));
+        mbtk_http_write_data("\r\n", strlen("\r\n"));
+       
+        mbtk_http_write_data(data, data_len);
+        LOG("Header(%d):%s\n",data_len,(char*)data);
+	
+    } else if(type == MBTK_HTTP_DATA_EFS_SIZE) {   //read file size
+
+        char buf[50]={0};
+        sprintf(buf, "$HTTPREAD:%d",data_len);
+        ATRESP(IND_REQ_HANDLE , ATCI_RESULT_CODE_NULL, 0, buf);
+
+        LOG("mbtk data_len(%d)\n",data_len);
+    } else {
+        LOG(">>>>>Complete<<<<<\n");
+    }
+}	
+
+static int http_header_value_get(mbtk_http_header_t *header,char *header_str,int header_str_len)
+{
+    if(header == NULL || header->value == NULL
+        || header_str == NULL)
+        return 0;
+
+    int len = 0;
+    len = snprintf(header_str,header_str_len,"%s: %s",
+            header->name, header->value);
+
+    return len;
+}
+
+
+int mbtk_http_get_file_size(char *file_name)
+{
+    int ret;
+    int fd = -1;
+    struct stat file_stat;
+
+    LOG("mbtk_http_get_file_size() start\n");
+
+    fd = open(file_name, O_RDONLY);
+    if (fd == -1) {
+        printf("Open file %s failed\n", file_name);
+        return -1;
+    }
+    ret = fstat(fd, &file_stat);
+    if (ret == -1) {
+        printf("Get file %s stat failed\n", file_name);
+        close(fd);
+        return -1;
+    }
+    close(fd);
+    LOG("mbtk_http_get_file_size() end\n");
+    return file_stat.st_size;
+}
+
+
+int mbtk_http_read_file_data1(mbtk_http_data_file_type_enum type,int offset)
+{
+
+    if(type) //1 read file size
+    {
+        int size = mbtk_http_get_file_size("/http_test.txt");
+
+        http_data_file_cb_func(MBTK_HTTP_DATA_EFS_SIZE, NULL, size);
+    }else	//read file data
+    {
+        char buf[1024+1] = {0};
+        int ret = 0;
+
+        int fd = open("/http_test.txt", O_RDONLY);
+        if (fd == -1) {
+            printf("Open file %s failed\n", "/http_test.txt");
+            return -1;
+        }
+
+        if(offset)
+        {
+            lseek(fd, offset, SEEK_SET);
+        }
+//            usleep(500000);
+        int index = 0;
+        while(1)
+        {
+            memset(buf,0, sizeof(buf));
+            ret = read(fd, buf, 1024);
+            printf("ret = %d , ", ret);
+            usleep(100000);
+            LOG("mbtk, read file:%s\n", buf);
+            if(ret <= 0)
+                break;
+
+            http_data_file_cb_func(MBTK_HTTP_DATA_EFS_BUF, buf, ret);
+            index++;
+        }
+        close(fd);
+        printf("%d\n", index);
+
+        LOG("read()end  index;:%d, ret:%d",index,ret);
+    }
+
+    return 0;
+}
+
+
+
+utlReturnCode_T MBTK_AT_HTTPOPEN_PROCESS(const utlAtParameterOp_T op,
+                                       const char *command_name_p,
+                                       const utlAtParameterValue_P2c parameter_values_p,
+                                       const size_t num_parameters,
+                                       const char *info_text_p,
+                                       unsigned int *xid_p,
+                                       void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", command_name_p, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            if(http_handle >= 0)
+            {
+				LOG("http is open");
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);  
+                break;
+            }
+
+            if(mbtk_http_open_port())
+            {
+                LOG("http open device port fail\n");
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);  
+                break;
+            }
+            
+            http_handle = MBTK_FUNC(mbtk_http_handle_get)(TRUE, http_data_cb_func);
+
+			if(http_handle < 0)
+			{
+			    LOG("mbtk_http_handle_get() fail.");
+			    ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+			}else{
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+
+            break;
+        }
+		case TEL_EXT_GET_CMD :
+		{
+			char resp_buf[50] ={0};
+			if(http_handle < 0)
+			{
+				sprintf(resp_buf, "$HTTPOPEN:%d", 0);
+				ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);	
+			}else{
+
+				sprintf(resp_buf, "$HTTPOPEN:%d", 1);
+				ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);	
+			};
+
+			break;
+
+		}
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
+
+utlReturnCode_T MBTK_AT_HTTPCLOSE_PROCESS(const utlAtParameterOp_T op,
+                                       const char *command_name_p,
+                                       const utlAtParameterValue_P2c parameter_values_p,
+                                       const size_t num_parameters,
+                                       const char *info_text_p,
+                                       unsigned int *xid_p,
+                                       void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", command_name_p, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            int i = 0;
+            if(http_handle < 0)
+            {
+				LOG("http close handle is < 0");
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);  
+                break;
+            }
+
+            mbtk_http_close_port();
+            for(i = 0; i < 30; i++)
+            {
+                if(req_h[i].value)
+                {
+                    free(req_h[i].value);
+                    req_h[i].value = NULL;
+                }
+            }
+
+            ret = MBTK_FUNC(mbtk_http_handle_free)(http_handle);
+
+			if(ret )
+			{
+			    LOG("mbtk_http_handle_free() fail.");
+			    ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+			}else{
+                http_handle = -1;
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+            break;
+        }
+		case TEL_EXT_GET_CMD :
+		{
+			char resp_buf[50] ={0};
+			if(http_handle >= 0)
+			{
+				sprintf(resp_buf, "$HTTPCLOSE:%d", 1);
+				ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);	
+			}else{
+
+				sprintf(resp_buf, "$HTTPCLOSE:%d", 0);
+				ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);	
+			};
+
+			break;
+
+		}
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+//$HTTPPARA="",(0-65535),(0-1), (0-1)
+utlReturnCode_T MBTK_AT_HTTPPARA_PROCESS(const utlAtParameterOp_T op,
+                                       const char *command_name_p,
+                                       const utlAtParameterValue_P2c parameter_values_p,
+                                       const size_t num_parameters,
+                                       const char *info_text_p,
+                                       unsigned int *xid_p,
+                                       void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", command_name_p, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_SET_CMD :
+        {
+            const static int cmd_len_max = MBTK_AT_RESP_LEN_MAX;
+            static char cmd[MBTK_AT_RESP_LEN_MAX] ={0};
+            char url[255] ={0};
+            char resp_buf[100] = {0};
+            bool ingnore_cert = TRUE;
+ 
+            int arg3 = 0, port = 0, is_ssl = 0;
+            int len = 0;
+            if(!getExtString(parameter_values_p, 0, cmd, cmd_len_max, &len, ""))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            if(!getExtValue(parameter_values_p, 1, &port, 0, 65535, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+			if(!getExtValue(parameter_values_p, 2, &is_ssl, 0, 2, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+			if(!getExtValue(parameter_values_p, 3, &arg3, 0, 2, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            if(is_ssl)
+            {
+                if(!memcmp(cmd,"https://",8))
+                {
+                    sprintf(url, "%s:%d", cmd, port);
+                }
+                else if(!memcmp(cmd,"http://",7))
+                {
+                    ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);  
+                    break;
+                }
+                else
+                {
+                    sprintf(url, "https://%s:%d", cmd, port);
+                }
+            }
+            else
+            {
+                sprintf(url, "%s:%d", cmd, port);
+            }
+
+			 if(http_handle < 0)
+            {
+				LOG("http is not  open");
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);  
+                break;
+            }
+
+            http_session = MBTK_FUNC(mbtk_http_session_create)(http_handle,1,1);
+			if(http_session < 0)
+			{
+			    LOG("mbtk_http_handle_get() fail.");
+			    ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+			}
+            else
+            {
+				ret = MBTK_FUNC(mbtk_http_session_url_set)(http_handle,http_session,url);
+				if(ret )
+				{
+				    ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+				}
+                else
+                {
+                    if(arg3)
+                        ingnore_cert = FALSE;
+                    
+                    if(!ingnore_cert)
+                    {
+                        ret = MBTK_FUNC(mbtk_http_session_ingnore_cert_set)(http_handle,http_session,ingnore_cert);
+                        if(ret)
+                        {
+                            LOG("mbtk_http_session_ingnore_cert_set() fail.");
+                            ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                            break;
+                        }
+                    }
+                    
+                    ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+		        }
+            }
+
+            break;
+        }
+		case TEL_EXT_GET_CMD :
+		{
+			char resp_buf[1024] ={0};
+			const mbtk_http_session_t* session = MBTK_FUNC(mbtk_http_session_get)(http_handle, http_session);
+			if(session != NULL)
+			{
+				sprintf(resp_buf, "Host:\"%s\"\r\nURI:\"%s\"\r\nport:%d\r\nCert:%d",\
+					 session->host,session->uri, session->port,session->is_ssl);
+			}
+
+			ATRESP(IND_REQ_HANDLE , ATCI_RESULT_CODE_NULL, 0, resp_buf);
+			ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+			break;
+		}
+		case TEL_EXT_TEST_CMD :
+		{
+			char resp_buf[50] ={0};
+			memcpy(resp_buf, "$HTTPPARA=\"\",(0-65535),(0-1), (0-1)", strlen("$HTTPPARA=\"\",(0-65535),(0-1), (0-1)"));
+
+			ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+			break;
+
+		}
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}		
+
+utlReturnCode_T MBTK_AT_HTTPSEND_PROCESS(const utlAtParameterOp_T op,
+                                       const char *command_name_p,
+                                       const utlAtParameterValue_P2c parameter_values_p,
+                                       const size_t num_parameters,
+                                       const char *info_text_p,
+                                       unsigned int *xid_p,
+                                       void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", command_name_p, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_ACTION_CMD :
+        {
+            printf("MBTK HTTP Version 1.1");
+            char resp_buf[150] ={0};
+
+			if(http_handle < 0)
+			{
+			    printf("mbtk_http_handle_get() fail.");
+			    ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+			}else{
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
+
+utlReturnCode_T MBTK_AT_HTTPRQH_PROCESS(const utlAtParameterOp_T op,
+                                       const char *command_name_p,
+                                       const utlAtParameterValue_P2c parameter_values_p,
+                                       const size_t num_parameters,
+                                       const char *info_text_p,
+                                       unsigned int *xid_p,
+                                       void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    *xid_p = at_handle;
+
+    LOG("%s 11111111111111enter with command_op [%s]", command_name_p, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_SET_CMD :
+        {
+            const static int rqh_head_len_max = MBTK_AT_RESP_LEN_MAX;
+            static char rqh_head[MBTK_AT_RESP_LEN_MAX];
+            char rqh_buf[100] = {0};
+            char buf_test[100] ={0};
+            char *p = buf_test;
+            int len = 0;
+            memset(rqh_head, 0x0, MBTK_AT_RESP_LEN_MAX);
+            if(!getExtString(parameter_values_p, 0, rqh_head, rqh_head_len_max, &len, ""))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, "MBTK_AT_HTTPRQH_PROCESS1");
+                LOG("Get CMD Fail.");
+                break;
+            }
+            else{
+                memcpy(buf_test,rqh_head, strlen(rqh_head) );
+            }
+
+            len = 0;
+            if(!getExtString(parameter_values_p, 1, rqh_buf, rqh_head_len_max, &len, ""))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, "MBTK_AT_HTTPRQH_PROCESS1_buf");
+                LOG("Get CMD Fail.");
+                break;
+            }
+
+			 if(http_handle < 0)
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);  
+                break;
+            }
+
+            ret = MBTK_FUNC(mbtk_http_session_head_add)(http_handle,  http_session, rqh_head, rqh_buf);
+    
+			if(ret)
+			{
+			    LOG("mbtk_http_handle_get() fail.");
+			    ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+			}else{
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+                
+                int i = 0;
+                for(i = 0; i < 30; i++)
+                {
+                    if( !strcmp(req_h[i].name, rqh_head) )
+                    {
+                        if(req_h[i].value)
+                        {
+                            free(req_h[i].value);
+                        }
+                
+                        req_h[i].value = (char*)malloc(strlen(rqh_buf) + 1);
+                        if(req_h[i].value == NULL)
+                        {
+                            return -1;
+                        }
+                        memset(req_h[i].value, 0x0, strlen(rqh_buf) + 1);
+                        memcpy(req_h[i].value, rqh_buf, strlen(rqh_buf));
+                
+                    }
+                }
+                
+                for(i = 0; i < 30; i++)
+                {
+                    if(req_h[i].value == NULL)
+                    {
+                        break;
+                    }
+                }
+                
+                memcpy(req_h[i].name, rqh_head, strlen(rqh_head));
+                req_h[i].value = (char*)malloc(strlen(rqh_buf) + 1);
+                if(req_h[i].value == NULL)
+                {
+                //    return -1;
+                    break;
+                }
+                memset(req_h[i].value, 0x0, strlen(rqh_buf) + 1);
+                memcpy(req_h[i].value, rqh_buf, strlen(rqh_buf));
+
+            }
+
+            break;
+        }
+        case TEL_EXT_GET_CMD :
+        {
+            char resp_buf[1024] ={0};
+            int index = 0;
+            int len = 0;
+            int i = 0;
+
+            for(i = 0; i < 30; i++)
+            {
+                if(req_h[i].value == NULL)
+                {
+                    break;
+                }
+
+                sprintf(resp_buf, "%s:%s\n", req_h[i].name, req_h[i].value);
+                ATRESP(IND_REQ_HANDLE , ATCI_RESULT_CODE_NULL, 0, resp_buf);
+                memset(resp_buf, 0, sizeof(resp_buf));
+            }
+
+			if(i == 0)
+			{
+				ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "$HTTPRQH: \"\"");
+			}
+			else
+			{
+				ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+			}
+			
+			break;
+		}
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
+utlReturnCode_T MBTK_AT_HTTPACTION_PROCESS(const utlAtParameterOp_T op,
+                                        const char *command_name_p,
+                                        const utlAtParameterValue_P2c parameter_values_p,
+                                        const size_t num_parameters,
+                                        const char *info_text_p,
+                                        unsigned int *xid_p,
+                                        void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    int arg1 = 0;
+    int type = 0;
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", __FUNCTION__, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_TEST_CMD :
+        {
+            char resp_buf[50] ={0};
+            memcpy(resp_buf, "$HTTPACTION: (0-3) ", strlen("$HTTPACTION: (0-3) "));
+
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            int gnss_ret;
+
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 3, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            if(arg1 == 0){ type = 1;}
+            else if(arg1== 2){type = 0; }
+            else if(arg1== 3){type = 2; }
+            else{
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            ret = MBTK_FUNC(mbtk_http_session_option_reset)(http_handle,http_session,type);
+            if(ret)
+            {
+                LOG("mbtk_http_handle_get() fail.");
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+            }
+            else
+            {
+
+                if(http_type)
+                {
+                    file_fd = open("/http_test.txt", O_WRONLY|O_TRUNC|O_CREAT|O_APPEND, 0666);
+                    if(file_fd < 0) 
+                    {
+                        LOG("mbtk_http_session_type_set fail");
+                        ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                        break;
+                    }
+                }
+
+                ret = MBTK_FUNC(mbtk_http_session_start)(http_handle, http_session);
+                if(ret)
+                {
+                    ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                }else{
+                    ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+                }
+
+                if(file_fd >= 0)
+                {
+                    if(close(file_fd))
+                    {
+                        LOG("close() fail file_fd:%d",file_fd);
+                    }
+                    file_fd = -1;
+                }
+
+//                mbtk_http_close_port();
+            }
+
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
+utlReturnCode_T MBTK_AT_HTTPTYPE_PROCESS(const utlAtParameterOp_T op,
+const char *command_name_p,
+const utlAtParameterValue_P2c parameter_values_p,
+const size_t num_parameters,
+const char *info_text_p,
+unsigned int *xid_p,
+void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    int arg1 = 0;
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", __FUNCTION__, op2str(op));
+
+    switch(op)
+    {
+    	case TEL_EXT_TEST_CMD :
+    	{
+			ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "$HTTPTYPE: (0-1)");
+			break;
+
+		}
+        case TEL_EXT_GET_CMD :
+        {
+           	char resp_buf[50] ={0};
+			const mbtk_http_session_t* session = MBTK_FUNC(mbtk_http_session_get)(http_handle, http_session);
+			if(session != NULL)
+			{
+				sprintf(resp_buf, "$HTTPTYPE:%d",session->type);
+			}
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+            break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            int gnss_ret;
+
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            http_type = arg1;
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+//$HTTPDATAEX: (0-500) ,"" 
+utlReturnCode_T MBTK_AT_HTTPDATAEX_PROCESS(const utlAtParameterOp_T op,
+const char *command_name_p,
+const utlAtParameterValue_P2c parameter_values_p,
+const size_t num_parameters,
+const char *info_text_p,
+unsigned int *xid_p,
+void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    int arg1 = 0, arg2 = 0;
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", __FUNCTION__, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_TEST_CMD :
+        {
+            char resp_buf[50] ={0};
+			memcpy(resp_buf, "$HTTPDATAEX: (0-500) ,\"\"",strlen("$HTTPDATAEX: (0-500) ,\"\""));
+			ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
+			break;
+        }
+        case TEL_EXT_SET_CMD :
+        {
+            int gnss_ret;
+
+			const static int cmd_len_max = MBTK_AT_RESP_LEN_MAX;
+            static char cmd[MBTK_AT_RESP_LEN_MAX];
+            int len = 0;
+			
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 501, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+			memset(cmd, 0x0, MBTK_AT_RESP_LEN_MAX);
+            if(!getExtString(parameter_values_p, 1, cmd, cmd_len_max, &len, ""))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                LOG("Get CMD Fail.");
+                break;
+            }
+
+			ret = MBTK_FUNC(mbtk_http_session_option_reset)(http_handle,http_session,2);
+			if(ret)
+			{
+				LOG("mbtk_http_session_option_reset fail");
+				ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+
+			}
+			else
+			{
+
+				ret = MBTK_FUNC(mbtk_http_session_content_set)(http_handle,http_session,cmd,arg1);
+				if(ret)
+				{
+					sprintf(resp_buf, "mbtk_http_session_content_set fail,arg1:%d, len:%d, cmd:%s\r\n", arg1,len, cmd);
+					LOG(resp_buf);
+				    ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+				}
+				else
+				{
+	                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+	            }
+			}
+
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
+//$HTTPREAD: (0-1),(0-512000) 
+utlReturnCode_T MBTK_AT_HTTPREAD_PROCESS(const utlAtParameterOp_T op,
+const char *command_name_p,
+const utlAtParameterValue_P2c parameter_values_p,
+const size_t num_parameters,
+const char *info_text_p,
+unsigned int *xid_p,
+void *arg_p)
+{
+    UNUSEDPARAM(command_name_p);
+    UNUSEDPARAM(num_parameters);
+    UNUSEDPARAM(info_text_p);
+
+    utlReturnCode_T ret = utlFAILED;
+    TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
+    unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
+    char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
+    int arg1 = 0, arg2 = 0;
+    *xid_p = at_handle;
+
+    LOG("%s enter with command_op [%s]", __FUNCTION__, op2str(op));
+
+    switch(op)
+    {
+        case TEL_EXT_TEST_CMD :
+        {
+            ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "$HTTPREAD: (0-1),(0-512000) ");
+            break;
+        }
+		case TEL_EXT_GET_CMD:
+		{
+			ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+			break;
+		}
+        case TEL_EXT_SET_CMD :
+        {
+            int gnss_ret;
+
+            if(!getExtValue(parameter_values_p, 0, &arg1, 0, 2, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+			if(!getExtValue(parameter_values_p, 1, &arg2, 0, 512001, 0))
+            {
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+//            char buf[100] ={0};
+//            sprintf(buf, "arg1:%d, arg2%d\n", arg1, arg2);
+
+//            ATRESP(IND_REQ_HANDLE , ATCI_RESULT_CODE_NULL, 0, buf);
+
+            
+            if(arg1 == 0)   // read data
+            {
+                if(arg2 < 1)
+                    arg2 = 0;
+                    
+            }
+            else if(arg1 == 1){    // read file size
+                arg2 = 0;
+            }
+            else{
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+                break;
+            }
+
+            ret = mbtk_http_read_file_data1(arg1,arg2);
+            if(ret)
+            {
+                LOG("mbtk_http_read_file_data fail");
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
+            }else{
+                ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
+            }
+
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
+
diff --git a/mbtk/mbtk_at/src/mbtk_at_tcpip.c b/mbtk/mbtk_at/src/mbtk_at_tcpip.c
new file mode 100755
index 0000000..5e0499c
--- /dev/null
+++ b/mbtk/mbtk_at/src/mbtk_at_tcpip.c
Binary files differ
diff --git a/mbtk/mbtk_at/src/mbtk_rgmii_loopback.c b/mbtk/mbtk_at/src/mbtk_rgmii_loopback.c
new file mode 100755
index 0000000..c127cbe
--- /dev/null
+++ b/mbtk/mbtk_at/src/mbtk_rgmii_loopback.c
@@ -0,0 +1,269 @@
+#if 1//MBTK_RGMII_TEST
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>// close()
+#include <string.h>// strcpy, memset(), and memcpy()
+#include <netdb.h> // struct addrinfo
+#include <sys/types.h>  // needed for socket(), uint8_t, uint16_t, uint32_t
+#include <sys/socket.h>  // needed for socket()
+#include <netinet/in.h> // IPPROTO_ICMP, INET_ADDRSTRLEN
+#include <netinet/ip.h>// struct ip and IP_MAXPACKET (which is 65535)
+#include <netinet/ip_icmp.h> // struct icmp, ICMP_ECHO
+#include <arpa/inet.h> // inet_pton() and inet_ntop()
+#include <sys/ioctl.h> // macro ioctl is defined
+//#include <bits/ioctls.h>  // defines values for argument "request" of ioctl.
+#include <net/if.h> // struct ifreq
+#include <linux/if_ether.h> // ETH_P_IP = 0x0800, ETH_P_IPV6 = 0x86DD
+#include <linux/if_packet.h> // struct sockaddr_ll (see man 7 packet)
+//#include <net/ethernet.h>
+#include <errno.h> // errno, perror()
+
+#include <linux/mii.h>
+#include <linux/sockios.h>
+#include <linux/types.h>
+
+#include "mbtk_at.h"
+
+#define ETH_P_DEAN 0x8874 //自定义的以太网协议type
+
+//mdio eth0 1          	读取phy寄存器1的数值
+//mdio eth0 0 0x1120      将0x1120写入 phy寄存器1
+#define reteck(ret)     \
+        if(ret < 0){    \
+            LOG("[RGMIITEST]%s : line: %d", __func__, __LINE__);   \
+            goto lab;   \
+        }
+
+#if 0
+#define help() \
+    printf("mdio:\n");                  \
+    printf("read operation: mdio reg_addr\n");          \
+    printf("write operation: mdio reg_addr value\n");    \
+    printf("For example:\n");            \
+    printf("mdio eth0 1\n");             \
+    printf("mdio eth0 0 0x12\n\n");      \
+    exit(0);
+#endif
+
+int sockfd;
+
+//net_name:网卡名字,mode:get 1/set 0,reg_addr: 寄存器地址,value:值
+int mbtk_mdio(char* net_name,int mode, uint16_t reg_addr, uint16_t value)
+{
+    if(net_name == NULL)
+    {
+        return -1;
+    }
+
+    struct mii_ioctl_data *mii = NULL;
+    struct ifreq ifr;
+    int ret;
+
+    memset(&ifr, 0, sizeof(ifr));
+    strncpy(ifr.ifr_name, net_name, IFNAMSIZ - 1);
+
+    sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
+    reteck(sockfd);
+
+    //get phy address in smi bus
+    ret = ioctl(sockfd, SIOCGMIIPHY, &ifr);
+    reteck(ret);
+
+    mii = (struct mii_ioctl_data*)&ifr.ifr_data;
+
+    if(mode == 1)
+    {
+
+        mii->reg_num = reg_addr;
+
+        ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
+        reteck(ret);
+
+        LOG("[RGMIITEST]read phy addr: 0x%x  reg: 0x%x   value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
+
+        if (mii->reg_num == 0x1)
+        {
+            LOG("[RGMIITEST]Link Status\n");
+
+            if(mii->val_out& 0x0004)
+            {
+                LOG("[RGMIITEST]link is up\n");
+            }
+            else
+            {
+                LOG("[RGMIITEST]link is down\n");
+            }
+        }
+    }
+    else if(mode == 0)
+    {
+
+        mii->reg_num    = reg_addr;
+        mii->val_in     = value;
+
+        ret = ioctl(sockfd, SIOCSMIIREG, &ifr);
+        reteck(ret);
+
+        LOG("[RGMIITEST]write phy addr: 0x%x  reg: 0x%x  value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_in);
+    }
+
+    close(sockfd);
+    return 0;
+    lab:
+    close(sockfd);
+    return -1;
+}
+ 
+int mbtk_rgmii_loopback(void)
+{
+    int i, datalen, frame_length, sd, bytes;
+    char *interface = "eth0";
+    uint8_t data[100];
+    uint8_t src_mac[6];
+    uint8_t dst_mac[6];
+    uint8_t ether_frame[100] = {0};
+    struct sockaddr_ll device;
+    struct ifreq ifr;
+    int recvlen=0;
+    uint8_t buffer[100] = {0};
+    int loopback_state=0;
+    int ret = -1;
+
+    // Submit request for a socket descriptor to look up interface.
+    if ((sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0)
+    {
+        LOG("[RGMIITEST]socket() failed to get socket descriptor for using ioctl()");
+        return -1;
+    }
+
+    // Use ioctl() to look up interface name and get its MAC address.
+    memset(&ifr, 0, sizeof(ifr));
+    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", interface);
+    if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0)
+    {
+        close(sd);
+        LOG("[RGMIITEST]ioctl() failed to get source MAC address ");
+        return -1;
+    }
+    close(sd);
+ 
+    // Copy source MAC address.
+    memcpy(src_mac, ifr.ifr_hwaddr.sa_data, 6);
+ 
+    // Report source MAC address to stdout.
+    LOG("[RGMIITEST]MAC address for interface %s is %02x:%02x:%02x:%02x:%02x:%02x", interface, \
+                            src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5]);
+ 
+    // Find interface index from interface name and store index in
+    // struct sockaddr_ll device, which will be used as an argument of sendto().
+    memset(&device, 0, sizeof(device));
+    if ((device.sll_ifindex = if_nametoindex(interface)) == 0)
+    {
+        LOG("[RGMIITEST]if_nametoindex() failed to obtain interface index ");
+        return -1;
+    }
+    LOG("[RGMIITEST]Index for interface %s is %i", interface, device.sll_ifindex);
+ 
+    // Set destination MAC address: you need to fill these out
+    dst_mac[0] = 0x72; //设置目的网卡地址
+    dst_mac[1] = 0x40;
+    dst_mac[2] = 0xB8;
+	dst_mac[3] = 0xF7;
+    dst_mac[4] = 0x5A;
+    dst_mac[5] = 0x64;
+ 
+    // Fill out sockaddr_ll.
+    device.sll_family = AF_PACKET;
+    memcpy(device.sll_addr, src_mac, 6);
+    device.sll_halen = htons(6);
+ 
+    // 发送的data,长度可以任意,但是抓包时看到最小数据长度为46,这是以太网协议规定以太网帧数
+    //据域部分最小为46字节,不足的自动补零处理
+ 
+    datalen = 12;
+    data[0] = 'h';
+    data[1] = 'e';
+    data[2] = 'l';
+    data[3] = 'l';
+    data[4] = 'o';
+    data[5] = ' ';
+    data[6] = 'w';
+    data[7] = 'o';
+    data[8] = 'r';
+    data[9] = 'l';
+    data[10] = 'd';
+    data[11] = '!';
+ 
+    // Fill out ethernet frame header.
+    frame_length = 6 + 6 + 2 + datalen;
+    // Destination and Source MAC addresses
+    memcpy(ether_frame, dst_mac, 6);
+    memcpy(ether_frame + 6, src_mac, 6);
+ 
+    ether_frame[12] = ETH_P_DEAN / 256;
+    ether_frame[13] = ETH_P_DEAN % 256;
+
+    // data
+    memcpy(ether_frame + 14, data, datalen);
+    // Submit request for a raw socket descriptor.
+    if ((sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0)
+    { //创建正真发送的socket
+        LOG("[RGMIITEST]socket() failed ");
+		return -1;
+    }
+
+    //set recv timeout
+    struct timeval tv;
+    tv.tv_sec = 3;
+    tv.tv_usec = 0;
+    ret = setsockopt( sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv) );
+    if(ret != 0)
+    {
+        LOG("[RGMIITEST]setsockopt is fail ret = [%d]", ret);
+    }
+
+    // Send ethernet frame to socket.
+    if ((bytes = sendto(sd, ether_frame, frame_length, 0, (struct sockaddr *)&device,
+        sizeof(device))) <= 0)
+    {
+        close(sd);
+        LOG("[RGMIITEST]sendto() failed");
+        return -1;
+    }
+	LOG("[RGMIITEST]IP_MAXPACKET = %d", IP_MAXPACKET, bytes);
+    LOG("[RGMIITEST]sendlen = %d sendto data:", bytes);
+    LOG("[RGMIITEST]%s", ether_frame);
+
+    recvlen = recvfrom(sd,buffer,sizeof(buffer),0,NULL,NULL);
+    if(recvlen < 0)
+    {
+        if(errno == EWOULDBLOCK)
+        {
+            LOG("[RGMIITEST] recv timeout");
+        }
+        close(sd);
+        return -1;
+    }
+	LOG("[RGMIITEST]recvlen = %d recvfrom data:\n", recvlen);
+    LOG("[RGMIITEST]%s", buffer);
+ 
+    for(i=0; i<recvlen; i++) {
+        if(bytes>recvlen)
+        {
+            loopback_state=-1;
+            break;
+        }
+        else if(ether_frame[i]!=buffer[i])
+        {
+            loopback_state=-1;
+			LOG("[RGMIITEST]ether_frame[%d]:%02x buffer[%d]:%02x", i, ether_frame[i], i, buffer[i]);
+            break;
+        }
+    }
+    
+    // Close socket descriptor.
+    close(sd);
+    return loopback_state;
+}
+
+#endif
\ No newline at end of file
diff --git a/mbtk/mbtk_version b/mbtk/mbtk_version
new file mode 100755
index 0000000..4195991
--- /dev/null
+++ b/mbtk/mbtk_version
@@ -0,0 +1,3 @@
+PATCH_INDEX=1
+GIT_COMMIT=be5ef44399ae1d36692f7cdc06e31fe98b36a346
+PATCH_DATE=2025-03-05_16:31:55
diff --git a/mbtk/optee_test/Guide.txt b/mbtk/optee_test/Guide.txt
new file mode 100755
index 0000000..8315004
--- /dev/null
+++ b/mbtk/optee_test/Guide.txt
@@ -0,0 +1,36 @@
+How to write a Trusted/Host Application?

+	1.	Please refer to

+		https://optee.readthedocs.io/en/latest/building/trusted_applications.html#build-trusted-applications

+		https://optee.readthedocs.io/en/latest/building/gits/optee_examples/optee_examples.html#optee-examples

+	2.	We perpare a minimal set of optee_examples which only contains hello world for your reference.

+		Unzip optee_appref and there is a hello_world example with below layout:

+		hello_world/

+			├── host

+			│	├── Makefile                  BINARY=optee_example_hello_world

+			│	└── main.c                    Implementation of host application of hello world		

+			└── ta

+				├── Makefile                  BINARY=<uuid>

+				├── sub.mk                    srcs-y += hello_world_ta.c

+				├── include

+				│   └── hello_world_ta.h      Header exported to non-secure: TA commands API

+				├── hello_world_ta.c          Implementation of TA entry points

+				└── user_ta_header_defines.h  TA_UUID, TA_FLAGS, TA_DATA/STACK_SIZE, ...

+		

+	3.	Please update conf.mk according to your environment

+		ASR_OWRT_DIR should be the top directory of ASR1803 openwrt release.

+		HOST_CROSS_COMPILE should be tool-chain used by ASR openwrt release.

+		please run below command first with ASR_OWRT_DIR replaced with the openwrt path or

+		add it to ~/.bashrc and source ~/.bashrc:

+			export PATH=$ASR_OWRT_DIR/owtoolchain/linux64/bin:$PATH

+		TA_CROSS_COMPILE should be the tool-chain that ASR uses to compile optee_os.

+	4.	Please add your own TAs and Host application like the hello_world example and make under the top directory.

+		Then the built TA is under out/ta and host application is under out/ca

+	

+How to install tool-chain of optee_os, please refer to

+	https://optee.readthedocs.io/en/latest/building/toolchains.html

+and confirm the tool-chain version with ASR.

+e.g.:

+	1.	Download gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz from:

+		https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads

+	2.	tar xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz -C aarch32 --strip-components=1

+	3.	export PATH=$PATH:$TOOLCHAIN/aarch32/bin
\ No newline at end of file
diff --git a/mbtk/optee_test/Makefile b/mbtk/optee_test/Makefile
new file mode 100755
index 0000000..3fee600
--- /dev/null
+++ b/mbtk/optee_test/Makefile
@@ -0,0 +1,48 @@
+export V ?= 0
+
+-include conf.mk
+
+OUTPUT_DIR := $(CURDIR)/out
+
+EXAMPLE_DIR := $(CURDIR)/../../marvell/services/optee_app/out
+
+EXAMPLE_LIST := $(subst /,,$(dir $(wildcard */Makefile)))
+
+.PHONY: all
+all: examples prepare-for-rootfs
+
+.PHONY: clean
+clean: examples-clean prepare-for-rootfs-clean
+
+examples:
+	@for example in $(EXAMPLE_LIST); do \
+		$(MAKE) -C $$example CROSS_COMPILE="$(HOST_CROSS_COMPILE)" TA_CROSS_COMPILE=$(TA_CROSS_COMPILE) \
+			TEEC_EXPORT=$(TEEC_EXPORT) TA_DEV_KIT_DIR=$(TA_DEV_KIT_DIR) PLATFORM=asr|| exit 1; \
+	done
+
+examples-clean:
+	@echo `pwd`
+	@for example in $(EXAMPLE_LIST); do \
+		$(MAKE) -C $$example TEEC_EXPORT=$(TEEC_EXPORT) TA_DEV_KIT_DIR=$(TA_DEV_KIT_DIR) clean || exit 1; \
+	done
+
+prepare-for-rootfs: examples
+	@echo "Copying example CA and TA binaries to $(OUTPUT_DIR)..."
+	@mkdir -p $(OUTPUT_DIR)
+	@mkdir -p $(OUTPUT_DIR)/ta
+	@mkdir -p $(OUTPUT_DIR)/ca
+	@for example in $(EXAMPLE_LIST); do \
+		if [ -e $$example/host/optee_example_$$example ]; then \
+			cp -p $$example/host/optee_example_$$example $(OUTPUT_DIR)/ca/; \
+		fi; \
+		cp -pr $$example/ta/*.ta $(OUTPUT_DIR)/ta/; \
+		echo "Copying ca and ta files to marvell/services/optee_app/out..."; \
+		cp -pr $(OUTPUT_DIR)/ca/* $(ASR_OWRT_DIR)/marvell/services/optee_app/out/ca/; \
+		cp -pr $(OUTPUT_DIR)/ta/*.ta $(ASR_OWRT_DIR)/marvell/services/optee_app/out/ta/; \
+	done
+
+prepare-for-rootfs-clean:
+	@rm -rf $(OUTPUT_DIR)/ta
+	@rm -rf $(OUTPUT_DIR)/ca
+	@rm -rf $(OUTPUT_DIR)/plugins
+	@rmdir --ignore-fail-on-non-empty $(OUTPUT_DIR) || test ! -e $(OUTPUT_DIR)
diff --git a/mbtk/optee_test/conf.mk b/mbtk/optee_test/conf.mk
new file mode 100755
index 0000000..c8d8c0c
--- /dev/null
+++ b/mbtk/optee_test/conf.mk
@@ -0,0 +1,8 @@
+ASR_OWRT_DIR = $(CURDIR)/../..

+ASR_TOS_DIR := $(ASR_OWRT_DIR)/marvell/services

+ASR_TOS_DIR_1 := $(ASR_OWRT_DIR)/package/services

+TA_DEV_KIT_DIR := $(ASR_TOS_DIR_1)/optee_os/export/asr18xx/export-ta_arm32

+TEEC_EXPORT := $(ASR_TOS_DIR)/optee_client/out/export/usr

+

+HOST_CROSS_COMPILE := $(ASR_OWRT_DIR)/mbtk/toolchain/linux64/bin/arm-openwrt-linux-gnueabi-

+TA_CROSS_COMPILE := $(ASR_OWRT_DIR)/mbtk/toolchain/gcc-arm-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-
\ No newline at end of file
diff --git a/mbtk/optee_test/hello_world/Makefile b/mbtk/optee_test/hello_world/Makefile
new file mode 100755
index 0000000..b188683
--- /dev/null
+++ b/mbtk/optee_test/hello_world/Makefile
@@ -0,0 +1,15 @@
+export V?=0
+
+# If _HOST or _TA specific compilers are not specified, then use CROSS_COMPILE
+HOST_CROSS_COMPILE ?= $(CROSS_COMPILE)
+TA_CROSS_COMPILE ?= $(CROSS_COMPILE)
+
+.PHONY: all
+all:
+	$(MAKE) -C host CROSS_COMPILE="$(HOST_CROSS_COMPILE)" --no-builtin-variables
+	$(MAKE) -C ta CROSS_COMPILE="$(TA_CROSS_COMPILE)" LDFLAGS=""
+
+.PHONY: clean
+clean:
+	$(MAKE) -C host clean
+	$(MAKE) -C ta clean
diff --git a/mbtk/ota_update b/mbtk/ota_update
new file mode 100755
index 0000000..97da56a
--- /dev/null
+++ b/mbtk/ota_update
Binary files differ
diff --git a/mbtk/rootfs/etc/init.d/mbtk_boot_eary b/mbtk/rootfs/etc/init.d/mbtk_boot_eary
new file mode 100755
index 0000000..e1ab3b6
--- /dev/null
+++ b/mbtk/rootfs/etc/init.d/mbtk_boot_eary
@@ -0,0 +1,109 @@
+#!/bin/sh
+
+#MBTK_ADB=`getprop persist.mbtk.adb 2> /dev/null`
+project=`cat /etc/mbtk_project`
+
+mbtk_start() {
+	echo "start : $1" > /dev/kmsg
+	
+	if [ -e $1 ];then
+		# stdout and stderr > /dev/null
+		#$@ &> /dev/null &
+		(while ! $@ &> /dev/null;           do echo "Restarting $@ ...";               done) &
+	fi
+}
+
+start_service() {
+	echo "--mbtk eary boot start--" > /dev/kmsg
+#	mbtk_start /bin/mbtk_test
+#	mbtk_start /bin/mbtk_test "eary" 123
+    # ɾ³ýÉÏ´Îgnss ÐÇÀú
+    if [ -f /etc/mbtk/rtm.bin ]
+    then
+	    echo "--mbtk eary boot rtm.bin " > /dev/kmsg
+        rm /etc/mbtk/rtm.bin
+    fi
+
+	mbtk_start /bin/mbtk_rild
+	
+	if [ -f /bin/mbtk_sdk_ready ]
+	then
+		mbtk_start /bin/mbtk_sdk_ready
+		echo "--mbtk platform mbtk_sdk_ready start--" > /dev/kmsg
+	fi
+	
+	if [ "$project" == "T108_2" ];then
+		i2cset -y -f 2 0x31 0x15 0x00
+		mbtk_start /bin/mbtk_gnssd 8122 /dev/ttyS3 0
+	elif [ "$project" == "L508_X6" ];then
+		mbtk_start /bin/mbtk_gnssd 5311 /dev/ttyS3 255
+	else
+		# Only auto open gnss but not open any port.
+		mbtk_start /bin/mbtk_gnssd 5311 /dev/ttyS2 255
+	fi
+
+	if [ "$project" == "L508_X6" -o "$project" == "L509" ]
+	then
+		#echo "$project"
+		i2cset -y -f 2 0x32 0x0d 0x00
+	fi
+
+	if [ "$project" == "T108_2" ]
+	then
+		i2cset -y -f 2 0x31 0x15 0x00
+	fi
+	echo "--mbtk eary boot end--" > /dev/kmsg
+}
+
+sleep_init()
+{
+	if [ -e /sys/devices/soc.0/d4000000.apb/mbtk-dev-op/gps_power ]
+	then
+		echo off  > /sys/devices/soc.0/d4000000.apb/mbtk-dev-op/gps_power
+	else
+		echo "/sys/devices/soc.0/d4000000.apb/mbtk-dev-op/gps_power can not write." > /dev/kmsg
+	fi
+	
+	if [ -e /sys/kernel/debug/spk_shdn_gpio ]
+	then
+		echo 0 > /sys/kernel/debug/spk_shdn_gpio
+	else
+		echo "/sys/kernel/debug/spk_shdn_gpio can not write." > /dev/kmsg
+	fi
+	
+	if [ -e /sys/devices/asr-rfkill.0/pwr_ctrl ]
+	then
+		echo 1 > /sys/devices/asr-rfkill.0/pwr_ctrl
+		sleep 1
+		echo 0 > /sys/devices/asr-rfkill.0/pwr_ctrl
+	else
+		echo "/sys/devices/asr-rfkill.0/pwr_ctrl can not write." > /dev/kmsg
+	fi
+
+	case "$project" in
+		PN1803)
+			echo 4 > /sys/class/gpio/export
+			echo out > /sys/class/gpio/gpio4/direction
+			echo 0 > /sys/class/gpio/gpio4/value
+			;;
+		L509)
+			echo 5 > /sys/class/gpio/export
+			echo out > /sys/class/gpio/gpio5/direction
+			echo 0 > /sys/class/gpio/gpio5/value
+			
+			echo 8 > /sys/class/gpio/export
+			echo out > /sys/class/gpio/gpio8/direction
+			echo 1 > /sys/class/gpio/gpio8/value
+			;;
+	esac
+	
+	if [ "$project" == "PN1803" -o "$project" == "L508" -o "$project" == "L509"]
+	then
+		echo 118 > /sys/class/gpio/export
+		echo out > /sys/class/gpio/gpio118/direction
+		echo 0 > /sys/class/gpio/gpio118/value
+	fi
+}
+
+start_service
+sleep_init
diff --git a/mbtk/rootfs/etc/init.d/mbtk_boot_last b/mbtk/rootfs/etc/init.d/mbtk_boot_last
new file mode 100755
index 0000000..e660b6c
--- /dev/null
+++ b/mbtk/rootfs/etc/init.d/mbtk_boot_last
@@ -0,0 +1,28 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006-2011 OpenWrt.org
+
+START=98
+USE_PROCD=1
+
+#MBTK_ADB=`getprop persist.mbtk.adb 2> /dev/null`
+
+mbtk_start() {
+	echo "start : $1" > /dev/kmsg
+
+	if [ -e $1 ];then
+		procd_open_instance
+		procd_set_param command $@
+		procd_close_instance
+	fi
+}
+
+start_service() {
+	echo "--mbtk last boot start--" > /dev/kmsg
+#	mbtk_start /bin/mbtk_test
+#	mbtk_start /bin/mbtk_test "last" 123
+	
+	[ -e /bin/mbtk_otad ] && mbtk_start /bin/mbtk_otad -a fota
+	
+	echo "--mbtk last boot end--" > /dev/kmsg
+}
+
diff --git a/mbtk/rootfs/etc/init.d/mbtk_boot_net_ready b/mbtk/rootfs/etc/init.d/mbtk_boot_net_ready
new file mode 100755
index 0000000..f00b0c2
--- /dev/null
+++ b/mbtk/rootfs/etc/init.d/mbtk_boot_net_ready
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+mbtk_start() {
+	echo "start : $1" > /dev/kmsg
+	
+	if [ -e $1 ];then
+		# stdout and stderr > /dev/null
+		#$@ &> /dev/null &
+		(while ! $@ &> /dev/null;           do echo "Restarting $@ ...";               done) &
+	fi
+}
+
+start_service() {
+	echo "--mbtk net ready boot start--" > /dev/kmsg
+
+	#mbtk_start /bin/mbtk_info_test
+
+
+	echo "--mbtk net ready boot end--" > /dev/kmsg
+}
+
+start_service
diff --git a/mbtk/rootfs/etc/init.d/mbtk_boot_normal b/mbtk/rootfs/etc/init.d/mbtk_boot_normal
new file mode 100755
index 0000000..5925837
--- /dev/null
+++ b/mbtk/rootfs/etc/init.d/mbtk_boot_normal
@@ -0,0 +1,36 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006-2011 OpenWrt.org
+
+START=15
+USE_PROCD=1
+
+#MBTK_ADB=`getprop persist.mbtk.adb 2> /dev/null`
+
+mbtk_start() {
+	echo "start : $1" > /dev/kmsg
+
+	procd_open_instance
+	procd_set_param command $@
+	procd_close_instance
+}
+
+mbtk_start_with_try() {
+	echo "start_with_try : $1" > /dev/kmsg
+
+	procd_open_instance
+	procd_set_param command $@
+	procd_set_param respawn 3600 3 0
+	procd_close_instance
+}
+
+start_service() {
+	echo "--mbtk normal boot start--" > /dev/kmsg
+#	mbtk_start /bin/mbtk_test
+#	mbtk_start /bin/mbtk_test "normal" 123
+	
+	[ -e /bin/mbtk_adbd ] && mbtk_start /bin/mbtk_adbd
+	[ -e /bin/mbtk_servicesd ] && mbtk_start_with_try /bin/mbtk_servicesd
+	
+	echo "--mbtk normal boot end--" > /dev/kmsg
+}
+
diff --git a/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready b/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready
new file mode 100755
index 0000000..7d50c92
--- /dev/null
+++ b/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+mbtk_start() {
+	echo "start : $1" > /dev/kmsg
+	
+	if [ -e $1 ];then
+		# stdout and stderr > /dev/null
+		#$@ &> /dev/null &
+		(while ! $@ &> /dev/null;           do echo "Restarting $@ ...";               done) &
+	fi
+}
+
+start_service() {
+	echo "--mbtk server ready boot start--" > /dev/kmsg
+
+	#mbtk_start /bin/mbtk_info_test
+	#mbtk_start /bin/mbtk_logd
+
+	echo "--mbtk server ready boot end--" > /dev/kmsg
+}
+
+start_service
diff --git a/mbtk/rootfs/etc/init.d/mbtk_platform_version b/mbtk/rootfs/etc/init.d/mbtk_platform_version
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/mbtk/rootfs/etc/init.d/mbtk_platform_version
diff --git a/mbtk/rootfs/etc/jacana_fw.bin b/mbtk/rootfs/etc/jacana_fw.bin
new file mode 100755
index 0000000..8685cc4
--- /dev/null
+++ b/mbtk/rootfs/etc/jacana_fw.bin
Binary files differ
diff --git a/mbtk/rootfs/etc/jacana_pvt.bin b/mbtk/rootfs/etc/jacana_pvt.bin
new file mode 100755
index 0000000..c97c12f
--- /dev/null
+++ b/mbtk/rootfs/etc/jacana_pvt.bin
Binary files differ
diff --git a/mbtk/rootfs/etc/mbtk/mbtk_log.json b/mbtk/rootfs/etc/mbtk/mbtk_log.json
new file mode 100755
index 0000000..663c923
--- /dev/null
+++ b/mbtk/rootfs/etc/mbtk/mbtk_log.json
@@ -0,0 +1,114 @@
+{
+    "logd": "enable",
+
+    /* (mandatory) alternate ring buffer list */
+    "buffer_list" :
+    [
+        {
+            "enable": 1,
+            /* (mandatory) alternate ring buffer name, 'main', 'system', 'events' */
+            "name" : "syslog",
+            /* log output format : log type, time, pid, tid, tag, msg */
+            /* log type : k->kernel, e->events, s->system, m->main */
+            /* (mandatory) log file path */
+            "log_file":"/var/log/sys_log.txt",
+            "emmc_protect": 0,
+            /* (optional) remote server ip and port */
+            /* "log_stream":"118.114.239.159:30177", */
+
+            /* (optional) rotate log every kbytes, default is unlimit */
+            "rotate_file_size":  1024,
+            /* (optional) max number of rotated logs,  -1 is unlimit */
+            "rotate_file_count": 5,
+
+            /* (optional) log format, default or csv */
+            "log_format":"default",
+            /* (mandatory) filter */
+            "filter_list" :
+            [
+                {
+                    /* (optional) priority, 'v(VERBOSE)', 'd(DEBUG)', 'i(INFO)', 'w(WARN)',  'e(ERROR)', 'f(FATAL)', '*(all)' */
+                    "priority":"d"
+                },
+                {
+                    "tag":"gnss_test",
+                    "priority":"*"
+                }
+            ]
+        },
+        {
+            "enable": 1,
+            "name" : "radio",
+            /* (mandatory) log file path */
+            "log_file":"/tmp/log/radio_log.txt",
+	    "emmc_protect": 0,
+            /* (optional) rotate log every kbytes, default is unlimit */
+            "rotate_file_size":  1024,
+            /* (optional) max number of rotated logs, -1 is unlimit */
+            "rotate_file_count": 8,
+
+            /* (optional) log format, default or csv */
+            "log_format":"default",
+            "filter_list" :
+            [
+                {
+                    "tag":"mbtk_api",
+                    "priority":"*"
+                },
+				{
+                    "tag":"MBTK_RIL",
+                    "priority":"*"
+                },
+				{
+                    "tag":"tcp_cli",
+                    "priority":"*"
+                },
+                {
+                    "priority":"e"
+                }
+            ]
+        },
+        {
+            "enable": 0,
+            "name" : "/dev/ttyS1",
+            /* (mandatory) log file path */
+            "log_file":"/tmp/log/uart_log.txt",
+	    "emmc_protect": 0,
+            /* (optional) rotate log every kbytes, default is unlimit */
+            "rotate_file_size":  8,
+            /* (optional) max number of rotated logs, -1 is unlimit */
+            "rotate_file_count": 8,
+
+            /* (optional) log format, default or csv */
+            "log_format":"default",
+            "filter_list" :
+            [
+                {
+                    "tag":"mbtk_uart",
+                    "priority":"*"
+                }
+            ]
+        },
+        {
+            "enable": 0,
+            "name" : "local_socket",
+            /* (mandatory) log file path */
+            "log_file":"/tmp/log/signal_log.txt",
+	    "emmc_protect": 0,
+            /* (optional) rotate log every kbytes, default is unlimit */
+            "rotate_file_size":  8,
+            /* (optional) max number of rotated logs, -1 is unlimit */
+            "rotate_file_count": 8,
+
+            /* (optional) log format, default or csv */
+            "log_format":"default",
+            "filter_list" :
+            [
+                {
+                    "tag":"mbtk_socket",
+                    "priority":"*"
+                }
+            ]
+        }
+    ]
+}
diff --git a/mbtk/rootfs/etc/mbtk_project b/mbtk/rootfs/etc/mbtk_project
new file mode 100755
index 0000000..01e912b
--- /dev/null
+++ b/mbtk/rootfs/etc/mbtk_project
@@ -0,0 +1 @@
+T108_2
diff --git a/mbtk/rootfs/etc/mbtk_wifi.sh b/mbtk/rootfs/etc/mbtk_wifi.sh
new file mode 100755
index 0000000..eef87de
--- /dev/null
+++ b/mbtk/rootfs/etc/mbtk_wifi.sh
@@ -0,0 +1,171 @@
+#!/bin/sh
+
+STA_NET_CONF=/etc/wifi/sta_network.conf
+
+function help()
+{
+	echo "mbtk_wifi.sh ap/sta start/stop"
+}
+
+function wifi_check()
+{
+	if [ ! -f /etc/wifi/aic8800_bsp.ko ];then
+		echo "No found file: /etc/wifi/aic8800_bsp.ko"
+		exit 1
+	fi
+	
+	if [ ! -f /etc/wifi/aic8800_fdrv.ko ];then
+		echo "No found file: /etc/wifi/aic8800_fdrv.ko"
+		exit 1
+	fi
+	
+	if [ ! -f /etc/wifi/hostapd.conf ];then
+		echo "No found file: /etc/wifi/hostapd.conf"
+		exit 1
+	fi
+	
+	if [ ! -f /etc/wifi/wpa_supplicant.conf ];then
+		echo "No found file: /etc/wifi/wpa_supplicant.conf"
+		exit 1
+	fi
+	
+	if [ ! -f $STA_NET_CONF ];then
+		echo "No found file: $STA_NET_CONF"
+		exit 1
+	fi
+}
+
+function driver_insmod()
+{
+	cfg80211_insmod=`lsmod | grep cfg80211`
+	if [ -z "$cfg80211_insmod" ];then
+		modprobe cfg80211
+	else
+		echo "cfg80211 has insmod."
+	fi
+	
+	aic8800_bsp_insmod=`lsmod | grep aic8800_bsp`
+	if [ -z "$aic8800_bsp_insmod" ];then
+		insmod /etc/wifi/aic8800_bsp.ko sdio_f0=0 sdio_clk=150000000
+	else
+		echo "aic8800_bsp has insmod."
+	fi
+	
+	aic8800_fdrv_insmod=`lsmod | grep aic8800_fdrv`
+	if [ -z "$aic8800_fdrv_insmod" ];then
+		insmod /etc/wifi/aic8800_fdrv.ko
+	else
+		echo "aic8800_fdrv has insmod."
+	fi
+}
+
+function driver_rmmod()
+{
+	aic8800_fdrv_insmod=`lsmod | grep aic8800_fdrv`
+	if [ -z "$aic8800_fdrv_insmod" ];then
+		echo "aic8800_fdrv not insmod."
+	else
+		rmmod aic8800_fdrv
+	fi
+	
+	aic8800_bsp_insmod=`lsmod | grep aic8800_bsp`
+	if [ -z "$aic8800_bsp_insmod" ];then
+		echo "aic8800_bsp not insmod."
+	else
+		rmmod aic8800_bsp
+	fi
+	
+	cfg80211_insmod=`lsmod | grep cfg80211`
+	if [ -z "$cfg80211_insmod" ];then
+		echo "cfg80211 not insmod."
+	else
+		rmmod cfg80211
+	fi
+}
+
+function wifi_ap_start()
+{
+	hostapd /etc/wifi/hostapd.conf -B
+	sleep 5s
+	
+	brctl addif br-lan wlan0
+	iptables -t nat -A POSTROUTING -o ccinet0 -j MASQUERADE --random
+}
+
+function wifi_ap_stop()
+{
+	killall hostapd
+}
+
+function wifi_sta_start()
+{
+	wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wifi/wpa_supplicant.conf -B
+	sleep 5s
+	
+	SSID=`cat $STA_NET_CONF | grep -w 'SSID'   | cut -d '=' -f 2`
+	PASSWORD=`cat $STA_NET_CONF | grep -w 'PASSWORD'   | cut -d '=' -f 2`
+	prefix=\"
+	subfix=\"
+	str1=$prefix$SSID$subfix
+	str2=$prefix$PASSWORD$subfix
+	
+	echo "SSID = $str1"
+	echo "PSK = $str2"
+
+	wpa_cli -p/var/run/wpa_supplicant remove_network 0
+	wpa_cli -p/var/run/wpa_supplicant ap_scan 1
+	wpa_cli -p/var/run/wpa_supplicant add_network
+	wpa_cli -p/var/run/wpa_supplicant set_network 0 ssid $str1
+	wpa_cli -p/var/run/wpa_supplicant set_network 0 key_mgmt WPA-PSK
+	wpa_cli -p/var/run/wpa_supplicant set_network 0 psk $str2
+	wpa_cli -p/var/run/wpa_supplicant select_network 0
+
+	udhcpc -i wlan0
+}
+
+function wifi_sta_stop()
+{
+	killall wpa_supplicant
+}
+
+wifi_check
+
+if [ -n "$2" ] ;then	#有参数
+	case "$1" in
+		ap)
+			case "$2" in
+				start)
+					driver_insmod
+					
+					wifi_ap_start
+					;;
+				stop)
+					wifi_ap_stop
+					;;
+				*)
+					help
+					;;
+			esac
+			;;
+		sta)
+			case "$2" in
+				start)
+					driver_insmod
+					
+					wifi_sta_start
+					;;
+				stop)
+					wifi_sta_stop
+					;;
+				*)
+					help
+					;;
+			esac
+			;;
+		*)
+            help
+			;;
+	esac
+else
+	help
+fi
\ No newline at end of file
diff --git a/mbtk/rootfs/etc/wifi/hostapd.accept b/mbtk/rootfs/etc/wifi/hostapd.accept
new file mode 100755
index 0000000..4331b6f
--- /dev/null
+++ b/mbtk/rootfs/etc/wifi/hostapd.accept
@@ -0,0 +1 @@
+DC:10:57:AA:BB:DF
\ No newline at end of file
diff --git a/mbtk/rootfs/etc/wifi/hostapd.conf b/mbtk/rootfs/etc/wifi/hostapd.conf
new file mode 100755
index 0000000..cdcdab7
--- /dev/null
+++ b/mbtk/rootfs/etc/wifi/hostapd.conf
@@ -0,0 +1,36 @@
+interface=wlan0
+#bridge=br0
+ssid=mbtk
+hw_mode=a
+channel=36
+auth_algs=1
+driver=nl80211
+wme_enabled=1
+wpa=2
+wpa_passphrase=12345678
+ieee80211n=1
+ieee80211ac=1
+ieee80211ax=1
+#ieee80211w=2
+vht_oper_chwidth=1
+vht_oper_centr_freq_seg0_idx=42
+#vht_oper_centr_freq_seg1_idx=4
+he_oper_chwidth=1
+he_oper_centr_freq_seg0_idx=42
+#he_oper_centr_freq_seg1_idx=8
+he_basic_mcs_nss_set=65534
+he_su_beamformee=1
+he_twt_required=0
+vht_capab=[SHORT-GI-80][VHT40+][VHT40-][MAX-A-MPDU-LEN-EXP7][RX-STBC-1][RX-LDPC]
+ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+][HT40-][LDPC][RX-STBC1]
+#wpa_key_mgmt=SAE
+wpa_key_mgmt=WPA-PSK
+rsn_pairwise=CCMP
+ignore_broadcast_ssid=0
+country_code=CN
+max_num_sta=32
+macaddr_acl=0
+deny_mac_file=/etc/wifi/hostapd.deny
+accept_mac_file=/etc/wifi/hostapd.accept
+ctrl_interface=/var/run/hostapd
+
diff --git a/mbtk/rootfs/etc/wifi/hostapd.deny b/mbtk/rootfs/etc/wifi/hostapd.deny
new file mode 100755
index 0000000..4331b6f
--- /dev/null
+++ b/mbtk/rootfs/etc/wifi/hostapd.deny
@@ -0,0 +1 @@
+DC:10:57:AA:BB:DF
\ No newline at end of file
diff --git a/mbtk/rootfs/etc/wifi/mbtk_wifi_driver.sh b/mbtk/rootfs/etc/wifi/mbtk_wifi_driver.sh
new file mode 100755
index 0000000..c4f955d
--- /dev/null
+++ b/mbtk/rootfs/etc/wifi/mbtk_wifi_driver.sh
@@ -0,0 +1,89 @@
+function driver_insmod()
+{
+	cfg80211_insmod=`lsmod | grep cfg80211`
+	if [ -z "$cfg80211_insmod" ];then
+		modprobe cfg80211
+	else
+		echo "cfg80211 has insmod."
+	fi
+	
+	aic8800_bsp_insmod=`lsmod | grep aic8800_bsp`
+	if [ -z "$aic8800_bsp_insmod" ];then
+		insmod /etc/wifi/aic8800_bsp.ko sdio_f0=0 sdio_clk=150000000
+	else
+		echo "aic8800_bsp has insmod."
+	fi
+	
+	aic8800_fdrv_insmod=`lsmod | grep aic8800_fdrv`
+	if [ -z "$aic8800_fdrv_insmod" ];then
+		insmod /etc/wifi/aic8800_fdrv.ko
+	else
+		echo "aic8800_fdrv has insmod."
+	fi
+}
+
+function driver_rmmod()
+{
+	aic8800_fdrv_insmod=`lsmod | grep aic8800_fdrv`
+	if [ -z "$aic8800_fdrv_insmod" ];then
+		echo "aic8800_fdrv not insmod."
+	else
+		rmmod aic8800_fdrv
+	fi
+	
+	aic8800_bsp_insmod=`lsmod | grep aic8800_bsp`
+	if [ -z "$aic8800_bsp_insmod" ];then
+		echo "aic8800_bsp not insmod."
+	else
+		rmmod aic8800_bsp
+	fi
+	
+	cfg80211_insmod=`lsmod | grep cfg80211`
+	if [ -z "$cfg80211_insmod" ];then
+		echo "cfg80211 not insmod."
+	else
+		rmmod cfg80211
+	fi
+}
+
+
+if [ -n "$2" ] ;then	#有参数
+	case "$1" in
+		ap)
+			case "$2" in
+				start)
+					driver_insmod
+					
+					#wifi_ap_start
+					;;
+				stop)
+					#wifi_ap_stop
+					;;
+				*)
+					help
+					;;
+			esac
+			;;
+		sta)
+			case "$2" in
+				start)
+					driver_insmod
+					
+					#wifi_sta_start
+					;;
+				stop)
+                    driver_rmmod
+					#wifi_sta_stop
+					;;
+				*)
+					help
+					;;
+			esac
+			;;
+		*)
+            help
+			;;
+	esac
+else
+	help
+fi
\ No newline at end of file
diff --git a/mbtk/rootfs/etc/wifi/sta_network.conf b/mbtk/rootfs/etc/wifi/sta_network.conf
new file mode 100755
index 0000000..2f31745
--- /dev/null
+++ b/mbtk/rootfs/etc/wifi/sta_network.conf
@@ -0,0 +1,2 @@
+SSID=MERCURY_7EBB
+PASSWORD=mbtk1234
diff --git a/mbtk/rootfs/etc/wifi/wpa_supplicant.conf b/mbtk/rootfs/etc/wifi/wpa_supplicant.conf
new file mode 100755
index 0000000..1994a6c
--- /dev/null
+++ b/mbtk/rootfs/etc/wifi/wpa_supplicant.conf
@@ -0,0 +1,6 @@
+ctrl_interface=/var/run/wpa_supplicant
+ap_scan=1
+
+network={
+  key_mgmt=NONE
+}
diff --git a/mbtk/test/Makefile b/mbtk/test/Makefile
new file mode 100755
index 0000000..d894df5
--- /dev/null
+++ b/mbtk/test/Makefile
@@ -0,0 +1,24 @@
+BUILD_ROOT = $(shell pwd)/..
+include $(BUILD_ROOT)/Make.defines
+
+#exclude_dirs := include bin
+#test_dirs := $(shell find . -maxdepth 1 -type d)
+#test_dirs := $(basename $(patsubst ./%,%,$(test_dirs)))
+#test_dirs := $(filter-out $(exclude_dirs),$(test_dirs))
+
+SUBDIRS := $(wildcard */)
+SUBDIRS_WITH_MAKEFILES := $(foreach dir,$(SUBDIRS),$(if $(wildcard $(dir)Makefile),$(dir),))
+ 
+all:
+	@echo DIR=$(SUBDIRS_WITH_MAKEFILES)
+	@for dir in $(SUBDIRS_WITH_MAKEFILES); do \
+		echo "Building $$dir"; \
+		$(MAKE) -C $$dir || exit 1; \
+	done
+
+clean:
+	@echo DIR=$(SUBDIRS_WITH_MAKEFILES)
+	@for i in $(SUBDIRS_WITH_MAKEFILES); do \
+		(cd $$i && echo "Cleaning $$i" && $(MAKE) clean) || exit 1; \
+	done
+	rm -rf $(OUT_DIR)
diff --git a/mbtk/test/liblynq_lib_t106/Makefile b/mbtk/test/liblynq_lib_t106/Makefile
new file mode 100755
index 0000000..5c7b64d
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/Makefile
@@ -0,0 +1,34 @@
+BUILD_ROOT = $(shell pwd)/../..
+include $(BUILD_ROOT)/Make.defines
+
+INC_DIR +=
+
+LIB_DIR +=
+
+LIBS += -lmbtk_lib -llynq_lib -ldl -llog -lubus -lubox -luci -lprop2uci -lrilutil -lblobmsg_json -ldl -lcutils -laudio-apu -lwpa_client
+
+CFLAGS = $(CFLAGS_TEST)
+
+DEFINE +=
+
+LOCAL_SRC_FILES = $(wildcard *.c) $(wildcard *.cpp)
+
+$(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES))
+
+OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(LOCAL_SRC_FILES)))
+BINS = $(patsubst %.o,%,$(OBJS))
+
+all: $(BINS)
+
+$(BINS):$(OBJS)
+	@echo "  BIN     $@"
+	$(CC) $(CFLAGS) $(LIB_DIR) $(LIBS) $@.o -o $(OUT_DIR)/bin/$@
+
+%.o:%.c
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+%.o:%.cpp
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+clean:
+	rm -f $(OBJS)
diff --git a/mbtk/test/liblynq_lib_t106/lynq-adc-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-adc-demo.cpp
new file mode 100755
index 0000000..375d7ea
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-adc-demo.cpp
@@ -0,0 +1,49 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <lynq/lynq-adc.h>
+
+void handle_adc(const char* adc_name, int adc_type)
+{
+    if (adc_name == NULL)
+    {
+        printf("Error: adc_name is a null pointer\n");
+        return;
+    }
+    int adc_value = qser_adc_show((ADC_CHANNEL_E)adc_type);
+    if (adc_value < 0)
+    {
+        printf("Error: Failed to get the value of %s\n", adc_name);
+        return;
+    }
+    printf("%s value: %d mV\n", adc_name, adc_value);
+}
+
+int main(int argc, char *argv[])
+{
+    if (argc != 2)
+    {
+        printf("Usage: %s <ADC0|ADC1|ADC2>\n", argv[0]);
+        return -1;
+    }
+
+    if (strcmp(argv[1], "ADC0") == 0)
+    {
+        handle_adc("ADC0", ADC0);
+    }
+    else if (strcmp(argv[1], "ADC1") == 0)
+    {
+        handle_adc("ADC1", ADC1);
+    }
+    else if (strcmp(argv[1], "ADC2") == 0)
+    {
+        handle_adc("ADC2", ADC2);
+    }
+    else
+    {
+        printf("Please enter valid parameters: ADC0|ADC1|ADC2\n");
+        return -1;
+    }
+
+    return 0;
+}
diff --git a/mbtk/test/liblynq_lib_t106/lynq-audio-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-audio-demo.cpp
new file mode 100755
index 0000000..c60480d
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-audio-demo.cpp
@@ -0,0 +1,164 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include "ring_tele.h"
+#include <lynq/lynq-qser-audio.h>
+
+
+static int playback_handle = 1;
+
+void player_cmd_proc(char *cmdstr)
+{
+    if (strcmp(cmdstr, "P\n") == 0)
+    {
+        qser_AudPlayer_Pause(playback_handle);
+    }
+    else if (strcmp(cmdstr, "R\n") == 0)
+    {
+        qser_AudPlayer_Resume(playback_handle);
+    }
+    else if (strcmp(cmdstr, "T\n") == 0)
+    {
+        qser_AudPlayer_Stop(playback_handle);
+    }
+    else
+    {
+        printf("Unknown command: %s", cmdstr);
+    }
+}
+
+void capture_cmd_proc(char *cmdstr)
+{
+    if (strcmp(cmdstr, "P\n") == 0)
+    {
+        qser_AudRecorder_Pause();
+    }
+    else if (strcmp(cmdstr, "R\n") == 0)
+    {
+        qser_AudRecorder_Resume();
+    }
+    else if (strcmp(cmdstr, "T\n") == 0)
+    {
+        qser_AudRecorder_Stop();
+    }
+    else
+    {
+        printf("Unknown command: %s", cmdstr);
+    }
+}
+
+int main(int argc, char *argv[])
+{
+    if (argc < 2)
+    {
+        printf("Usage: %s <play|recd|playbuf> [file]\n", argv[0]);
+        return 1;
+    }
+
+    const char *action = argv[1];
+    const char *file = argv[2];
+
+    int g_audio_owner_id = 0;
+    char player_device[] = "device1";
+    char recorder_device[] = "device2";
+    char cmdstr[256];
+
+    _cb_onPlayer cb_fun = [](int result)
+    {
+        if (result == 0)
+        {
+            printf("Audio recorder opened successfully.\n");
+        }
+        else
+        {
+            printf("Failed to open audio recorder, error code: %d\n", result);
+        }
+    };
+
+    if (strcmp(action, "playbuf") == 0)
+    {
+        int player_open_result = qser_AudPlayer_Open(player_device, cb_fun);
+        if (player_open_result != 0)
+        {
+            printf("Failed to open audio player.\n");
+            return 1;
+        }
+        qser_AudPlayer_PlayPcmBuf(PCM_DATA, PCM_DATA_SIZE, 640, 3, 1, 8000, g_audio_owner_id);
+        while (1)
+        {
+            printf("Please input a player command (P/R/T/exit) :\n");
+            if (fgets(cmdstr, sizeof(cmdstr), stdin) != NULL)
+            {
+                if (strcmp(cmdstr, "exit\n") == 0)
+                {
+                    qser_AudPlayer_Close(playback_handle);
+                    break;
+                }
+                player_cmd_proc(cmdstr);
+            }
+        }
+        qser_AudPlayer_Close(playback_handle);
+    }
+    else if (strcmp(action, "play") == 0)
+    {
+        int player_open_result = qser_AudPlayer_Open(player_device, cb_fun);
+        if (player_open_result != 0)
+        {
+            printf("Failed to open audio player.\n");
+            return 1;
+        }
+
+        qser_AudPlayer_PlayFrmFile(g_audio_owner_id, file, 0);
+
+        while (1)
+        {
+            printf("Please input a player command (P/R/T/exit) :\n");
+            if (fgets(cmdstr, sizeof(cmdstr), stdin) != NULL)
+            {
+                if (strcmp(cmdstr, "exit\n") == 0)
+                {
+                    qser_AudPlayer_Close(playback_handle);
+                    break;
+                }
+                player_cmd_proc(cmdstr);
+            }
+        }
+
+        qser_AudPlayer_Close(playback_handle);
+    }
+    else if (strcmp(action, "recd") == 0)
+    {
+        int recorder_open_result = qser_AudRecorder_Open(recorder_device, cb_fun);
+        if (recorder_open_result != 0) {
+            printf("Failed to open audio recorder.\n");
+            return 1;
+        }
+
+        qser_AudRecorder_StartRecord(g_audio_owner_id, file, 0);
+
+        while (1)
+        {
+            printf("Please input a player command (P/R/T/exit) :\n");
+            if (fgets(cmdstr, sizeof(cmdstr), stdin) != NULL)
+            {
+                if (strcmp(cmdstr, "exit\n") == 0)
+                {
+                    qser_AudRecorder_Close();
+                    break;
+                }
+                capture_cmd_proc(cmdstr);
+            }
+        }
+        qser_AudRecorder_Close();
+    }
+    else
+    {
+        printf("Unknown action: %s\n", action);
+        return 1;
+    }
+
+    qser_Audio_Deinit();
+
+    return 0;
+}
diff --git a/mbtk/test/liblynq_lib_t106/lynq-gpio-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-gpio-demo.cpp
new file mode 100755
index 0000000..bb847c1
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-gpio-demo.cpp
@@ -0,0 +1,170 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <lynq/lynq-gpio.h>
+
+static void printUsage(void)
+{
+    printf("-ds  [direction]                    --lynq_gpio_direction_set\n");
+    printf("-vs  [value]                        --lynq_gpio_value_set\n");
+    printf("-ps  [pullsel]                      --lynq_gpio_pullsel_set\n");
+    printf("-vg                                --lynq_gpio_value_get\n");
+    printf("-pg                                 --lynq_gpio_pullsel_get\n");
+    printf("-quit\n");
+    printf("Please input an cmd:");
+}
+
+
+
+
+int main(int argc,char** argv)
+{
+    int ret;
+    int gpio;
+    int direction;
+    int value;
+    int pullsel;
+    char cmd[16];
+    char *cmd2;
+    char *cmd1;
+
+    if(argc != 2)
+    {
+        printf("wrong input format, please inout lynq-irq-demo <gpio>\n");
+        return -1;
+    }
+    gpio = atoi(argv[1]);
+    printf("gpio is %d\n", gpio);
+    ret = lynq_gpio_init(gpio, 0, 0, 0);
+    if(ret != 0)
+    {
+        printf("lynq_gpio_init fail\n");
+        return -1;
+    }
+    else
+    {
+        printf("lynq_gpio_init success\n");
+    }
+
+    while(1)
+    {
+        printUsage();
+        memset(cmd,0,sizeof(cmd));
+        if(NULL == fgets(cmd, sizeof(cmd), stdin))
+            break;
+        printf("cmd:%s\n",cmd);
+        cmd1 = strtok(cmd, " ");
+        cmd2 = strtok(NULL, " ");
+        if(strcmp(cmd1,"-ds") == 0)
+        {
+            if(cmd2 == NULL)
+            {
+                printf("direction is NULL\n");
+                continue;
+            }
+            direction = atoi(cmd2);
+            ret = lynq_gpio_direction_set(gpio, direction);
+            if(ret != 0)
+            {
+                printf("lynq_gpio_direction_set fail\n");
+            }
+            else
+            {
+                printf("lynq_gpio_direction_set success\n");
+            }
+        }
+
+        else if(strcmp(cmd1,"-vs") == 0)
+        {
+            if(cmd2 == NULL)
+            {
+                printf("wake_state is NULL\n");
+                continue;
+            }
+            value = atoi(cmd2);
+            ret = lynq_gpio_value_set(gpio, value);
+            if(ret < 0)
+            {
+                printf("lynq_gpio_value_set fail\n");
+            }
+            else
+            {
+                printf("lynq_gpio_value_set success\n");
+            }
+        }
+
+        else if (strcmp(cmd1,"-ps") == 0)
+        {
+            if(cmd2 == NULL)
+            {
+                printf("pullsel is NULL\n");
+                continue;
+            }
+            pullsel = atoi(cmd2);
+            ret = lynq_gpio_pullsel_set(gpio, pullsel);
+            if(ret != 0)
+            {
+                printf("lynq_gpio_pullsel_set fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("lynq_gpio_pullsel_set success\n");
+            }
+        }
+        else if (strcmp(cmd1,"-vg\n") == 0)
+        {
+            ret = lynq_gpio_value_get(gpio);
+            if(ret < 0)
+            {
+                printf("lynq_gpio_value_get fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("lynq_gpio_value_get success\n");
+                printf("ret=%d\n", ret);
+            }
+        }
+        else if(strcmp(cmd1,"-pg\n") == 0)
+        {
+            ret = lynq_gpio_pullsel_get(gpio);
+            if(ret < 0)
+            {
+                printf("lynq_gpio_pullsel_get fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("lynq_gpio_pullsel_get success\n");
+                printf("ret=%d\n", ret);
+            }
+        }
+        else if(strcmp(cmd1,"-quit\n") == 0)
+        {
+            break;
+        }
+        else
+        {
+            printf("wrong input format\n");
+        }
+
+
+    }
+
+
+    ret = lynq_gpio_deinit(gpio);
+    if(ret != 0)
+    {
+        printf("lynq_gpio_deinit fail\n");
+        printf("ret=%d\n", ret);
+    }
+    else
+    {
+        printf("lynq_gpio_deinit success\n");
+    }
+
+    return 0;
+
+}
diff --git a/mbtk/test/liblynq_lib_t106/lynq-irq-demo.cc b/mbtk/test/liblynq_lib_t106/lynq-irq-demo.cc
new file mode 100755
index 0000000..eddb286
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-irq-demo.cc
@@ -0,0 +1,159 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <pthread.h>
+#include <lynq/lynq-irq.h>
+
+
+#define CMD_SET_WAKE    "set_wake"
+#define CMD_GET_WAKE    "get_wake\n"
+#define CMD_SET_TYPE    "set_type"
+#define CMD_GET_TYPE    "get_type\n"
+#define CMD_UNINSTALL   "uninstall\n"
+#define CMD_QUIT_TEST   "quit\n"
+
+int line;
+
+
+static void printUsage(void)
+{
+    printf("Usage:\n");
+    printf("-set_wake <en>\n");
+    printf("-set_type <en>\n");
+    printf("-get_type\n");
+    printf("-get_wake\n");
+    printf("-uninstall\n");
+    printf("-quit\n");
+    printf("Please input an cmd:");
+}
+
+
+static void irq_test_handler(void)
+{
+    int trig_type;
+    trig_type = lynq_irq_get_type(line);
+    printf("this is irq_test_handler\nthis irq is gpio %d,trig_type is %d\n", line_gpio[line], trig_type);
+//    return NULL;
+}
+
+
+int main(int argc, char** argv)
+{
+    int ret;
+    int irq;
+    int trig_type;
+    int en;
+    char cmd[16];
+    char *cmd2;
+    char *cmd1;
+
+    if(argc != 3)
+    {
+        printf("wrong input format, please inout lynq-irq-demo <irq_line> <trig_type/wake_state> \n");
+        return -1;
+    }
+    irq = atoi(argv[1]);
+    trig_type = atoi(argv[2]);
+    ret = lynq_irq_install(irq, irq_test_handler, trig_type);
+    if(ret != 0)
+    {
+        printf("lynq_irq_install fail\n");
+        return 0;
+    }
+    else
+    {
+        printf("lynq_irq_install success\n");
+        line = irq;
+    }
+
+    while(1)
+    {
+        printUsage();
+        memset(cmd,0,sizeof(cmd));
+        fgets(cmd, sizeof(cmd), stdin);
+        printf("cmd:%s\n",cmd);
+        cmd1 = strtok(cmd, " ");
+        cmd2 = strtok(NULL, " ");
+        if(strcmp(cmd1, CMD_SET_WAKE) == 0)
+        {
+            if(cmd2 == NULL)
+            {
+                printf("wake_state is NULL\n");
+                break;
+            }
+            en = atoi(cmd2);
+            ret = lynq_irq_set_wake(irq, en);
+            if(ret < 0)
+            {
+                printf("lynq_irq_set_wake fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("lynq_irq_set_wake success\n");
+                printf("ret=%d\n", ret);
+            }
+        }
+        else if(strcmp(cmd1, CMD_GET_WAKE) == 0)
+        {
+            ret = lynq_irq_get_wake(irq);
+            printf("lynq_irq_get_wake ret %d\n", ret);
+        }
+        else if(strcmp(cmd1, CMD_SET_TYPE) == 0)
+        {
+            if(cmd2 == NULL)
+            {
+                printf("trig_type is NULL\n");
+                break;
+            }
+            trig_type = atoi(cmd2);
+            ret = lynq_irq_set_type(line, trig_type);
+            if(ret < 0)
+            {
+                printf("lynq_irq_set_type fail\n");
+            }
+            else
+            {
+                printf("lynq_irq_set_type success\n");
+            }
+        }
+        else if(strcmp(cmd1, CMD_GET_TYPE) == 0)
+        {
+            ret = lynq_irq_get_type(irq);
+            printf("lynq_irq_get_type ret %d\n", ret);
+        }
+        else if(strcmp(cmd1, CMD_UNINSTALL) == 0)
+        {
+            ret = lynq_irq_uninstall(irq);
+            if(ret != 0)
+            {
+                printf("lynq_irq_uninstall fail\n");
+            }
+            else
+            {
+                printf("lynq_irq_uninstall success\n");
+            }
+        }
+        else if(strcmp(cmd1, CMD_QUIT_TEST) == 0)
+        {
+            ret = lynq_irq_uninstall(irq);
+            if(ret != 0)
+            {
+                printf("lynq_irq_uninstall fail\n");
+            }
+            else
+            {
+                printf("lynq_irq_uninstall success\n");
+            }
+            break;
+        }
+        else
+        {
+            printf("wrong input format\n");
+        }
+    }
+
+    return 0;
+}
+
+
diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-autosuspend-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-qser-autosuspend-demo.cpp
new file mode 100755
index 0000000..e8c4ca8
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-autosuspend-demo.cpp
@@ -0,0 +1,303 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <lynq/lynq-qser-autosuspend.h>
+
+#define FILE_LOCK_TABLE "/tmp/.lock_table"
+
+#define MAX_LOCK_NUM 128
+
+static void qser_lpm_handler(qser_lpm_edge_t edge_state)
+{
+    printf("this is qser_lpm_handler, edge_state=%d\n", edge_state);
+
+}
+
+static void printUsage(void)
+{
+    printf("-i                  --qser_lpm_init\n");
+    printf("-d                  --qser_lpm_deinit\n");
+    printf("-q                  --quit\n");
+    printf("-e                  --qser_autosuspend_enable\n");
+    printf("-cl [wakelock name] --qser_wakelock_create \n");
+    printf("-al [wakelock num]  --qser_wakelock_lock \n");
+    printf("-rl [wakelock num]  --qser_wakelock_unlock \n");
+    printf("-dl [wakelock num]  --qser_wakelock_destroy\n");
+    printf("-ws [whitelist num] --qser_whitelist_set\n");
+    printf("-wg                 --qser_whitelist_get\n");
+    printf("-ccl                --check created locks\n");
+    printf("-cll                --check lockup locks\n");
+    printf("-cws                --check wakeup sources\n");
+    printf("Please input an cmd:");
+}
+
+
+int check_lock(void)
+{
+//    int err;
+    int file_fd;
+    int i;
+    int ret;
+    LOCK_TABLE lock_status;
+    file_fd = open(FILE_LOCK_TABLE,O_RDWR);
+    if(file_fd < 0)
+    {
+//        err = errno;
+        printf("Error open lock_table file:%s\n", strerror(errno));
+        return -2;
+    }
+
+    memset(&lock_status, 0, sizeof(lock_status));
+    lseek(file_fd,0,SEEK_SET);
+    ret = read(file_fd,(unsigned char *)&lock_status,sizeof(lock_status));
+    if(ret <= 0)
+    {
+        close(file_fd);
+        return -2;
+    }
+    for(i=0;i<MAX_LOCK_NUM;i++)
+    {
+        if(strlen(lock_status.lock_name[i]) != 0)
+        {
+            printf("fd: %d lock_name:%s strlen:%d, pid=%d\n", i, lock_status.lock_name[i], strlen(lock_status.lock_name[i]), lock_status.lock_pid[i]);
+        }
+    }
+
+    close(file_fd);
+    return 0;
+
+}
+
+
+void delete_enter(char *data)
+{
+    char *find = strchr(data, '\n');
+    if(find)
+        *find = '\0';
+    return ;
+}
+
+int main(int argc,char** argv)
+{
+
+    int num;
+    int ret;
+    int len;
+    FILE *fp;
+    char buf[256];
+    char cmd[64];
+    char *cmd2;
+    char *cmd1;
+    char tmp[8];
+    qser_pm_cfg_t *qser_lpm_cfg = NULL;
+    qser_lpm_cfg = (qser_pm_cfg_t *)malloc(sizeof(qser_pm_cfg_t));
+    qser_lpm_cfg->wakeupin.wakeupin_pin = 50;
+    qser_lpm_cfg->wakeupin.wakeupin_edge = E_QL_LPM_FALLING;
+    while(1)
+    {
+        printUsage();
+        memset(cmd,0,sizeof(cmd));
+        if(NULL == fgets(cmd, sizeof(cmd), stdin))
+            break;
+        cmd1 = strtok(cmd, " ");
+        cmd2 = strtok(NULL, " ");
+        delete_enter(cmd1);
+        printf("cmd1:%s\n", cmd1);
+        if(strcmp(cmd1,"-i") == 0)
+        {
+            ret = qser_lpm_init( qser_lpm_handler, qser_lpm_cfg);
+            if(ret != 0)
+            {
+                printf("lpm init fail\n");
+                break;
+            }
+            else
+            {
+                printf("lpm init success\n");
+            }
+        }
+        else if(strcmp(cmd1,"-e") == 0)
+        {
+            char num='1';
+            ret = qser_autosuspend_enable(num);
+            if(ret != 0)
+            {
+                printf("qser_autosuspend_enable fail\n");
+            }
+            else
+            {
+                printf("qser_autosuspend_enable success\n");
+            }
+        }
+        else if(strcmp(cmd1,"-cl") == 0)
+        {
+            if(cmd2 == NULL)
+            {
+                printf("name is null\n");
+                continue;
+            }
+            len = strlen(cmd2);
+            printf("len =%d\n", len);
+            ret = qser_wakelock_create(cmd2, len);
+            if(ret < 0)
+            {
+                printf("wakelock create fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("wakelock create success\n");
+                printf("fd=%d\n", ret);
+            }
+        }
+        else if (strcmp(cmd1,"-al") == 0)
+        {
+             if(cmd2 == NULL)
+            {
+                printf("fd is null\n");
+                continue;
+            }
+            num = atoi(cmd2);
+            ret = qser_wakelock_lock(num);
+            if(ret != 0)
+            {
+                printf("wakelock lock fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("wakelock lock success\n");
+            }
+        }
+
+        else if (strcmp(cmd1,"-rl") == 0)
+        {
+            if(cmd2 == NULL)
+            {
+                printf("fd is null\n");
+                continue;
+            }
+            num = atoi(cmd2);
+            ret = qser_wakelock_unlock(num);
+            if(ret != 0)
+            {
+                printf("wakelock unlock fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("wakelock unlock success\n");
+            }
+        }
+        else if(strcmp(cmd1,"-dl") == 0)
+        {
+            if(cmd2 == NULL)
+            {
+                printf("fd is null\n");
+                continue;
+            }
+            num = atoi(cmd2);
+            ret = qser_wakelock_destroy(num);
+            if(ret != 0)
+            {
+                printf("wakelock destroy fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("wakelock destroy success\n");
+            }
+        }
+        else if(strcmp(cmd1, "-ws") == 0)
+        {
+            if(cmd2 == NULL)
+            {
+                printf("num is null\n");
+                continue;
+            }
+            delete_enter(cmd2);
+            ret = qser_whitelist_set(cmd2);
+            if(ret != 0)
+            {
+                printf("qser_whitlist_set fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("qser_whitlist_set success\n");
+            }
+        }
+        else if(strcmp(cmd1, "-wg") == 0)
+        {
+            ret = qser_whitelist_get(tmp);
+            if(ret != 0)
+            {
+                printf("qser_whitlist_set fail\n");
+            }
+            else
+            {
+                printf("qser_whitlist_set success\n");
+                printf("ret=%d, whilelist state is %s\n", ret, tmp);
+            }
+        }
+        else if(strcmp(cmd1,"-ccl") == 0)
+        {
+            int ret;
+            ret = check_lock();
+            if(ret != 0)
+            {
+                printf("check lock fail\n");
+                printf("ret=%d\n", ret);
+            }
+            else
+            {
+                printf("check lock success\n");
+            }
+        }
+        else if(strcmp(cmd1,"-cll") == 0)
+        {
+            int ret;
+            ret = system("cat /sys/power/wake_lock");
+            if(ret != 0)
+            {
+                printf("check created lock fail\n");
+            }
+        }
+        else if(strcmp(cmd1,"-cws") == 0)
+        {
+            printf("start check active wakeup_sources  !!!\n");
+            memset(buf,0,sizeof(buf));
+            fp = popen("cat /sys/kernel/debug/wakeup_sources|sed -e 's/\"^ \"/\"unnamed\"/g' | awk '{print $6 \"\t\" $1}'| grep -v \"^0\" |sort -n \n","r");
+            while(fgets(buf, 255, fp) != NULL)
+            {
+                printf("%s", buf);
+            }
+            pclose(fp);
+        }
+        else if(strcmp(cmd1, "-d") == 0)
+        {
+            ret = qser_lpm_deinit();
+            if(ret != 0)
+            {
+                printf("lpm deinit fail\n");
+            }
+            else
+            {
+                printf("lpm deinit success\n");
+            }
+        }
+        else if(strcmp(cmd1,"-q") == 0)
+        {
+            break;
+        }
+    }
+
+    return 0;
+
+}
diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-data-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-qser-data-demo.cpp
new file mode 100755
index 0000000..757af0c
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-data-demo.cpp
@@ -0,0 +1,200 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <sys/socket.h>

+#include <netinet/in.h>

+#include <arpa/inet.h>

+#include <dlfcn.h>

+#include <errno.h>

+#include <sys/un.h>

+#include <ctype.h>

+#include <unistd.h>

+#include <lynq/lynq_qser_data.h>

+

+#define MAX_COMMAND_LEN 10

+

+

+void evt_cb(qser_data_call_state_s *state);

+int qser_init_data();

+int qser_deinit_data();

+int data_demo_auto_test(char *apn_name1, char *apn_name2);

+

+qser_data_call_state_s state = {0};

+

+void delete_enter(char data[])

+{

+    char *find = strchr(data, '\n');

+    if(find)

+        *find = '\0';

+    return ;

+}

+void printf_help(void)

+{

+    printf("*******************************User Guide*************************************************\n");

+    printf("usage: lynq-qser-data-demo <apn_name> <apn_type>\n");

+    printf("Example: lynq-qser-data-demo cmwap lynq_apn1\n");

+    printf("*******************************************************************************************\n");

+    return;

+}

+

+/**

+ * @brief qser data call demo entry function.

+ *

+ * @detail This example will take a complete data process

+ *         and show you how to call the API in liblynq-qser-data.

+ */

+int main(int argc, char *argv[])

+{

+    int ret;

+

+    printf("[%s] [%d] entry !\n", __FUNCTION__, __LINE__);

+    printf("[DATA_DEMO]lynq-qser-data-demo entry !\n");

+

+	if(argc != 3)

+    {

+        printf_help();

+        exit(EXIT_FAILURE);

+    }

+

+	//do initialization

+    ret = qser_data_call_init(evt_cb);

+    if(0 != ret)

+    {

+        printf("initial failed !\n");

+	    return -1;

+    }

+

+	data_demo_auto_test(argv[1], argv[2]);

+	qser_data_call_destroy();

+

+	return 0;

+}

+

+//demo示例拨两路apn,一路使用默认apn配置拨号访问公网,另一路建议为私网配置

+int data_demo_auto_test(char *apn_name1, char *apn_type)

+{

+	int ret = 0;

+	char command[MAX_COMMAND_LEN] = {'\0'};

+	bool apn_test1_need_insert = true;

+	unsigned char profile_idx_char1;

+	qser_apn_add_s apn_test1 = {QSER_APN_PDP_TYPE_IPV4V6, QSER_APN_AUTH_PROTO_DEFAULT, {'\0'}, {'\0'}, {'\0'}, {'\0'}};

+	qser_data_call_s apn_normal_datacall;

+	qser_data_call_s apn_test1_datacall;

+    qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;

+

+	memcpy(apn_test1.apn_type,apn_type,QSER_APN_NAME_SIZE);

+	memcpy(apn_test1.apn_name,apn_name1,QSER_APN_NAME_SIZE);

+

+	//1、检查apn是否存在

+	qser_apn_info_list_s apn_list = {0};

+    ret = qser_apn_get_list(&apn_list);

+	if(ret != 0)

+	{

+		printf("\n get apn list error\n");

+		return -1;

+	}

+    for(int i = 0; i < apn_list.cnt; i++)

+    {

+        printf("data_demo_auto_test: pdp_type=%d, auth_proto=%d, apn_name=%s, username=%s, password=%s, apn_type=%s\n"

+            ,apn_list.apn[i].pdp_type, apn_list.apn[i].auth_proto, apn_list.apn[i].apn_name, apn_list.apn[i].username, apn_list.apn[i].password, apn_list.apn[i].apn_type);

+

+		if( apn_list.apn[i].pdp_type == apn_test1.pdp_type

+			&& apn_list.apn[i].auth_proto == apn_test1.auth_proto

+			&& (strcmp(apn_list.apn[i].apn_name, apn_test1.apn_name) == 0)

+			&& (strcmp(apn_list.apn[i].username, apn_test1.username) == 0)

+			&& (strcmp(apn_list.apn[i].password, apn_test1.password) == 0)

+			&& (strcmp(apn_list.apn[i].apn_type, apn_test1.apn_type) == 0)

+			)

+		{

+			profile_idx_char1 = apn_list.apn[i].profile_idx;

+			apn_test1_need_insert = false;

+		}

+	}

+	//2、若不存在,插入apn

+	if(apn_test1_need_insert)

+	{

+		ret = qser_apn_add(&apn_test1, &profile_idx_char1);

+		if(ret != 0)

+		{

+			printf("\n add apn error\n");

+			return -1;

+		}

+	}

+	//3、拨号

+	apn_normal_datacall.profile_idx = 0;//默认apn profile_idx

+	apn_test1_datacall.profile_idx = profile_idx_char1;

+	//拨号时实际使用的ip_name,userdata,password等配置以apn信息中的为准,不使用datacall中的配置

+	ret = qser_data_call_start(&apn_normal_datacall, &err);//默认apn拨号

+	if(ret != 0)

+	{

+		printf("\nERROR: setup data call fail!!!\n");

+		return -1;

+	}

+

+	ret = qser_data_call_start(&apn_test1_datacall, &err);

+	if(ret != 0)

+	{

+		printf("\nERROR: setup data call fail!!!\n");

+		return -1;

+	}

+

+	printf("\n[DATA_DEMO]Enter --exit to exit data demo\n");

+	while(1)

+	{

+		if(NULL == fgets(command , MAX_COMMAND_LEN, stdin))

+            break;

+		delete_enter(command);

+		if(strcmp(command,"--exit") == 0)

+		{

+			break;

+		}

+		else

+		{

+			printf("\n[DATA_DEMO]Enter --exit to  deactive data call and exit data demo\n");

+		}

+	}

+

+	//4、去激活

+	//去激活时有效入参仅为profile_idx

+	ret = qser_data_call_stop(apn_normal_datacall.profile_idx, apn_normal_datacall.ip_family, &err);

+	if(ret < 0)

+	{

+		printf("\nERROR: deactive data call fail!!!\n");

+		return -1;

+	}

+	ret = qser_data_call_stop(apn_test1_datacall.profile_idx, apn_test1_datacall.ip_family, &err);

+	if(ret < 0)

+	{

+		printf("\nERROR: deactive data call fail!!!\n");

+		return -1;

+	}

+	return 0;

+}

+void evt_cb(qser_data_call_state_s *state)

+{

+    char buf_ip[64] = {0};

+    char buf_gateway[64] = {0};

+    char buf_pri_dns[64] = {0};

+    char buf_sec_dns[64] = {0};

+    printf("DATA_DEMO_CALL_BACK: profile_idx=%d, name=%s, ip_family=%d, state=%d, error=%d\n"

+        , state->profile_idx, state->name, state->ip_family, state->state, state->err);

+    #if 1

+    printf("DATA_DEMO_CALL_BACK: v4.ip=%s\n"

+        , inet_ntoa(state->v4.ip));

+    printf("DATA_DEMO_CALL_BACK: v4.gateway=%s\n"

+        , inet_ntoa(state->v4.gateway));

+    printf("DATA_DEMO_CALL_BACK: v4.pri_dns=%s\n"

+        , inet_ntoa(state->v4.pri_dns));

+    printf("DATA_DEMO_CALL_BACK: v4.sec_dns=%s\n"

+        , inet_ntoa(state->v4.sec_dns));

+    inet_ntop(AF_INET6, &(state->v6.ip), buf_ip, sizeof(buf_ip));

+    inet_ntop(AF_INET6, &(state->v6.gateway), buf_gateway, sizeof(buf_gateway));

+    inet_ntop(AF_INET6, &(state->v6.pri_dns), buf_pri_dns, sizeof(buf_pri_dns));

+    inet_ntop(AF_INET6, &(state->v6.sec_dns), buf_sec_dns, sizeof(buf_sec_dns));

+    printf("DATA_DEMO_CALL_BACK: v6.ip=%s\n", buf_ip);

+    printf("DATA_DEMO_CALL_BACK: v6.gateway=%s\n", buf_gateway);

+    printf("DATA_DEMO_CALL_BACK: v6.pri_dns=%s\n", buf_pri_dns);

+    printf("DATA_DEMO_CALL_BACK: v6.sec_dns=%s\n", buf_sec_dns);

+    #endif

+	//后续对回调函数中返回值的处理建议放在其它线程中进行,避免阻塞在回调函数中影响后续消息上报

+}

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-fota-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-qser-fota-demo.cpp
new file mode 100755
index 0000000..efdf5d5
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-fota-demo.cpp
@@ -0,0 +1,137 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/types.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+#include <pthread.h>

+

+int (*lynq_get_upgrade_status)(void);

+int (*lynq_fota_set_addr_value)(char *value,int size);

+int (*lynq_fota_nrestart)(void);

+int (*lynq_rock_main)(int first_run);

+int (*lynq_read_process)(void);

+void *dlHandle_fota = NULL;

+

+void *thread_function_noreboot(void *arg)

+{

+

+        lynq_fota_nrestart();

+        return NULL;

+}

+

+void *thread_function_reboot(void *arg)

+{

+

+        lynq_rock_main(1);

+        return NULL;

+}

+

+

+int main(int argc,char *argv[])

+{

+    int ret = 0;

+    int reboot_flag;

+    char *value = argv[1];

+    printf("Enter main function\n");

+

+    const char *lynqLibPath_fota = "/lib/liblynq-fota.so";

+    dlHandle_fota = dlopen(lynqLibPath_fota, RTLD_NOW);

+    if (dlHandle_fota == NULL)

+    {

+        printf("dlopen dlHandle_fota failed: %s\n", dlerror());

+        return -1;

+    }

+

+    lynq_fota_set_addr_value = (int (*)(char *value,int size))dlsym(dlHandle_fota, "lynq_fota_set_addr_value");

+    if(lynq_fota_set_addr_value == NULL)

+    {

+        printf("lynq fota ser addr value is null\n");

+        return -1;

+    }

+

+    lynq_get_upgrade_status = (int (*)(void))dlsym(dlHandle_fota,"lynq_get_upgrade_status");

+    if(lynq_get_upgrade_status == NULL)

+    {

+        printf("lynq_get_upgrade_status is null\n");

+        return -1;

+    }

+    lynq_fota_nrestart = (int (*)())dlsym(dlHandle_fota,"lynq_fota_nrestart");

+    if(lynq_fota_nrestart == NULL)

+    {

+        printf("lynq_fota_nrestart is null\n");

+        return -1;

+    }

+    lynq_rock_main = (int (*)(int first_run))dlsym(dlHandle_fota,"lynq_rock_main");

+    if(lynq_rock_main == NULL)

+    {

+        printf("lynq_rock_main is null\n");

+        return -1;

+    }

+

+    lynq_read_process = (int (*)(void))dlsym(dlHandle_fota,"lynq_read_process");

+    if(lynq_read_process == NULL)

+    {

+        printf("lynq_read_process is null\n");

+        return -1;

+    }

+

+    ret = lynq_fota_set_addr_value(value,(int )strlen(value));

+    if(ret != 0)

+    {

+        printf("set upgrade package addr failed\n");

+        return -1;

+    }

+    while(1)

+    {

+        printf("Please chose action  0:  upgrade done ,not reboot 1: upgrade done ,reboot 2:get upgrade status 3:read fota process \n");

+        if(1 != scanf("%d",&reboot_flag))

+            break;

+

+        switch(reboot_flag)

+        {

+            case 0:

+                {

+                    pthread_t thread_id_noreboot;

+                    int result = pthread_create(&thread_id_noreboot, NULL, thread_function_noreboot, NULL);

+                    if (result != 0)

+                    {

+                        printf("pthread_create failed \n");

+                        return -1;;

+                    }

+                }

+                break;

+

+            case 1:

+                {

+                    pthread_t thread_id_reboot;

+                    int result = pthread_create(&thread_id_reboot, NULL, thread_function_reboot, NULL);

+                    if (result != 0)

+                    {

+                        printf("pthread_create failed \n");

+                        return -1;;

+                    }

+                }

+                break;

+            case 2:

+                printf("Get fota upgrade status \n");

+                ret = lynq_get_upgrade_status();

+                printf("lynq_get_upgrade_status ret is %d\n",ret);

+                break;

+            case 3:

+                printf("get fota upgrade process\n");

+                ret = lynq_read_process();

+                printf("Now upgrade process is %d\n",ret);

+                break;

+            default:

+                printf("please input right flag 0 or 1 or 2 or 3\n");

+                break;

+

+        }

+

+    }

+    return 0;

+

+}

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-gnss-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-qser-gnss-demo.cpp
new file mode 100755
index 0000000..275ffef
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-gnss-demo.cpp
@@ -0,0 +1,291 @@
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <termios.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <termios.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include <dlfcn.h>
+#include <stdint.h>
+#include "lynq-qser-gnss-demo.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+int (*qser_Gnss_Init)(uint32_t *h_gnss);
+int (*qser_Gnss_Deinit)(uint32_t);
+int (*qser_AddRxIndMsgHandler)(gnss_handler_func_t handler_ptr,uint32_t);
+int (*qser_Set_Indications)(uint32_t h_gnss,e_msg_id_t);
+int (*qser_Gnss_Start)(uint32_t h_gnss);
+int (*qser_Gnss_Stop)(uint32_t h_gnss);
+int (*qser_Gnss_Delete_Aiding_Data)(uint32_t,DELETE_AIDING_DATA_TYPE_T);
+int (*qser_Gnss_InjectTime)(uint32_t,LYNQ_INJECT_TIME_INTO_T *time_info);
+int (*qser_Gnss_Server_Configuration)(char *host, char *id, char *password);
+int (*qser_Gnss_download_tle)();
+int (*qser_Gnss_injectEphemeris)(uint32_t);
+int (*qser_Gnss_Set_Frequency)(uint32_t, int);
+void *dlHandle_gnss;
+
+int main(int argc, char *argv[])
+{
+    int ret;
+    int opt = 0;
+    char *lynqLib_gnss = (char*)"/lib/liblynq-qser-gnss.so";
+//    char dev_file[12] = {0};
+    uint32_t ph_gnss;
+    dlHandle_gnss = dlopen(lynqLib_gnss, RTLD_NOW);
+    while(1)
+    {
+        printf("=========gnss main=========\n");
+        user_help();
+        if(1 != scanf("%d", &opt))
+            break;
+        while(getchar()!='\n');
+        switch (opt)
+        {
+        case -1:
+        {
+            printf("main exit\n");
+            return 0;
+        }
+
+        case 1:
+        {
+            qser_Gnss_Init=(int(*)(uint32_t *h_gnss))dlsym(dlHandle_gnss, "qser_Gnss_Init");
+            ret = qser_Gnss_Init(&ph_gnss);
+            if(ret < 0)
+            {
+                printf("mopen_gnss_client_init FAIL.\n");
+                return -1;
+            }
+            printf("mopen_gnss_client_init success , with address=%d\n",  ph_gnss);
+            break;
+        }
+        case 2:
+        {
+            qser_Gnss_Deinit=(int(*)(uint32_t))dlsym(dlHandle_gnss, "qser_Gnss_Deinit");
+            ret =qser_Gnss_Deinit(ph_gnss);
+            if(ret < 0)
+            {
+                printf("mopen_gnss_client_Deinit FAIL.\n");
+                return -1;
+            }
+            printf("mopen_gnss_client_Deinit success \n");
+            break;
+        }
+        case 3:
+        {
+            qser_AddRxIndMsgHandler=(int(*)(gnss_handler_func_t,uint32_t))dlsym(dlHandle_gnss, "qser_AddRxIndMsgHandler");
+            ret = qser_AddRxIndMsgHandler((gnss_handler_func_t)&cb,ph_gnss);
+            if(ret < 0)
+            {
+                printf("lynq_AddRxIndMsgHandler fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("add success\n");
+            break;
+        }
+        case 4:
+        {
+            e_msg_id_t ptr2=E_MT_LOC_MSG_ID_LOCATION_INFO;
+            qser_Set_Indications=(int(*)(uint32_t h_gnss,e_msg_id_t))dlsym(dlHandle_gnss, "qser_Set_Indications");
+            ret = qser_Set_Indications(ph_gnss,ptr2);
+            if(ret < 0)
+            {
+                printf("lynq_Set_LOCATION_INFO fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("set location mode success\n");
+            break;
+        }
+        case 5:
+        {
+            e_msg_id_t ptr4=E_MT_LOC_MSG_ID_NMEA_INFO;
+            qser_Set_Indications=(int(*)(uint32_t h_gnss,e_msg_id_t))dlsym(dlHandle_gnss, "qser_Set_Indications");
+            ret = qser_Set_Indications(ph_gnss,ptr4);
+            if(ret < 0)
+            {
+                printf("lynq_Set_NMEA_INFO fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("set nmea mode success\n");
+            break;
+
+        }
+        case 6:
+        {
+            qser_Gnss_Start=(int(*)(uint32_t))dlsym(dlHandle_gnss, "qser_Gnss_Start");
+            ret = qser_Gnss_Start(ph_gnss);
+            if(ret < 0)
+            {
+                printf("lynq_Gnss_Start fail\n");
+                return -1;
+            }
+            printf("start success\n");
+            break;
+        }
+        case 7:
+        {
+            qser_Gnss_Stop=(int(*)(uint32_t))dlsym(dlHandle_gnss, "qser_Gnss_Stop");
+            ret = qser_Gnss_Stop(ph_gnss);
+            if(ret < 0)
+            {
+                printf("lynq_Gnss_Stop fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("stop success\n");
+            break;
+        }
+
+        case 8:
+        {
+            int opt_1;
+            DELETE_AIDING_DATA_TYPE_T ptr;
+            qser_Gnss_Delete_Aiding_Data=(int(*)(uint32_t,DELETE_AIDING_DATA_TYPE_T))dlsym(dlHandle_gnss, "qser_Gnss_Delete_Aiding_Data");
+            printf("=========delete aiding data type=========\n");
+            delete_type();
+            if(1 != scanf("%d", &opt_1))
+                break;
+            while(getchar()!='\n');
+            switch(opt_1)
+            {
+            case 0:
+            {
+                ptr = DELETE_NOTHING;//hot
+                break;
+            }
+            case 1:
+            {
+                ptr = DELETE_EPHEMERIS;//warm
+                break;
+            }
+            case 2:
+            {
+                ptr = DELETE_ALMANAC;
+                break;
+            }
+            case 3:
+            {
+                ptr = DELETE_POSITION_TIME;
+                break;
+            }
+            case 4:
+            {
+                ptr = DELETE_UTC;
+                break;
+            }
+            case 5:
+            {
+                ptr = DELETE_ALL;//cold
+                break;
+            }
+            default:
+            {
+                printf("input error\n");
+                return -1;
+            }
+            }
+            ret = qser_Gnss_Delete_Aiding_Data(ph_gnss,ptr);
+            if(ret < 0)
+            {
+                printf("lynq_Gnss_Delete_Aiding_Data %d fail\n",opt_1);
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("lynq_Gnss_Delete_Aiding_Data %d success\n",opt_1);
+            break;
+        }
+        case 9:
+        {
+            LYNQ_INJECT_TIME_INTO_T time_test;
+            qser_Gnss_InjectTime=(int(*)(uint32_t,LYNQ_INJECT_TIME_INTO_T *time_info))dlsym(dlHandle_gnss, "qser_Gnss_InjectTime");
+            ret = qser_Gnss_InjectTime(ph_gnss,&time_test);
+            if(ret < 0)
+            {
+                printf("qser_Gnss_InjectTime fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("qser_Gnss_InjectTime success\n");
+            break;
+        }
+        case 10:
+        {
+            qser_Gnss_download_tle=(int(*)())dlsym(dlHandle_gnss, "qser_Gnss_download_tle");
+            ret = qser_Gnss_download_tle();
+            if(ret < 0)
+            {
+                printf("qser_Gnss_download_tle fail\n");
+                return -1;
+            }
+            printf("qser_Gnss_download_tle success\n");
+            break;
+        }
+        case 11:
+        {
+            int frequency;
+            qser_Gnss_Set_Frequency=(int(*)(uint32_t, int))dlsym(dlHandle_gnss, "qser_Gnss_Set_Frequency");
+            printf("=========delete aiding data type=========\n");
+            if(1 != scanf("%d", &frequency))
+                break;
+            ret = qser_Gnss_Set_Frequency(ph_gnss,frequency);
+            if(ret < 0)
+            {
+                printf("qser_Gnss_Set_Frequency fail\n");
+                return -1;
+            }
+            printf("frequency is %d\n",frequency);
+            printf("qser_Gnss_Set_Frequency success\n");
+            break;
+        }
+        case 12:
+        {
+            int (*qser_Gnss_injectEphemeris)(uint32_t);
+            qser_Gnss_injectEphemeris=(int(*)(uint32_t))dlsym(dlHandle_gnss, "qser_Gnss_injectEphemeris");
+            ret = qser_Gnss_injectEphemeris(ph_gnss);
+            if(ret < 0)
+            {
+                printf("qser_Gnss_injectEphemeris fail\n");
+                return -1;
+            }
+            printf("qser_Gnss_injectEphemeri ssuccess\n");
+            break;
+        }
+        case 13:
+        {
+            qser_Gnss_Server_Configuration=(int(*)(char *host, char *id, char *password))dlsym(dlHandle_gnss, "qser_Gnss_Server_Configuration");
+            ret = qser_Gnss_Server_Configuration(NULL,(char*)"lcz",(char*)"123456");
+            if(ret < 0)
+            {
+                printf("qser_Gnss_Server_Configuration fail\n");
+                return -1;
+            }
+            printf("qser_Gnss_Server_Configuration ssuccess\n");
+            break;
+        }
+        default:
+        {
+            printf("input error,please re-enter\n");
+            break;
+        }
+        }
+    }
+    return 0;
+}
+#ifdef __cplusplus
+}
+#endif
diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-gnss-demo.h b/mbtk/test/liblynq_lib_t106/lynq-qser-gnss-demo.h
new file mode 100755
index 0000000..3dc7552
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-gnss-demo.h
@@ -0,0 +1,132 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum
+{
+                                                /**<  0  reserve  */
+    E_MT_LOC_MSG_ID_LOCATION_INFO = 1,          /**<  pv_data = &QL_LOC_LOCATION_INFO_T  */
+                                                /**<  2  reserve  */
+    E_MT_LOC_MSG_ID_NMEA_INFO = 3,              /**<  pv_data = &QL_LOC_NMEA_INFO_T  */
+}e_msg_id_t;
+
+#define MOPEN_GNSS_NMEA_MAX_LENGTH  255                 /**  NMEA string maximum length. */
+typedef struct
+{
+    int64_t     timestamp;                              /**<   System Timestamp, marked for when got the nmea data */
+    int         length;                                 /**<   NMEA string length. */
+    char        nmea[MOPEN_GNSS_NMEA_MAX_LENGTH + 1];   /**<   NMEA string.*/
+}mopen_gnss_nmea_info_t;  /* Message */
+
+struct mopen_location_info_t
+{
+    uint32_t    size;                   /**<   Set to the size of mcm_gps_location_t. */
+    int flags;                          /**<   Contains GPS location flags bits. */
+    int position_source;                /**<   Provider indicator for HYBRID or GPS. */
+    double      latitude;               /**<   Latitude in degrees. */
+    double      longitude;              /**<   Longitude in degrees. */
+    double      altitude;               /**<   Altitude in meters above the WGS 84 reference ellipsoid. */
+    float       speed;                  /**<   Speed in meters per second. */
+    float       bearing;                /**<   Heading in degrees. */
+    float       accuracy;               /**<   Expected accuracy in meters. */
+    int64_t     timestamp;              /**<   Timestamp for the location fix in UTC million-second base.  */
+    int32_t     is_indoor;              /**<   Location is indoors. */
+    float       floor_number;           /**<   Indicates the floor number. */
+};
+
+/*Instantiate callback function*/
+void cb
+(
+        uint32_t    h_loc,
+        e_msg_id_t  e_msg_id,
+        void        *pv_data,
+        void        *context_ptr
+        )
+{
+    printf("e_msg_id=%d\n", e_msg_id);
+    switch(e_msg_id)
+    {
+    case E_MT_LOC_MSG_ID_LOCATION_INFO:
+    {
+        mopen_location_info_t *pt_location = (mopen_location_info_t *)pv_data;
+        printf("**** flag=0x%X, Latitude = %f, Longitude=%f, altitude = %f, speed = %f, timestamp = %lld ****\n",
+               pt_location->flags,
+               pt_location->latitude,
+               pt_location->longitude,
+               pt_location->altitude,
+               pt_location->speed,
+               pt_location->timestamp);
+        break;
+    }
+    case E_MT_LOC_MSG_ID_NMEA_INFO:
+    {
+        mopen_gnss_nmea_info_t  *pt_nmea = (mopen_gnss_nmea_info_t *)pv_data;
+
+        printf("**** NMEA info: timestamp=%lld, length=%d, nmea=%s ****\n",
+               pt_nmea->timestamp, pt_nmea->length, pt_nmea->nmea);
+        break;
+    }
+    }
+}
+
+typedef void (*gnss_handler_func_t)
+(
+        uint32_t    h_loc,
+        e_msg_id_t  e_msg_id,
+        void        *pv_data,
+        void        *context_ptr
+        );
+
+typedef enum {
+    DELETE_NOTHING = 0,        /**< Delete nothing. */
+    DELETE_EPHEMERIS = 1,      /**< Delete ephemeris data. */
+    DELETE_ALMANAC = 2,        /**< Delete almanac data. */
+    DELETE_POSITION_TIME = 3,  /**< Delete position and time data. */
+    DELETE_UTC = 4,            /**< Delete UTC data. */
+    DELETE_ALL = 5,            /**< Delete all location data. */
+}DELETE_AIDING_DATA_TYPE_T;
+
+typedef struct 
+{
+    uint32_t year; // >1980
+    uint32_t month; // 1-12
+    uint32_t day; // 1-31
+    uint32_t hour; // 0-23
+    uint32_t minute; // 0-59
+    uint32_t second; // 0-59
+    uint32_t millisecond; // 0-999
+}LYNQ_INJECT_TIME_INTO_T; /* Message */
+
+
+void user_help(void)
+{
+    printf("\t-1 exit\n"
+           "\t1 gnss init\n"
+           "\t2 gnss deinit \n"
+           "\t3 gnss add handle function\n"
+           "\t4 gnss set single mode\n"
+           "\t5 gnss set get_para_from_nmea mode\n"
+           "\t6 gnss start\n"
+           "\t7 gnss stop\n"
+           "\t8 gnss Delete_Aiding_Data and reset\n"
+           "\t9 gnss injecttime\n"
+           "\t10 gnss download tle\n"
+           "\t11 gnss set frequency\n"
+           "\t12 gnss inject ephemeris\n"
+           "\t13 gnss server_configuration\n"
+           "please input operator: >> ");
+}
+void delete_type(void)
+{
+    printf("\t0 DELETE_NOTHING\n"
+           "\t1 DELETE_EPHEMERIS\n"
+           "\t2 DELETE_ALMANAC\n"
+           "\t3 DELETE_POSITION_TIME \n"
+           "\t4 DELETE_UTC\n"
+           "\t5 DELETE_ALL\n"
+           "please input operator: >> ");
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-network-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-qser-network-demo.cpp
new file mode 100755
index 0000000..019f0e3
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-network-demo.cpp
@@ -0,0 +1,649 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <stdint.h>

+#include <string.h>

+#include <dlfcn.h>

+#include <sys/types.h>

+//#include <pthread.h>

+#include <unistd.h>

+#include "lynq_qser_network.h"

+

+#ifndef LOG_TAG

+#define LOG_TAG "QSER_NETWORK_DEMO"

+#endif

+

+#ifdef __cplusplus
+extern "C" {
+#endif

+

+void *handle_network;

+

+int (*qser_nw_client_init_p)(nw_client_handle_type  * h_nw);

+int (*qser_nw_client_deinit_p)(nw_client_handle_type h_nw);

+int (*qser_nw_set_config_p)(nw_client_handle_type  h_nw, QSER_NW_CONFIG_INFO_T *pt_info);

+int (*qser_nw_get_operator_name_p)(nw_client_handle_type    h_nw, QSER_NW_OPERATOR_NAME_INFO_T    *pt_info );

+int (*qser_nw_get_reg_status_p)(nw_client_handle_type  h_nw, QSER_NW_REG_STATUS_INFO_T *pt_info);

+int (*qser_nw_add_rx_msg_handler_p)(nw_client_handle_type  h_nw, QSER_NW_RxMsgHandlerFunc_t handlerPtr,void* contextPtr);

+int (*qser_nw_get_signal_strength_p)(nw_client_handle_type h_nw,QSER_NW_SIGNAL_STRENGTH_INFO_T *pt_info);

+int (*qser_nw_set_oos_config_p)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info);

+int (*qser_nw_get_oos_config_p)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info);

+int (*qser_nw_set_rf_mode_p) (nw_client_handle_type   h_nw,E_QSER_NW_RF_MODE_TYPE_T rf_mode);

+int (*qser_nw_get_rf_mode_p) (nw_client_handle_type   h_nw,E_QSER_NW_RF_MODE_TYPE_T* rf_mode);

+int (*qser_nw_set_ims_enable_p) (nw_client_handle_type h_nw,E_QSER_NW_IMS_MODE_TYPE_T ims_mode);

+int (*qser_nw_get_ims_reg_status_p) (nw_client_handle_type h_nw, QSER_NW_IMS_REG_STATUS_INFO_T *pt_info);

+

+

+

+int getFunc()

+{

+    const char *lynq_libpath_network = "/lib/liblynq-qser-network.so";

+

+    handle_network = dlopen(lynq_libpath_network,RTLD_NOW);

+    if(NULL == handle_network)

+    {

+        printf("dlopen lynq_libpath_network fail:%s",dlerror());

+        exit(EXIT_FAILURE);

+    }

+

+    qser_nw_client_init_p = (int (*)(nw_client_handle_type  * h_nw))dlsym(handle_network,"qser_nw_client_init");

+    qser_nw_client_deinit_p = (int (*)(nw_client_handle_type h_nw))dlsym(handle_network,"qser_nw_client_deinit");

+    qser_nw_set_config_p = (int (*)(nw_client_handle_type  h_nw, QSER_NW_CONFIG_INFO_T *pt_info))dlsym(handle_network,"qser_nw_set_config");

+    qser_nw_get_operator_name_p = (int (*)(nw_client_handle_type  h_nw, QSER_NW_OPERATOR_NAME_INFO_T  *pt_info ))dlsym(handle_network,"qser_nw_get_operator_name");

+    qser_nw_get_reg_status_p = (int (*)(nw_client_handle_type  h_nw, QSER_NW_REG_STATUS_INFO_T  *pt_info))dlsym(handle_network,"qser_nw_get_reg_status");

+    qser_nw_get_signal_strength_p = (int (*)(nw_client_handle_type h_nw, QSER_NW_SIGNAL_STRENGTH_INFO_T *pt_info))dlsym(handle_network,"qser_nw_get_signal_strength");

+    qser_nw_add_rx_msg_handler_p = (int (*)(nw_client_handle_type  h_nw, QSER_NW_RxMsgHandlerFunc_t handlerPtr,void* contextPtr))dlsym(handle_network,"qser_nw_add_rx_msg_handler");

+    qser_nw_get_oos_config_p = (int (*)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info))dlsym(handle_network,"qser_nw_get_oos_config");

+    qser_nw_set_oos_config_p = (int (*)(nw_client_handle_type   h_nw, QSER_NW_OOS_CONFIG_INFO_T *pt_info))dlsym(handle_network,"qser_nw_set_oos_config");

+    qser_nw_set_rf_mode_p = (int (*)(nw_client_handle_type   h_nw, E_QSER_NW_RF_MODE_TYPE_T rf_mode))dlsym(handle_network,"qser_nw_set_rf_mode");

+    qser_nw_get_rf_mode_p = (int (*)(nw_client_handle_type   h_nw, E_QSER_NW_RF_MODE_TYPE_T* rf_mode))dlsym(handle_network,"qser_nw_get_rf_mode");

+    qser_nw_set_ims_enable_p = (int (*)(nw_client_handle_type  h_nw, E_QSER_NW_IMS_MODE_TYPE_T ims_mode))dlsym(handle_network,"qser_nw_set_ims_enable");

+    qser_nw_get_ims_reg_status_p = (int (*)(nw_client_handle_type  h_nw, QSER_NW_IMS_REG_STATUS_INFO_T  *pt_info))dlsym(handle_network,"qser_nw_get_ims_reg_status");

+

+    if(qser_nw_client_deinit_p==NULL || qser_nw_client_init_p==NULL || qser_nw_set_config_p ==NULL ||

+       qser_nw_get_operator_name_p == NULL || qser_nw_get_reg_status_p ==NULL || qser_nw_add_rx_msg_handler_p==NULL ||

+       qser_nw_set_rf_mode_p == NULL || qser_nw_get_rf_mode_p == NULL || qser_nw_get_oos_config_p == NULL || qser_nw_set_oos_config_p == NULL ||

+       qser_nw_set_ims_enable_p == NULL || qser_nw_get_ims_reg_status_p == NULL)

+    {

+        printf("get func pointer null");

+        exit(EXIT_FAILURE);

+    }

+    return  0;

+}

+

+static int test_nw(void);

+

+int main(int argc, char const *argv[])

+{

+    printf("--------->[%s,%d] start \n",__FUNCTION__,__LINE__);

+

+    if(getFunc()==0)

+    {

+        test_nw();

+    }

+

+    return 0;

+}

+

+typedef struct

+{

+    int  cmdIdx;

+    char *funcName;

+} st_api_test_case;

+

+st_api_test_case at_nw_testlist[] =

+{

+    {0,     (char*)"qser_nw_client_init"},

+    {1,     (char*)"qser_nw_set_config"},

+    {2,     (char*)"qser_nw_get_operator_name"},

+    {3,     (char*)"qser_nw_get_reg_status"},

+    {4,     (char*)"qser_nw_add_rx_msg_handler"},

+    {5,     (char*)"qser_nw_get_signal_strength"},

+    {6,     (char*)"qser_nw_set_oos_config"},

+    {7,     (char*)"qser_nw_get_oos_config"},

+    {8,     (char*)"qser_nw_set_rf_mode"},

+    {9,     (char*)"qser_nw_get_rf_mode"},

+    {10,     (char*)"qser_nw_set_ims_enable"},

+    {11,     (char*)"qser_nw_get_ims_reg_status"},

+    {12,     (char*)"qser_nw_client_deinit"},

+    {-1,    (char*)"quit"}

+};

+

+typedef int (*TEST)(void);

+

+typedef struct

+{

+    char                *group_name;

+    st_api_test_case    *test_cases;

+    TEST                pf_test;

+} func_api_test_t;

+

+func_api_test_t t_nw_test = {(char*)"nw", at_nw_testlist, test_nw};

+

+void show_group_help(func_api_test_t *pt_test)

+{

+    int i;

+

+    printf("Group Name:%s, Supported test cases:\n", pt_test->group_name);

+    for(i = 0; ; i++)

+    {

+        if(pt_test->test_cases[i].cmdIdx == -1)

+        {

+            break;

+        }

+        printf("%d:\t%s\n", pt_test->test_cases[i].cmdIdx, pt_test->test_cases[i].funcName);

+    }

+}

+

+static nw_client_handle_type h_nw = 0;

+

+char *tech_domain[] = {(char*)"NONE", (char*)"3GPP", (char*)"3GPP2"};

+char *radio_tech[] = {(char*)"unknown",

+    (char*)"TD_SCDMA", (char*)"GSM",      (char*)"HSPAP",    (char*)"LTE",      (char*)"EHRPD",    (char*)"EVDO_B",

+    (char*)"HSPA",     (char*)"HSUPA",    (char*)"HSDPA",    (char*)"EVDO_A",   (char*)"EVDO_0",   (char*)"1xRTT",

+    (char*)"IS95B",    (char*)"IS95A",    (char*)"UMTS",     (char*)"EDGE",     (char*)"GPRS",     (char*)"NONE"};

+

+void nw_event_ind_handler (

+    nw_client_handle_type h_nw,

+    u_int32_t ind_flag,

+    void                  *ind_msg_buf,

+    u_int32_t              ind_msg_len,

+    void                  *contextPtr)

+{

+    switch(ind_flag) {

+        case NW_IND_VOICE_REG_EVENT_IND_FLAG:

+            {

+                QSER_NW_VOICE_REG_EVENT_IND_T *ind = (QSER_NW_VOICE_REG_EVENT_IND_T*)ind_msg_buf;

+                printf("Recv event indication : VOICE REG EVENT\n");

+

+                if(ind==NULL)

+                {

+                     printf("ind is NULL\n");

+                     break;

+                }

+

+                if(ind->registration_valid)

+                {

+                    printf("voice_registration: \ntech_domain=%s, radio_tech=%s, roaming=%d, registration_state=%d\n",

+                            tech_domain[ind->registration.tech_domain],

+                            radio_tech[ind->registration.radio_tech],

+                            ind->registration.roaming,

+                            ind->registration.registration_state);

+                }

+                if(ind->registration_details_3gpp_valid)

+                {

+                    printf("voice_registration_details_3gpp: \ntech_domain=%s, radio_tech=%s, mcc=%s, mnc=%s, roaming=%d, forbidden=%d, cid=0x%X, lac=%d, psc=%d, tac=%d\n",

+                            tech_domain[ind->registration_details_3gpp.tech_domain],

+                            radio_tech[ind->registration_details_3gpp.radio_tech],

+                            ind->registration_details_3gpp.mcc,

+                            ind->registration_details_3gpp.mnc,

+                            ind->registration_details_3gpp.roaming,

+                            ind->registration_details_3gpp.forbidden,

+                            ind->registration_details_3gpp.cid,

+                            ind->registration_details_3gpp.lac,

+                            ind->registration_details_3gpp.psc,

+                            ind->registration_details_3gpp.tac);

+                }

+

+                if(ind->registration_details_3gpp2_valid)

+                {

+                    printf("voice_registration_details_3gpp2: \ntech_domain=%s, radio_tech=%s, mcc=%s, mnc=%s, roaming=%d, forbidden=%d, sid=%d, nid=%d, bsid=%d\n",

+                            tech_domain[ind->registration_details_3gpp2.tech_domain],

+                            radio_tech[ind->registration_details_3gpp2.radio_tech],

+                            ind->registration_details_3gpp2.mcc,

+                            ind->registration_details_3gpp2.mnc,

+                            ind->registration_details_3gpp2.roaming,

+                            ind->registration_details_3gpp2.forbidden,

+                            ind->registration_details_3gpp2.sid,

+                            ind->registration_details_3gpp2.nid,

+                            ind->registration_details_3gpp2.bsid);

+                }

+

+                break;

+            }

+        case NW_IND_DATA_REG_EVENT_IND_FLAG:

+            {

+                QSER_NW_DATA_REG_EVENT_IND_T *ind = (QSER_NW_DATA_REG_EVENT_IND_T*)ind_msg_buf;

+

+                printf("Recv event indication : DATA REG EVENT\n");

+

+                if(ind==NULL)

+                {

+                     printf("ind is NULL\n");

+                     break;

+                }

+

+

+                if(ind->registration_valid)

+                {

+                    printf("data_registration: \ntech_domain=%s, radio_tech=%s, roaming=%d, registration_state=%d\n",

+                            tech_domain[ind->registration.tech_domain],

+                            radio_tech[ind->registration.radio_tech],

+                            ind->registration.roaming,

+                            ind->registration.registration_state);

+                }

+                if(ind->registration_details_3gpp_valid)

+                {

+                    printf("data_registration_details_3gpp: \ntech_domain=%s, radio_tech=%s, mcc=%s, mnc=%s, roaming=%d, forbidden=%d, cid=0x%X, lac=%d, psc=%d, tac=%d\n",

+                            tech_domain[ind->registration_details_3gpp.tech_domain],

+                            radio_tech[ind->registration_details_3gpp.radio_tech],

+                            ind->registration_details_3gpp.mcc,

+                            ind->registration_details_3gpp.mnc,

+                            ind->registration_details_3gpp.roaming,

+                            ind->registration_details_3gpp.forbidden,

+                            ind->registration_details_3gpp.cid,

+                            ind->registration_details_3gpp.lac,

+                            ind->registration_details_3gpp.psc,

+                            ind->registration_details_3gpp.tac);

+                }

+

+                if(ind->registration_details_3gpp2_valid)

+                {

+                    printf("data_registration_details_3gpp2: \ntech_domain=%s, radio_tech=%s, mcc=%s, mnc=%s, roaming=%d, forbidden=%d, prl=%d, css=%d, sid=%d, nid=%d, bsid=%d\n",

+                            tech_domain[ind->registration_details_3gpp2.tech_domain],

+                            radio_tech[ind->registration_details_3gpp2.radio_tech],

+                            ind->registration_details_3gpp2.mcc,

+                            ind->registration_details_3gpp2.mnc,

+                            ind->registration_details_3gpp2.roaming,

+                            ind->registration_details_3gpp2.forbidden,

+                            ind->registration_details_3gpp2.inPRL,

+                            ind->registration_details_3gpp2.css,

+                            ind->registration_details_3gpp2.sid,

+                            ind->registration_details_3gpp2.nid,

+                            ind->registration_details_3gpp2.bsid);

+                }

+

+                break;

+            }

+        case NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG:

+            {

+                QSER_NW_SINGNAL_EVENT_IND_T *ind = (QSER_NW_SINGNAL_EVENT_IND_T*)ind_msg_buf;

+

+                printf("Recv event indication : SIGNAL STRENGTH EVENT\n");

+

+                if(ind==NULL)

+                {

+                     printf("ind is NULL\n");

+                     break;

+                }

+

+                if(ind->gsm_sig_info_valid)

+                {

+                    printf("gsm_sig_info: rssi=%d\n",

+                            ind->gsm_sig_info.rssi);

+                }

+

+                if(ind->wcdma_sig_info_valid)

+                {

+                    printf("wcdma_sig_info: rssi=%d, ecio=%d\n",

+                            ind->wcdma_sig_info.rssi,

+                            ind->wcdma_sig_info.ecio);

+                }

+                if(ind->tdscdma_sig_info_valid)

+                {

+                    printf("tdscdma_sig_info: rssi=%d, rscp=%d, ecio=%d, sinr=%d\n",

+                            ind->tdscdma_sig_info.rssi,

+                            ind->tdscdma_sig_info.rscp,

+                            ind->tdscdma_sig_info.ecio,

+                            ind->tdscdma_sig_info.sinr);

+                }

+                if(ind->lte_sig_info_valid)

+                {

+                    printf("lte_sig_info: rssi=%d, rsrq=%d, rsrp=%d, snr=%d\n",

+                            ind->lte_sig_info.rssi,

+                            ind->lte_sig_info.rsrq,

+                            ind->lte_sig_info.rsrp,

+                            ind->lte_sig_info.snr);

+                }

+                if(ind->cdma_sig_info_valid)

+                {

+                    printf("cdma_sig_info: rssi=%d, ecio=%d\n",

+                            ind->cdma_sig_info.rssi,

+                            ind->cdma_sig_info.ecio);

+                }

+                if(ind->hdr_sig_info_valid)

+                {

+                    printf("hdr_sig_info: rssi=%d, ecio=%d, sinr=%d, io=%d\n",

+                            ind->hdr_sig_info.rssi,

+                            ind->hdr_sig_info.ecio,

+                            ind->hdr_sig_info.sinr,

+                            ind->hdr_sig_info.io);

+                }

+                break;

+            }

+        case NW_IND_IMS_REG_EVENT_IND_FLAG:

+            {

+                printf("Recv event indication : IMS REG EVENT\n");

+

+                break;

+            }

+        default:

+            break;

+    }

+}

+

+static int test_nw(void)

+{

+    int    cmdIdx  = 0;

+    int    ret     = 0;

+    int tmp_int;

+

+    while(1)

+    {

+        show_group_help(&t_nw_test);

+        printf("please input cmd index(-1 exit): ");

+        ret = scanf("%d", &cmdIdx);

+        if(ret != 1)

+        {

+            char c;

+            while(((c=getchar()) != '\n') && (c != EOF))

+            {

+                ;

+            }

+            continue;

+        }

+        if(cmdIdx == -1)

+        {

+            break;

+        }

+        switch(cmdIdx)

+        {

+             case 0://"qser_nw_client_init"

+             {

+

+                 ret = qser_nw_client_init(&h_nw);

+                 printf("qser_nw_client_init ret = %d\n", ret);

+                 break;

+             }

+             case 1://"qser_nw_set_config"

+             {

+                 QSER_NW_CONFIG_INFO_T     t_info = {0};

+

+                 int mask = 0;

+                 printf("please input decimal format number,  whose hex format is (TDSCDMA | LTE | EVDO | CDMA | WCDMA | GSM) : \n");

+                 if(1 != scanf("%d", &mask))

+                    break;

+                 t_info.preferred_nw_mode = mask;

+

+                 ret = qser_nw_set_config(h_nw, &t_info);

+                 printf("qser_nw_set_config ret = %d\n", ret);

+                 break;

+             }

+             case 2://"qser_nw_get_operator_name"

+             {

+                 QSER_NW_OPERATOR_NAME_INFO_T  t_info;

+                 ret = qser_nw_get_operator_name(h_nw, &t_info);

+                 printf("qser_nw_get_operator_name ret = %d, long_eons=%s, short_eons=%s, mcc=%s, mnc=%s\n", ret,

+                         t_info.long_eons, t_info.short_eons, t_info.mcc, t_info.mnc);

+                 break;

+             }

+             case 3://"qser_nw_get_reg_status"

+             {

+                 QSER_NW_REG_STATUS_INFO_T         t_info;

+

+                 memset(&t_info, 0, sizeof(QSER_NW_REG_STATUS_INFO_T));

+                 ret = qser_nw_get_reg_status(h_nw, &t_info);

+                 printf("qser_nw_get_reg_status ret = %d, detail info:\n", ret);

+                 if(t_info.voice_registration_valid)

+                 {

+                     printf("voice_registration: \ntech_domain=%s, radio_tech=%s, roaming=%d, registration_state=%d\n",

+                         tech_domain[t_info.voice_registration.tech_domain],

+                         radio_tech[t_info.voice_registration.radio_tech],

+                         t_info.voice_registration.roaming,

+                         t_info.voice_registration.registration_state);

+                 }

+                 if(t_info.data_registration_valid)

+                 {

+                     printf("data_registration: \ntech_domain=%s, radio_tech=%s, roaming=%d, registration_state=%d\n",

+                         tech_domain[t_info.data_registration.tech_domain],

+                         radio_tech[t_info.data_registration.radio_tech],

+                         t_info.data_registration.roaming,

+                         t_info.data_registration.registration_state);

+                 }

+                 if(t_info.voice_registration_details_3gpp_valid)

+                 {

+                     printf("voice_registration_details_3gpp: \ntech_domain=%s, radio_tech=%s, mcc=%s, mnc=%s, roaming=%d, forbidden=%d, cid=0x%X, lac=%d, psc=%d, tac=%d\n",

+                         tech_domain[t_info.voice_registration_details_3gpp.tech_domain],

+                         radio_tech[t_info.voice_registration_details_3gpp.radio_tech],

+                         t_info.voice_registration_details_3gpp.mcc,

+                         t_info.voice_registration_details_3gpp.mnc,

+                         t_info.voice_registration_details_3gpp.roaming,

+                         t_info.voice_registration_details_3gpp.forbidden,

+                         t_info.voice_registration_details_3gpp.cid,

+                         t_info.voice_registration_details_3gpp.lac,

+                         t_info.voice_registration_details_3gpp.psc,

+                         t_info.voice_registration_details_3gpp.tac);

+                 }

+                 if(t_info.data_registration_details_3gpp_valid)

+                 {

+                     printf("data_registration_details_3gpp: \ntech_domain=%s, radio_tech=%s, mcc=%s, mnc=%s, roaming=%d, forbidden=%d, cid=0x%X, lac=%d, psc=%d, tac=%d\n",

+                         tech_domain[t_info.data_registration_details_3gpp.tech_domain],

+                         radio_tech[t_info.data_registration_details_3gpp.radio_tech],

+                         t_info.data_registration_details_3gpp.mcc,

+                         t_info.data_registration_details_3gpp.mnc,

+                         t_info.data_registration_details_3gpp.roaming,

+                         t_info.data_registration_details_3gpp.forbidden,

+                         t_info.data_registration_details_3gpp.cid,

+                         t_info.data_registration_details_3gpp.lac,

+                         t_info.data_registration_details_3gpp.psc,

+                         t_info.data_registration_details_3gpp.tac);

+                 }

+

+                 if(t_info.voice_registration_details_3gpp2_valid)

+                 {

+                     printf("voice_registration_details_3gpp2: \ntech_domain=%s, radio_tech=%s, mcc=%s, mnc=%s, roaming=%d, forbidden=%d, sid=%d, nid=%d, bsid=%d\n",

+                         tech_domain[t_info.voice_registration_details_3gpp2.tech_domain],

+                         radio_tech[t_info.voice_registration_details_3gpp2.radio_tech],

+                         t_info.voice_registration_details_3gpp2.mcc,

+                         t_info.voice_registration_details_3gpp2.mnc,

+                         t_info.voice_registration_details_3gpp2.roaming,

+                         t_info.voice_registration_details_3gpp2.forbidden,

+                         t_info.voice_registration_details_3gpp2.sid,

+                         t_info.voice_registration_details_3gpp2.nid,

+                         t_info.voice_registration_details_3gpp2.bsid);

+                 }

+

+                 if(t_info.data_registration_details_3gpp2_valid)

+                 {

+                     printf("data_registration_details_3gpp2: \ntech_domain=%s, radio_tech=%s, mcc=%s, mnc=%s, roaming=%d, forbidden=%d, sid=%d, nid=%d, bsid=%d\n",

+                         tech_domain[t_info.data_registration_details_3gpp2.tech_domain],

+                         radio_tech[t_info.data_registration_details_3gpp2.radio_tech],

+                         t_info.data_registration_details_3gpp2.mcc,

+                         t_info.data_registration_details_3gpp2.mnc,

+                         t_info.data_registration_details_3gpp2.roaming,

+                         t_info.data_registration_details_3gpp2.forbidden,

+                         t_info.data_registration_details_3gpp2.sid,

+                         t_info.data_registration_details_3gpp2.nid,

+                         t_info.data_registration_details_3gpp2.bsid);

+                 }

+

+                 break;

+             }

+             case 12://"qser_nw_client_deinit"

+             {

+                 ret = qser_nw_client_deinit(h_nw);

+                 printf("qser_nw_client_deinit ret = %d\n", ret);

+                 break;

+             }

+             case 4 :

+             {

+                ret = qser_nw_add_rx_msg_handler(h_nw, nw_event_ind_handler, NULL);

+                printf("qser_nw_add_rx_msg_handler, ret=%d\n", ret);

+                break;

+             }

+              case 5 :

+             {

+                QSER_NW_SIGNAL_STRENGTH_INFO_T t_info;

+                ret = qser_nw_get_signal_strength(h_nw, &t_info);

+                printf("qser_nw_get_signal_strength, ret=%d\n", ret);

+                if(ret==0)

+                {

+                    printf("qser_solicited_signal_strength gsm_sig_info_valid = %d\n"

+                               "                               gsm_sig_info.rssi = %d\n"

+                               "                               wcdma     _sig_info_valid = %d\n"

+                               "                               wcdma_sig_info.rssi = %d\n"

+                               "                               wcdma_sig_info.ecio = %d\n"

+                               "                               tdscdma_sig_info_valid = %d\n"

+                               "                               lte_sig_info_valid = %d\n"

+                               "                               lte_sig_info.rssi = %d\n"

+                               "                               lte_sig_info.rsrp = %d\n"

+                               "                               lte_sig_info.rsrq = %d\n"

+                               "                               lte_sig_info.snr = %d\n"

+                               "                               cdma_sig_info_valid = %d\n"

+                               "                               hdr_sig_info_valid = %d\n"

+                               "                               nr_sig_info_valid = %d\n"

+                               "                               nr_sig_info.ssRsrp = %d\n"

+                               "                               nr_sig_info.ssRsrq = %d\n"

+                               "                               nr_sig_info.ssSinr = %d\n"

+                               "                               nr_sig_info.csiRsrp = %d\n"

+                               "                               nr_sig_info.csiRsrq = %d\n"

+                               "                               nr_sig_info.csiSinr = %d\n",

+                              t_info.gsm_sig_info_valid, t_info.gsm_sig_info.rssi,

+                              t_info.wcdma_sig_info_valid, t_info.wcdma_sig_info.rssi,  t_info.wcdma_sig_info.ecio,

+                              t_info.tdscdma_sig_info_valid,

+                              t_info.lte_sig_info_valid, t_info.lte_sig_info.rssi, t_info.lte_sig_info.rsrp, t_info.lte_sig_info.rsrq, t_info.lte_sig_info.snr,

+                              t_info.cdma_sig_info_valid,

+                              t_info.hdr_sig_info_valid,

+                              t_info.nr_sig_info_valid, t_info.nr_sig_info.ssRsrp, t_info.nr_sig_info.ssRsrq, t_info.nr_sig_info.ssSinr,

+                              t_info.nr_sig_info.csiRsrp, t_info.nr_sig_info.csiRsrq, t_info.nr_sig_info.csiSinr);

+

+                }

+                break;

+             }

+             case 7 :

+             {

+                QSER_NW_OOS_CONFIG_INFO_T t_info;

+                int type = 0;

+                printf("please input you want query oos config's type (0: fast network scan config; 1: full band network scan config ) : \n");

+                if(1 != scanf("%d", &type))

+                    break;

+                t_info.type = type;

+                ret = qser_nw_get_oos_config(h_nw, &t_info);

+                printf("qser_nw_get_oos_config, ret=%d\n", ret);

+                if(ret==0)

+                {

+                    if(t_info.type == QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN)

+                    {

+                        printf("qser_nw_get_oos_config         t_min = %d\n"

+                               "                               t_step = %d\n"

+                               "                               t_num = %d\n"

+                               "                               t_max = %d\n",

+                              t_info.u.full_band_scan_info.t_min, t_info.u.full_band_scan_info.t_step,

+                              t_info.u.full_band_scan_info.t_num, t_info.u.full_band_scan_info.t_max);

+                    }

+                    else if(t_info.type == QSER_NW_OOS_CFG_TYPE_FAST_SCAN)

+                    {

+                        printf("qser_nw_get_oos_config         enable = %d\n"

+                               "                               time_interval = %d\n",

+                              t_info.u.fast_can_info.enable, t_info.u.fast_can_info.time_interval);

+                    }

+                    else

+                    {

+                        printf("qser_nw_get_oos_config tyep is %d, ret is ok",t_info.type);

+                    }

+

+                }

+                break;

+             }

+             case 6 :

+             {

+                QSER_NW_OOS_CONFIG_INFO_T t_info;

+                int type = 0;

+                printf("please input you want set oos config's type (0: fast network scan config; 1: full band network scan config ) : \n");

+                if(1 != scanf("%d", &type))

+                    break;

+                t_info.type = type;

+                if(t_info.type == QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN)

+                {

+                      printf("please input  t_min: \n");

+                      if(1 != scanf("%d", &(t_info.u.full_band_scan_info.t_min)))

+                        break;

+                      printf("please input t_step: \n");

+                      if(1 != scanf("%d", &(t_info.u.full_band_scan_info.t_step)))

+                        break;

+                      printf("please input  t_num: \n");

+                      if(1 != scanf("%d", &(t_info.u.full_band_scan_info.t_num)))

+                        break;

+                      printf("please input t_max: \n");

+                      if(1 != scanf("%d", &(t_info.u.full_band_scan_info.t_max)))

+                        break;

+                      ret = qser_nw_set_oos_config(h_nw, &t_info);

+                      printf("qser_nw_get_oos_config, ret=%d\n", ret);

+                }

+                else if(t_info.type==QSER_NW_OOS_CFG_TYPE_FAST_SCAN)

+                {

+                      printf("please input  enable: \n");

+                      if(1 != scanf("%d", &tmp_int))

+                        break;

+                      t_info.u.fast_can_info.enable = (char)tmp_int;

+                      printf("please input time_interval: \n");

+                      if(1 != scanf("%d", &tmp_int))

+                        break;

+                      t_info.u.fast_can_info.time_interval = (uint16_t)tmp_int;

+                      ret = qser_nw_set_oos_config(h_nw, &t_info);

+                      printf("qser_nw_get_oos_config, ret=%d\n", ret);

+                }

+                else

+                {

+                       ret = qser_nw_set_oos_config(h_nw, &t_info);

+                       printf("qser_nw_get_oos_config, ret=%d\n", ret);

+                }

+                break;

+             }

+             case 9://"qser_nw_get_rf_mode"

+             {

+                 E_QSER_NW_RF_MODE_TYPE_T  rf_mode;

+                 ret = qser_nw_get_rf_mode(h_nw, &rf_mode);

+                 printf("qser_nw_get_rf_mode ret = %d, rf mode=%d\n", ret, rf_mode);

+                 break;

+             }

+             case 8://"qser_nw_set_rf_mode"

+             {

+                 E_QSER_NW_RF_MODE_TYPE_T  rf_mode;

+                 printf("please input you want set rf mode (0: cfun 0;  1: cfun 1; 4: flight mode \n");

+                 if(1 != scanf("%d", &tmp_int))

+                    break;

+                 rf_mode = (E_QSER_NW_RF_MODE_TYPE_T)tmp_int;

+                 ret = qser_nw_set_rf_mode(h_nw, rf_mode);

+                 printf("qser_nw_set_rf_mode %d ret = %dn",rf_mode, ret);

+                 break;

+             }

+             case 10://"qser_nw_set_ims_enable"

+             {

+                 E_QSER_NW_IMS_MODE_TYPE_T  ims_mode;

+                 printf("please input you want set ims mode (0: off;  1: volte enable \n");

+                 if(1 != scanf("%d", &tmp_int))

+                    break;

+                 ims_mode = (E_QSER_NW_IMS_MODE_TYPE_T)tmp_int;

+                 ret = qser_nw_set_ims_enable(h_nw, ims_mode);

+                 printf("qser_nw_set_ims_enable %d ret = %dn",ims_mode, ret);

+                 break;

+             }

+             case 11://"qser_nw_get_ims_reg_status"

+             {

+                 QSER_NW_IMS_REG_STATUS_INFO_T         t_info;

+                 memset(&t_info, 0, sizeof(QSER_NW_IMS_REG_STATUS_INFO_T));

+                 ret = qser_nw_get_ims_reg_status(h_nw, &t_info);

+                 printf("qser_nw_get_ims_reg_status ret = %d, detail info:\n", ret);

+                 if(ret == 0)

+                 {

+                     printf("ims_registration: registration_state=%d\n",

+                         t_info.registration_state);

+                 }

+                 break;

+             }

+             default:

+             {

+                 show_group_help(&t_nw_test);

+             }

+        }

+    }

+    return 0;

+}

+

+#ifdef __cplusplus
+}
+#endif

+

+

+

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-sim-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-qser-sim-demo.cpp
new file mode 100755
index 0000000..3dc4ca2
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-sim-demo.cpp
@@ -0,0 +1,616 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/types.h>

+#include <pthread.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+

+#include"lynq-qser-sim-demo.h"

+#include "mbtk_log.h"

+

+#define BUF_SIZE 32

+#define BUF_PIN 8

+#define VER_SIZE 128

+

+typedef uint32_t sim_client_handle_type;

+

+//sim_client_handle_type  ph_sim = 2023;

+sim_client_handle_type  h_sim = 2023;

+int flag_init = 0;

+

+int (*qser_sim_client_init)(sim_client_handle_type  *ph_sim);

+int (*qser_sim_client_deinit)(sim_client_handle_type h_sim);

+int (*qser_sim_getimsi)(

+    sim_client_handle_type          h_sim,

+    QSER_SIM_APP_ID_INFO_T            *pt_info,   ///< [IN] The SIM identifier info.

+    char                            *imsi,      ///< [OUT] IMSI buffer

+    size_t                          imsiLen     ///< [IN] IMSI buffer length

+);

+

+int (*qser_sim_geticcid)

+(

+    sim_client_handle_type          h_sim,

+    QSER_SIM_SLOT_ID_TYPE_T     simId,     ///< [IN] The SIM identifier.

+    char                            *iccid,    ///< [OUT] ICCID

+    size_t                          iccidLen   ///< [IN] ICCID buffer length

+);

+

+int (*qser_sim_getphonenumber)

+(

+    sim_client_handle_type          h_sim,

+    QSER_SIM_APP_ID_INFO_T            *pt_info,   ///< [IN] The SIM identifier.

+    char                            *phone_num, ///< [OUT] phone number

+    size_t                          phoneLen    ///< [IN] phone number buffer length

+);

+int (*qser_sim_verifypin)(sim_client_handle_type h_sim, QSER_SIM_VERIFY_PIN_INFO_T *pt_info);

+int (*qser_sim_changepin)(sim_client_handle_type h_sim, QSER_SIM_CHANGE_PIN_INFO_T *pt_info);

+int (*qser_sim_unblockpin)(sim_client_handle_type h_sim, QSER_SIM_UNBLOCK_PIN_INFO_T *pt_info);

+int (*qser_sim_enablepin)(sim_client_handle_type h_sim, QSER_SIM_ENABLE_PIN_INFO_T *pt_info);

+int (*qser_sim_disablepin)(sim_client_handle_type h_sim, QSER_SIM_DISABLE_PIN_INFO_T *pt_info);

+int (*qser_sim_getcardstatus)(sim_client_handle_type h_sim, QSER_SIM_SLOT_ID_TYPE_T simId, QSER_SIM_CARD_STATUS_INFO_T *pt_info);

+int (*qser_sim_getimei)(sim_client_handle_type h_sim, char *imei);

+int (*qser_get_imei_and_sv)(sim_client_handle_type h_sim,char *imei, char*sv);

+int (*qser_reset_modem)(sim_client_handle_type h_sim);

+int (*qser_get_version)(sim_client_handle_type h_sim, char *buf);

+int (*qser_reset_sim)(sim_client_handle_type h_sim);

+int (*qser_sim_addrxmsghandler)(QSER_SIM_RxMsgHandlerFunc_t handlerPtr);

+

+

+typedef struct

+{

+    int  cmdIdx;

+    const char *funcName;

+} st_api_test_case;

+

+//for server test

+st_api_test_case at_api_testcases[] =

+{

+    {0,   "qser_sim_init"},

+    {1,   "qser_get_imsi"},

+    {2,   "qser_get_iccid"},

+    {3,   "qser_get_phonenumber"},

+    {4,   "qser_verify_pin"},

+    {5,   "qser_change_pin"},

+    {6,   "qser_unlock_pin"},

+    {7,   "qser_enable_pin"},

+    {8,   "qser_disable_pin"},

+    {9,   "qser_get_sim_status"},

+    {10,   "qser_get_imei"},

+    {11,   "qser_get_imei_and_sv"},

+    {12,   "qser_reset_modem"},

+    {13,   "qser_get_version"},

+    {14,   "qser_reset_sim"},

+    {15,   "qser_sim_addrxmsghandler"},

+    {16,   "qser_deinit_sim"},

+    {-1,    NULL}

+};

+

+void print_help(void)

+{

+    int i;

+    printf("Supported test cases:\n");

+    for(i = 0; ; i++)

+    {

+        if(at_api_testcases[i].cmdIdx == -1)

+        {

+            break;

+        }

+        printf("%d:\t%s\n", at_api_testcases[i].cmdIdx, at_api_testcases[i].funcName);

+    }

+}

+

+void qser_sim_handler(QSER_SIM_MsgRef msgRef) {

+    printf("[%s-%d] sim, state = 0x%x========\n", __FUNCTION__, __LINE__, msgRef->e_card_state);

+}

+

+int main(int argc, char const *argv[])

+{

+    int cmdIdx = 0;

+    int res    = 0;

+

+    mbtk_log_init((char*)"radio", (char*)"MBTK");

+

+    const char *lynq_libpath_sim = (char*)"/lib/liblynq-qser-sim.so";

+    void *dlHandle_sim = dlopen(lynq_libpath_sim, RTLD_NOW);

+    if (dlHandle_sim == NULL)

+    {

+        printf("dlopen dlHandle_sim failed: %s\n", dlerror());

+        exit(EXIT_FAILURE);

+    }

+

+    print_help();

+    while(1)

+    {

+        printf("\nplease input cmd index(-1 exit): ");

+        if(1 != scanf("%d", &cmdIdx))

+            break;

+        if(cmdIdx == -1)

+        {

+            break;

+        }

+

+        switch(cmdIdx)

+        {

+            //"qser_sim_init"

+            case 0:

+            {

+                if(flag_init == 1)

+                {

+                   printf("init is already\n");

+                   break;

+                }

+                else{

+                    //int token;

+                    //printf("input token\n");

+                    //scanf("%d", &token);

+                    qser_sim_client_init = (int(*)(sim_client_handle_type  *h_sim))dlsym(dlHandle_sim,"qser_sim_client_init");

+                    if(NULL != qser_sim_client_init)

+                    {

+                        res = qser_sim_client_init(&h_sim);

+                        if(res == 0)

+                        {

+                            printf("Run qser_sim_client_init\n");

+                            flag_init = 1;

+                        }else{

+                            printf("qser_sim_client_init error\n");

+                        }

+                    }else{

+                        printf("qser_sim_client_init dlsym error\n");

+                    }

+                    break;

+                }

+            }

+

+            //"qser_sim_getimsi"

+            case 1:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char imsi[BUF_SIZE] = {0};

+                    QSER_SIM_APP_ID_INFO_T pt_info;

+                    qser_sim_getimsi = (int(*)(sim_client_handle_type h_sim, QSER_SIM_APP_ID_INFO_T *pt_info, char *imsi, size_t imsiLen))dlsym(dlHandle_sim,"qser_sim_getimsi");

+                    if(NULL != qser_sim_getimsi)

+                    {

+                        res = qser_sim_getimsi(h_sim, &pt_info, imsi, BUF_SIZE);

+                        if(res == 0)

+                        {

+                            printf("imsi is %s!!!\n",imsi);

+                        }else{

+                            printf("get imsi error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_getimsi dlsym error\n");

+                    }

+                }

+                break;

+            }

+

+            //"qser_get_iccid"

+            case 2:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char iccid[BUF_SIZE] = {0};

+                     qser_sim_geticcid = (int(*)(sim_client_handle_type h_sim, QSER_SIM_SLOT_ID_TYPE_T simId, char *iccid, size_t iccidLen))dlsym(dlHandle_sim,"qser_sim_geticcid");

+                    if(NULL != qser_sim_geticcid)

+                    {

+                        res = qser_sim_geticcid(h_sim, QSER_SIM_SLOT_ID_1, iccid, BUF_SIZE);

+                        if(res == 0)

+                        {

+                            printf("get iccid success!!! iccid is %s\n",iccid);

+                        }else{

+                            printf("get iccid error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_geticcid dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_get_phonenumber

+            case 3:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char phonenumber[BUF_SIZE] = "";

+                    QSER_SIM_APP_ID_INFO_T pt_info;

+                    qser_sim_getphonenumber = (int(*)(sim_client_handle_type h_sim, QSER_SIM_APP_ID_INFO_T *pt_info, char *phone_num, size_t phoneLen))dlsym(dlHandle_sim,"qser_sim_getphonenumber");

+                    if(NULL != qser_sim_getphonenumber)

+                    {

+                        res = qser_sim_getphonenumber(h_sim, &pt_info, phonenumber, BUF_SIZE);

+                        if(res == 0)

+                        {

+                            printf("get phonenumber success!!! phonenumber is %s\n",phonenumber);

+                        }else{

+                            printf("get phonenumber error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_getphonenumber dlsym error\n");

+                    }

+                }

+                break;

+           }

+            //qser_verify_pin

+            case 4:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char pin[BUF_PIN] = {0};

+                    QSER_SIM_VERIFY_PIN_INFO_T pt_info;

+                    printf("input pin\n");

+                    if(1 != scanf("%s", pin))

+                        break;

+                    strncpy(pt_info.pin_value, pin, BUF_PIN);

+                    printf("pin_value = %s , pin = %s\n", pt_info.pin_value, pin);

+

+                    qser_sim_verifypin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_VERIFY_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_verifypin");

+                    if(NULL != qser_sim_verifypin)

+                    {

+                        res = qser_sim_verifypin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("verify pin success!!!\n");

+                        }else{

+                            printf("verify pin error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_verifypin dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_change_pin

+            case 5:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char old_pin[BUF_PIN] = {0};

+                    QSER_SIM_CHANGE_PIN_INFO_T pt_info;

+                    printf("input old pin\n");

+                    if(1 != scanf("%s", old_pin))

+                        break;

+                    char new_pin[BUF_PIN] = {0};

+                    printf("input new pin\n");

+                    if(1 != scanf("%s", new_pin))

+                        break;

+                    strncpy(pt_info.old_pin_value, old_pin, BUF_PIN);

+                    strncpy(pt_info.new_pin_value, new_pin, BUF_PIN);

+                    printf("pt_info.old_pin_value = %s, old_pin = %s\n", pt_info.old_pin_value, old_pin);

+                    printf("pt_info.new_pin_value = %s, new_pin = %s\n", pt_info.new_pin_value, new_pin);

+

+                    qser_sim_changepin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_CHANGE_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_changepin");

+                    if(NULL != qser_sim_changepin)

+                    {

+                        res = qser_sim_changepin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("change pin success!!!\n");

+                        }else{

+                            printf("change pin error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("lynq_change_pin dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_unlock_pin

+            case 6:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char puk[BUF_PIN] = {0};

+                    QSER_SIM_UNBLOCK_PIN_INFO_T pt_info;

+                    printf("input  puk\n");

+                    if(1 != scanf("%s", puk))

+                        break;

+                    char new_pin[BUF_PIN] = {0};

+                    printf("input new pin\n");

+                    if(1 != scanf("%s", new_pin))

+                        break;

+                    memset(pt_info.puk_value, 0, sizeof(pt_info.puk_value));

+                    memset(pt_info.new_pin_value, 0, sizeof(pt_info.new_pin_value));

+                    strncpy(pt_info.puk_value, puk, BUF_PIN);

+                    strncpy(pt_info.new_pin_value, new_pin, BUF_PIN);

+                    printf("pt_info.puk_value = %s, puk = %s\n", pt_info.puk_value, puk);

+                    printf("pt_info.new_pin_value = %s, new_pin = %s\n", pt_info.new_pin_value, new_pin);

+

+                    qser_sim_unblockpin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_UNBLOCK_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_unblockpin");

+                    if(NULL != qser_sim_unblockpin)

+                    {

+                        res = qser_sim_unblockpin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("unlock pin success!!!\n");

+                        }else{

+                            printf("unlock pin error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_unblockpin dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_enable_pin

+            case 7:

+           {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char pin[BUF_PIN] = {0};

+                    QSER_SIM_ENABLE_PIN_INFO_T pt_info;

+                    printf("input pin\n");

+                    if(1 != scanf("%s", pin))

+                        break;

+                    strncpy(pt_info.pin_value, pin, BUF_PIN);

+

+                    qser_sim_enablepin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_ENABLE_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_enablepin");

+                    if(NULL != qser_sim_enablepin)

+                    {

+                        res = qser_sim_enablepin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("pin enabled!!!\n");

+                        }else{

+                            printf("pin enable error, res =%d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_enablepin dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_disable_pin

+            case 8:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char pin[BUF_PIN] = {0};

+                    QSER_SIM_ENABLE_PIN_INFO_T pt_info;

+                    printf("input pin\n");

+                    if(1 != scanf("%s", pin))

+                        break;

+                    strncpy(pt_info.pin_value, pin, BUF_PIN);

+

+                    qser_sim_disablepin = (int(*)(sim_client_handle_type h_sim, QSER_SIM_DISABLE_PIN_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_disablepin");

+                    if(NULL != qser_sim_disablepin)

+                    {

+                        res = qser_sim_disablepin(h_sim, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("pin disnabled!!!\n");

+                        }else{

+                            printf("pin disable error,res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_disablepin dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_get_sim_status

+            case 9:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    QSER_SIM_CARD_STATUS_INFO_T pt_info;

+

+                    qser_sim_getcardstatus = (int(*)(sim_client_handle_type h_sim, QSER_SIM_SLOT_ID_TYPE_T simId, QSER_SIM_CARD_STATUS_INFO_T *pt_info))dlsym(dlHandle_sim,"qser_sim_getcardstatus");

+                    if(NULL != qser_sim_getcardstatus)

+                    {

+                        res = qser_sim_getcardstatus(h_sim, QSER_SIM_SLOT_ID_1, &pt_info);

+                        if(res == 0)

+                        {

+                            printf("state is 0x%x !!!\n",pt_info.e_card_state);

+                        }else{

+                            printf("get imsi error,res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_getcardstatus dlsym error\n");

+                    }

+                }

+                break;

+            }

+            //qser_deinit_sim

+            case 10:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char imei[BUF_SIZE]="";

+                    qser_sim_getimei = (int(*)(sim_client_handle_type h_sim, char *imei))dlsym(dlHandle_sim,"qser_sim_getimei");

+                    if(NULL != qser_sim_getimei)

+                    {

+                        res = qser_sim_getimei(h_sim, imei);

+                        if(res == 0)

+                        {

+                            printf("get imei success!!!\n");

+                        }else{

+                            printf("get imei error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_getimei dlsym error\n");

+                    }

+                 }

+                    //flag_init = 0;

+                    break;

+            }

+            //qser_get_imei_and_sv

+            case 11:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char imei[BUF_SIZE]="";

+                    char sv[BUF_SIZE]="";

+                    qser_get_imei_and_sv = (int(*)(sim_client_handle_type h_sim, char *imei, char *sv))dlsym(dlHandle_sim,"qser_get_imei_and_sv");

+                    if(NULL != qser_get_imei_and_sv)

+                    {

+                        res = qser_get_imei_and_sv(h_sim, imei, sv);

+                        if(res == 0)

+                        {

+                            printf("get imei and sv success!!!\n");

+                        }else{

+                            printf("get imei and sv error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_get_imei_and_sv dlsym error\n");

+                    }

+                }

+                //flag_init = 0;

+                break;

+            }

+            //qser_reset_modem

+            case 12:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    qser_reset_modem = (int(*)(sim_client_handle_type h_sim))dlsym(dlHandle_sim,"qser_reset_modem");

+                    if(NULL != qser_reset_modem)

+                    {

+                        res = qser_reset_modem(h_sim);

+                        if(res == 0)

+                        {

+                            printf("reset modem success!!!\n");

+                        }else{

+                            printf("reset modem error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_reset_modem dlsym error\n");

+                    }

+                }

+                //flag_init = 0;

+                break;

+            }

+            //qser_get_version

+            case 13:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    char buf[VER_SIZE]="";

+                    qser_get_version = (int(*)(sim_client_handle_type h_sim, char *buf))dlsym(dlHandle_sim,"qser_get_version");

+                    if(NULL != qser_get_version)

+                    {

+                        res = qser_get_version(h_sim, buf);

+                        if(res == 0)

+                        {

+                            printf("get version success!!!\n");

+                        }else{

+                            printf("get version error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_get_version dlsym error\n");

+                    }

+                }

+                //flag_init = 0;

+                break;

+            }

+            //qser_reset_sim

+            case 14:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    qser_reset_sim = (int(*)(sim_client_handle_type h_sim))dlsym(dlHandle_sim,"qser_reset_sim");

+                    if(NULL != qser_reset_sim)

+                    {

+                        res = qser_reset_sim(h_sim);

+                        if(res == 0)

+                        {

+                            printf("reset sim success!!!\n");

+                        }else{

+                            printf("reset sim error, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_reset_sim dlsym error\n");

+                    }

+                }

+                //flag_init = 0;

+                break;

+            }

+            case 15://qser_sim_addrxmsghandler

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    qser_sim_addrxmsghandler = (int(*)(QSER_SIM_RxMsgHandlerFunc_t handlerPtr))dlsym(dlHandle_sim,"qser_sim_addrxmsghandler");

+                    if(NULL != qser_sim_addrxmsghandler)

+                    {

+                        res = qser_sim_addrxmsghandler(qser_sim_handler);

+                        if(res == 0)

+                        {

+                            printf("sim addrxmsghandler success is!!!\n");

+                        }else{

+                            printf("sim addrxmsghandler errors, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_addrxmsghandler dlsym error\n");

+                    }

+                 }

+                //flag_init = 0;

+                break;

+            }

+            //qser_deinit_sim

+            case 16:

+            {

+                if(flag_init == 0){

+                    printf("must init first\n");

+                }

+                else{

+                    qser_sim_client_deinit = (int(*)(sim_client_handle_type h_sim))dlsym(dlHandle_sim,"qser_sim_client_deinit");

+                    if(NULL != qser_sim_client_deinit)

+                    {

+                        res = qser_sim_client_deinit(h_sim);

+                        if(res == 0)

+                        {

+                            printf("sim deinit success is!!!\n");

+                        }else{

+                            printf("sim deint errors, res = %d\n", res);

+                        }

+                    }else{

+                        printf("qser_sim_client_deinit dlsym error\n");

+                    }

+                 }

+                flag_init = 0;

+                break;

+            }

+            default:

+                print_help();

+                break;

+        }

+

+    }

+

+   return 0;

+

+

+}

+

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-sim-demo.h b/mbtk/test/liblynq_lib_t106/lynq-qser-sim-demo.h
new file mode 100755
index 0000000..1a4829b
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-sim-demo.h
@@ -0,0 +1,171 @@
+#define QSER_SIM_IMSI_LEN_MAX     16  /**  Maximum length of IMSI data. */

+#define QSER_SIM_ICCID_LEN_MAX    20  /**  Maximum length of ICCID data. */

+

+

+typedef enum 

+{

+    E_QSER_SUCCESS                        = 0,    /**<  Success. */

+    E_QSER_ERROR_BADPARM                  = 4,    /**<  Bad parameter. */

+}E_QSER_ERROR_CODE_T;

+

+typedef enum 

+{

+    QSER_SIM_SLOT_ID_1          = 0xB01,    /**< Identify card in slot 1.  */

+    QSER_SIM_SLOT_ID_2          = 0xB02,    /**< Identify card in slot 2.  */

+}QSER_SIM_SLOT_ID_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_APP_TYPE_UNKNOWN   = 0xB00,    /**<  Unknown application type  */

+    QSER_SIM_APP_TYPE_3GPP      = 0xB01,    /**< Identify the SIM/USIM application on the card.  */

+    QSER_SIM_APP_TYPE_3GPP2     = 0xB02,    /**< Identify the RUIM/CSIM application on the card.  */

+    QSER_SIM_APP_TYPE_ISIM      = 0xB03,    /**< Identify the ISIM application on the card.  */

+}QSER_SIM_APP_TYPE_T;

+

+typedef struct 

+{

+    QSER_SIM_SLOT_ID_TYPE_T     e_slot_id;  /**< Indicates the slot to be used. */

+    QSER_SIM_APP_TYPE_T         e_app;      /**< Indicates the type of the application. */

+}QSER_SIM_APP_ID_INFO_T;  /* Type */

+

+#define QSER_SIM_PIN_LEN_MAX  8+1   /**  Maximum length of PIN data. */

+

+typedef enum 

+{

+    QSER_SIM_PIN_ID_1 = 0xB01,  /**< Level 1 user verification.  */

+    QSER_SIM_PIN_ID_2 = 0xB02,  /**< Level 2 user verification.  */

+}QSER_SIM_PIN_ID_TYPE_T;

+

+typedef struct 

+{

+    QSER_SIM_APP_ID_INFO_T        app_info;                           /**< Application identification information. */

+    QSER_SIM_PIN_ID_TYPE_T  pin_id;                             /**< PIN ID. */

+    uint32_t                    pin_value_len;                      /**< Must be set to the number of elements in pin_value. */

+    char                        pin_value[QSER_SIM_PIN_LEN_MAX];  /*  Value of the PIN */

+}QSER_SIM_VERIFY_PIN_INFO_T;

+

+typedef struct 

+{

+    QSER_SIM_APP_ID_INFO_T        app_info;                               /**< Application identification information. */

+    QSER_SIM_PIN_ID_TYPE_T  pin_id;                                 /**< PIN ID. */

+    uint32_t                    old_pin_value_len;                      /**< Must be set to the number of elements in old_pin_value. */

+    char                        old_pin_value[QSER_SIM_PIN_LEN_MAX];  /**< Value of the old PIN as a sequence of ASCII characters. */

+    uint32_t                    new_pin_value_len;                      /**< Must be set to the number of elements in new_pin_value. */

+    char                        new_pin_value[QSER_SIM_PIN_LEN_MAX];  /**< Value of the new PIN as a sequence of ASCII characters. */

+}QSER_SIM_CHANGE_PIN_INFO_T;

+

+typedef struct 

+{

+    QSER_SIM_APP_ID_INFO_T        app_info;                               /**< Application identification information. */

+    QSER_SIM_PIN_ID_TYPE_T  pin_id;                                 /**< PIN ID. */

+    uint32_t                    puk_value_len;                          /**< Must be set to the number of elements in puk_value. */

+    char                        puk_value[QSER_SIM_PIN_LEN_MAX];      /**< Value of the PUK as a sequence of ASCII characters. */

+    uint32_t                    new_pin_value_len;                      /**< Must be set to the number of elements in new_pin_value. */

+    char                        new_pin_value[QSER_SIM_PIN_LEN_MAX];  /**< Value of the new PIN as a sequence of ASCII characters. */

+}QSER_SIM_UNBLOCK_PIN_INFO_T;

+

+/** Enables the PIN on an application. */

+typedef  QSER_SIM_VERIFY_PIN_INFO_T QSER_SIM_ENABLE_PIN_INFO_T; //Same 

+

+/** Disables the PIN of an application, */

+typedef  QSER_SIM_VERIFY_PIN_INFO_T QSER_SIM_DISABLE_PIN_INFO_T; //Same 

+

+

+typedef enum 

+{

+    QSER_SIM_PERSO_FEATURE_TYPE_UNKNOWN                 = 0xB00, /**<  Unknown personalization feature.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_NETWORK            = 0xB01, /**<  Featurization based on 3GPP MCC and MNC.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_NETWORK_SUBSET     = 0xB02, /**<  Featurization based on 3GPP MCC, MNC, and IMSI digits 6 and 7.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_SERVICE_PROVIDER   = 0xB03, /**<  Featurization based on 3GPP MCC, MNC, and GID1.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_CORPORATE          = 0xB04, /**<  Featurization based on 3GPP MCC, MNC, GID1, and GID2.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP_SIM                = 0xB05, /**<  Featurization based on the 3GPP IMSI.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP2_NETWORK_TYPE_1    = 0xB06, /**<  Featurization based on 3GPP2 MCC and MNC.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP2_NETWORK_TYPE_2    = 0xB07, /**<  Featurization based on 3GPP2 IRM code.  */

+    QSER_SIM_PERSO_FEATURE_TYPE_3GPP2_RUIM              = 0xB08, /**<  Featurization based on 3GPP2 IMSI_M.  */

+}QSER_SIM_PERSO_FEATURE_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_CARD_STATE_UNKNOWN                     = 0xB01,    /**< Card state unknown. */

+    QSER_SIM_CARD_STATE_ABSENT                      = 0xB02,    /**< Card is absent. */

+    QSER_SIM_CARD_STATE_PRESENT                     = 0xB03,    /**< Card is present. */

+    QSER_SIM_CARD_STATE_ERROR_UNKNOWN               = 0xB04,    /**< Unknown error state. */

+    QSER_SIM_CARD_STATE_ERROR_POWER_DOWN            = 0xB05,    /**< Power down. */

+    QSER_SIM_CARD_STATE_ERROR_POLL_ERROR            = 0xB06,    /**< Poll error. */

+    QSER_SIM_CARD_STATE_ERROR_NO_ATR_RECEIVED       = 0xB07,    /**<  Failed to receive an answer to reset.  */

+    QSER_SIM_CARD_STATE_ERROR_VOLT_MISMATCH         = 0xB08,    /**< Voltage mismatch. */

+    QSER_SIM_CARD_STATE_ERROR_PARITY_ERROR          = 0xB09,    /**< Parity error. */

+    QSER_SIM_CARD_STATE_ERROR_SIM_TECHNICAL_PROBLEMS= 0xB0A,    /**< Card returned technical problems. */

+}QSER_SIM_CARD_STATE_TYPE_T;  /**< Card state. */

+

+typedef enum 

+{

+    QSER_SIM_CARD_TYPE_UNKNOWN  = 0xB00,    /**<  Unidentified card type.  */

+    QSER_SIM_CARD_TYPE_ICC      = 0xB01,    /**<  Card of SIM or RUIM type.  */

+    QSER_SIM_CARD_TYPE_UICC     = 0xB02,    /**<  Card of USIM or CSIM type.  */

+}QSER_SIM_CARD_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_PROV_STATE_NONE    = 0xB00,    /**<  Nonprovisioning.  */

+    QSER_SIM_PROV_STATE_PRI     = 0xB01,    /**<  Primary provisioning subscription.  */

+    QSER_SIM_PROV_STATE_SEC     = 0xB02,    /**<  Secondary provisioning subscription.  */

+}QSER_SIM_SUBSCRIPTION_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_APP_STATE_UNKNOWN                  = 0xB00,    /**< Application state unknown. */

+    QSER_SIM_APP_STATE_DETECTED                 = 0xB01,    /**<  Detected state.  */

+    QSER_SIM_APP_STATE_PIN1_REQ                 = 0xB02,    /**<  PIN1 required.  */

+    QSER_SIM_APP_STATE_PUK1_REQ                 = 0xB03,    /**<  PUK1 required.  */

+    QSER_SIM_APP_STATE_INITALIZATING            = 0xB04,    /**<  Initializing.  */

+    QSER_SIM_APP_STATE_PERSO_CK_REQ             = 0xB05,    /**<  Personalization control key required.  */

+    QSER_SIM_APP_STATE_PERSO_PUK_REQ            = 0xB06,    /**<  Personalization unblock key required.  */

+    QSER_SIM_APP_STATE_PERSO_PERMANENTLY_BLOCKED= 0xB07,    /**<  Personalization is permanently blocked.  */

+    QSER_SIM_APP_STATE_PIN1_PERM_BLOCKED        = 0xB08,    /**<  PIN1 is permanently blocked.  */

+    QSER_SIM_APP_STATE_ILLEGAL                  = 0xB09,    /**<  Illegal application state.  */

+    QSER_SIM_APP_STATE_READY                    = 0xB0A,    /**<  Application ready state.  @newpage */

+}QSER_SIM_APP_STATE_TYPE_T;

+

+typedef enum 

+{

+    QSER_SIM_PIN_STATE_UNKNOWN                  = 0xB01,    /**< Unknown PIN state. */

+    QSER_SIM_PIN_STATE_ENABLED_NOT_VERIFIED     = 0xB02,    /**<  PIN required, but has not been verified.  */

+    QSER_SIM_PIN_STATE_ENABLED_VERIFIED         = 0xB03,    /**<  PIN required and has been verified.  */

+    QSER_SIM_PIN_STATE_DISABLED                 = 0xB04,    /**<  PIN not required.  */

+    QSER_SIM_PIN_STATE_BLOCKED                  = 0xB05,    /**<  PIN verification has failed too many times and is blocked. Recoverable through PUK verification.  */

+    QSER_SIM_PIN_STATE_PERMANENTLY_BLOCKED      = 0xB06,    /**<  PUK verification has failed too many times and is not recoverable.  */

+}QSER_SIM_PIN_STATE_TYPE_T;

+

+typedef struct 

+{

+    QSER_SIM_SUBSCRIPTION_TYPE_T      subscription;           /**<   Type of subscription (i.e., primary, secondary, etc.). */

+    QSER_SIM_APP_STATE_TYPE_T         app_state;              /**<   Current state of the application. */

+    QSER_SIM_PERSO_FEATURE_TYPE_T   perso_feature;          /**<   Current personalization state and feature enabled. */

+    uint8_t                             perso_retries;          /**<   Number of personalization retries. */

+    uint8_t                             perso_unblock_retries;  /**<   Number of personalization unblock retries. */

+    QSER_SIM_PIN_STATE_TYPE_T         pin1_state;             /**<   Current PIN 1 state. */

+    uint8_t                             pin1_num_retries;       /**<   Number of PIN 1 retries. */

+    uint8_t                             puk1_num_retries;       /**<   Number of PUK 1 retries. */

+    QSER_SIM_PIN_STATE_TYPE_T         pin2_state;             /**<   Current PIN 2 state. */

+    uint8_t                             pin2_num_retries;       /**<   Number of PIN 2 retries. */

+    uint8_t                             puk2_num_retries;       /**<   Number of PUK 2 retries. */

+}QSER_SIM_CARD_APP_INFO_T;

+

+typedef struct 

+{

+    QSER_SIM_CARD_APP_INFO_T          app_3gpp;               /**<   Stores 3GPP application information. */

+    QSER_SIM_CARD_APP_INFO_T          app_3gpp2;              /**<   Stores 3GPP2 application information. */

+    QSER_SIM_CARD_APP_INFO_T          app_isim;               /**<   Stores ISIM application information. */

+}QSER_SIM_CARD_ALL_APP_INFO_T;

+

+typedef struct 

+{

+    QSER_SIM_CARD_STATE_TYPE_T      e_card_state;/**<   Current card and card error state. */

+    QSER_SIM_CARD_TYPE_T            e_card_type; /**<   Card type. */

+    QSER_SIM_CARD_ALL_APP_INFO_T      card_app_info; /**<   Stores all relevant application information. */

+}QSER_SIM_CARD_STATUS_INFO_T;

+typedef QSER_SIM_CARD_STATUS_INFO_T*      QSER_SIM_MsgRef; 

+/* Callback function registered to qser_sim_addrxmsghandler, msgRef contains the detail msg infor */

+typedef void (*QSER_SIM_RxMsgHandlerFunc_t)(QSER_SIM_MsgRef msgRef);

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-sms-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-qser-sms-demo.cpp
new file mode 100755
index 0000000..42aa2e0
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-sms-demo.cpp
@@ -0,0 +1,188 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/types.h>

+#include <pthread.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+#include <ctype.h>

+

+#include"lynq-qser-sms-demo.h"

+#include "mbtk_log.h"

+

+

+#define SMS_BUF  64

+#define MSG_BUF  100

+

+int flag_init = 0;

+

+typedef uint32_t sim_client_handle_type;

+//sms_client_handle_type  ph_sms = 2022;

+sms_client_handle_type  h_sms = 2022;

+

+

+int (*qser_sms_client_init)(sms_client_handle_type  *h_sms);

+int (*qser_sms_client_deinit)(sms_client_handle_type h_sms);

+int (*qser_sms_send_sms)(sms_client_handle_type h_sms, QSER_sms_info_t *pt_sms_info);

+int (*qser_sms_addrxmsghandler)(QSER_SMS_RxMsgHandlerFunc_t handlerPtr, void* contextPtr);

+int (*qser_sms_deletefromstorage)(sms_client_handle_type  h_sms, QSER_sms_storage_info_t  *pt_sms_storage);

+int (*qser_sms_getsmscenteraddress)(sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *set_sca_cfg);

+//int (*qser_sms_setsmscenteraddress)(sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *get_sca_cfg);

+

+void qser_sms_handler(QSER_SMS_MsgRef msgRef, void* contextPtr) {

+    printf("[%s-%d] sms handler, msgRef->sms_data = %s,addr =%s\n", __FUNCTION__, __LINE__, msgRef->sms_data, msgRef->src_addr);

+}

+

+bool isNumeric(char *phnum) {

+    int length = strlen(phnum);

+

+    if (length == 0) {

+        return false;

+    }

+

+    if (phnum[0] != '+' && (phnum[0] < '0' || phnum[0] > '9')) {

+        return false;

+    }

+

+    if (phnum[0] == '+' && length < 3) {

+        return false;

+    }

+

+    for (int i = 1; i < length; i++) {

+        if (phnum[i] < '0' || phnum[i] > '9') {

+            return false;

+        }

+    }

+

+    return true;

+}

+

+//以下示例默认为所有API 执行都成功的情况下,依次执行后续API

+int main(int argc, char *argv[])

+{

+    int ret    = 0;

+    //char phnum[SMS_BUF]={0};

+    mbtk_log_init((char*)"radio", (char*)"MBTK");

+

+    const char *lynq_libpath_sms = (char*)"/lib/liblynq-qser-sms.so";

+    void *dlHandle_sms = dlopen(lynq_libpath_sms, RTLD_NOW);

+

+    if (dlHandle_sms == NULL)

+    {

+        printf("dlopen dlHandle_sms failed: %s\n", dlerror());

+        exit(EXIT_FAILURE);

+    }

+

+    if(argc != 2 || !isNumeric(argv[1]))

+    {

+        printf("[%s][%d] please input correct phnum\n",__FUNCTION__,__LINE__);

+        exit(1);

+    }

+

+    qser_sms_client_init = (int(*)(sms_client_handle_type  *h_sms))dlsym(dlHandle_sms,"qser_sms_client_init");

+    if(NULL != qser_sms_client_init)

+    {

+        ret = qser_sms_client_init(&h_sms);

+        if(ret == 0)

+        {

+            printf("Run qser_sms_client_init\n");

+        }else{

+            printf("qser_sim_client_init error\n");

+        }

+     }else{

+            printf("qser_sim_client_init dlsym error\n");

+     }

+

+    sleep(2);

+

+    qser_sms_addrxmsghandler = (int(*)(QSER_SMS_RxMsgHandlerFunc_t handlerPtr, void* contextPtr))dlsym(dlHandle_sms,"qser_sms_addrxmsghandler");

+

+    if(NULL != qser_sms_addrxmsghandler)

+    {

+        ret = qser_sms_addrxmsghandler(qser_sms_handler, NULL);

+        if(ret == 0)

+    {

+        printf("qser_sms_addrxmsghandler success\n");

+    }else{

+        printf("qser_sms_addrxmsghandler error, ret = %d\n", ret);

+    }

+    }else{

+        printf("qser_sms_addrxmsghandler dlsym error\n");

+    }

+

+    QSER_sms_service_center_cfg_t get_sca_cfg;

+    qser_sms_getsmscenteraddress = (int (*)(sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *get_sca_cfg))dlsym(dlHandle_sms,"qser_sms_getsmscenteraddress");

+    if(NULL != qser_sms_getsmscenteraddress)

+    {

+        ret = qser_sms_getsmscenteraddress(h_sms, &get_sca_cfg);

+        if(ret == 0)

+        {

+            printf("get smsc success,service_center_addr = %s\n",get_sca_cfg.service_center_addr);

+        }else{

+            printf("get smsc error, ret = %d\n", ret);

+        }

+    }else{

+        printf("qser_sms_getsmscenteraddress dlsym error\n");

+    }

+    sleep(1);

+#if 0

+    QSER_sms_service_center_cfg_t set_sca_cfg;

+    memset(set_sca_cfg.service_center_addr, 0, sizeof(set_sca_cfg.service_center_addr));

+    strncpy(set_sca_cfg.service_center_addr, "+8613800230500", 14);//smsc need userchange

+    qser_sms_setsmscenteraddress = (int (*)(sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *set_sca_cfg))dlsym(dlHandle_sms,"qser_sms_setsmscenteraddress");

+    if(NULL != qser_sms_setsmscenteraddress)

+    {

+        ret = qser_sms_setsmscenteraddress(h_sms, &set_sca_cfg);

+        if(ret == 0)

+        {

+            printf("set smsc success");

+        }else{

+            printf("set smsc error, ret = %d\n", ret);

+        }

+    }else{

+        printf("qser_sms_setsmscenteraddress dlsym error\n");

+    }

+#endif

+   // char telephony_num[SMS_BUF] = {};

+    char msg[MSG_BUF] = {};

+    QSER_sms_info_t  pt_sms_info;

+   // sprintf(telephony_num,"10086");//请用户务必替换此号码,随意向运营商发短消息极有可能被封号。

+    sprintf(msg,"Chello worrld-7bit-mr!.");

+    strncpy(pt_sms_info.src_addr, argv[1], SMS_BUF);

+    strncpy(pt_sms_info.sms_data, msg, MSG_BUF);

+    pt_sms_info.format = QSER_SMS_7BIT;

+  //  printf("[%s,%d]  src_addr=%s, telephony_num = %s\n",__FUNCTION__,__LINE__, pt_sms_info.src_addr, telephony_num);

+    printf("[%s,%d]  sms_data=%s, msg = %s\n",__FUNCTION__,__LINE__, pt_sms_info.sms_data, msg);

+

+    qser_sms_send_sms = (int (*)(sms_client_handle_type h_sms, QSER_sms_info_t *pt_sms_info))dlsym(dlHandle_sms,"qser_sms_send_sms");

+    if(NULL != qser_sms_send_sms)

+    {

+        ret = qser_sms_send_sms(h_sms, &pt_sms_info);

+        if(ret == 0)

+        {

+            printf("send sms success\n");

+        }else{

+            printf("send sms error, ret = %d\n", ret);

+        }

+    }else{

+        printf("qser_sms_send_sms dlsym error\n");

+    }

+

+    sleep(120);//在此期间向模组发送短消息,即可触发“接受新短消息事件”。

+    qser_sms_client_deinit = (int (*)(sms_client_handle_type h_sms))dlsym(dlHandle_sms,"qser_sms_client_deinit");

+    if(NULL != qser_sms_client_deinit)

+    {

+        ret = qser_sms_client_deinit(h_sms);

+        if(ret == 0)

+        {

+            printf("sms deinit success\n");

+        }else{

+            printf("sms deinit error, ret = %d\n", ret);

+        }

+    }else{

+        printf("qser_sms_client_deinit dlsym error\n");

+    }

+

+}

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-sms-demo.h b/mbtk/test/liblynq_lib_t106/lynq-qser-sms-demo.h
new file mode 100755
index 0000000..500d946
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-sms-demo.h
@@ -0,0 +1,168 @@
+#define MIN_MSM_PARAM_NUM 4

+#define MIN_IMS_MSM_PARAM_NUM 6

+#define MIN_WRITMSM_PARAM_NUM 5

+#define MSG_MAX_LEN 1024

+#define TELEPHONNUM_LEN 64

+#define STORAGSMS_MAX_SIZE 128

+#define SMSC_MAX_LEN 22

+#define SMS_NUM_MAX 255

+

+typedef unsigned short uint16_t;

+typedef unsigned int uint32_t;

+typedef uint32_t sms_client_handle_type;

+

+/**  Maximum length of an SMS. */

+#define QSER_SMS_MAX_MT_MSG_LENGTH    1440

+

+/**  Maximum string length. */

+#define QSER_SMS_MAX_ADDR_LENGTH      252

+

+/**  Maximum string length. */

+#define QSER_SMS_MAX_SCA_TYPLENGTH 3

+

+typedef enum   

+{    

+    QSER_SMS_7BIT        = 0,

+    QSER_SMS_8BIT     = 1,

+    QSER_SMS_UCS2            = 2,

+    //<2017/12/28-QCM9XOL00004C001-P01-Vicent.Gao, <[SMS] Segment 1==> CharSet to Alpha implementation.>

+    QSER_SMS_IRA             = 3,

+    //>2017/12/28-QCM9XOL00004C001-P01-Vicent.Gao

+

+}QSER_SMS_T;   

+

+typedef enum   

+{    

+    QSER_SMS_MO               = 0,    ///< SMS mobile terminated message.  

+    QSER_SMS_MT               = 1,    ///< SMS mobile originated message. 

+    QSER_SMS_BROADCAST_MT      = 2     ///< SMS Cell Broadcast message.   

+}QSER_SMS_TYPT; 

+

+typedef enum 

+{

+    QSER_SMS_STORAGTYPNONE      = -1,   /**<  Message no need to store. */

+    QSER_SMS_STORAGTYPUIM       = 0,    /**<  Message store to UIM. */

+    QSER_SMS_STORAGTYPNV        = 1,    /**<  Message store to NV. */

+    QSER_SMS_STORAGTYPDB     = 2,    /**<  Message store to NV. */

+}QSER_SMS_STORAGTYPT;

+

+typedef enum 

+{

+    QSER_SMS_MESSAGMODUNKNOWN   = -1,   /**<  Message type CDMA */

+    QSER_SMS_MESSAGMODCDMA      = 0,    /**<  Message type CDMA */

+    QSER_SMS_MESSAGMODGW        = 1,    /**<  Message type GW. */

+}QSER_SMS_MODTYPT;

+

+typedef struct 

+ {

+    uint8_t total_segments;     /**<     The number of long  short message*/

+    uint8_t seg_number;         /**<     Current number.*/

+	uint8_t referencnumber;   /**< referencnumber.*/

+}QSER_sms_user_data_head_t; 

+

+typedef struct

+{

+    /* If sms is stored, it won't parse, you need read it by yourself */

+    QSER_SMS_STORAGTYPT storage;                          ///specify where stored this msg

+    

+    QSER_SMS_T       format;

+    QSER_SMS_TYPT         type;

+    char                    src_addr[QSER_SMS_MAX_ADDR_LENGTH]; ///Telephone number string.  

+    int                     sms_data_len;

+    char                    sms_data[QSER_SMS_MAX_MT_MSG_LENGTH];   ///SMS content, data format depends on format

+    char                    timestamp[21];                      ///Message time stamp (in text mode). string format: "yy/MM/dd,hh:mm:ss+/-TimeZone" 

+    uint8_t                 user_data_head_valid;               //indicate whether long sms. TRUE-long sms; FALSE-short message;

+    QSER_sms_user_data_head_t  user_data_head;                    //long sms user data head info.

+    QSER_SMS_MODTYPT    mode;                             ///specify where stored this msg cdma or gw area

+    uint32_t                storage_index;                      ///storage index, -1 means not store

+} QSER_sms_info_t;

+     

+typedef struct

+{

+    QSER_SMS_STORAGTYPT storage;

+    QSER_SMS_MODTYPT    mode;

+    uint32_t                storage_idx;

+} QSER_sms_storage_info_t;

+

+typedef enum 

+{

+    QSER_SMS_UNKNOWN            = -1, 

+    QSER_SMS_DISCARD            = 0x00, /*  Incoming messages for this route are discarded by the WMS service without 

+                                            notifying QMI_WMS clients */

+    QSER_SMS_STORAND_NOTIFY   = 0x01, /*  Incoming messages for this route are stored to the specified device 

+                                            memory, and new message notifications */

+    QSER_SMS_TRANSFER_ONLY      = 0x02, /*  Incoming messages for this route are transferred to the client, and the

+                                            client is expected to send ACK to the network */

+    QSER_SMS_TRANSFER_AND_ACK   = 0x03, /*  Incoming messages for this route are transferred to the client, and ACK is

+                                            sent to the network */

+}QSER_SMS_RECEPTION_ACTION_TYPT;

+

+#define QSER_WMS_MESSAGLENGTH_MAX 255

+

+typedef enum 

+ {

+    QSER_WMS_MESSAGCDMA            = 0x00,     //- 0x00 -- MESSAGCDMA -- CDMA \n 

+    QSER_WMS_MESSAGGW_PP           = 0x06,     //- 0x06 -- MESSAGGW_PP -- GW_PP

+}QSER_WMS_MESSAGTYPE;

+

+

+typedef struct

+ {

+  QSER_WMS_MESSAGTYPE format;

+  uint32_t raw_messaglen;                             /**< Must be set to # of elements in raw_message */

+  uint8_t raw_message[QSER_WMS_MESSAGLENGTH_MAX];       /**< Raw message data*/

+}QSER_wms_send_raw_message_data_t; 

+

+typedef enum

+{

+  QSER_WMS_TL_CAUSCODADDR_VACANT                        = 0x00, 

+  QSER_WMS_TL_CAUSCODADDR_TRANSLATION_FAILURE           = 0x01, 

+  QSER_WMS_TL_CAUSCODNETWORK_RESOURCSHORTAGE          = 0x02, 

+  QSER_WMS_TL_CAUSCODNETWORK_FAILURE                    = 0x03, 

+  QSER_WMS_TL_CAUSCODINVALID_TELESERVICID             = 0x04, 

+  QSER_WMS_TL_CAUSCODNETWORK_OTHER                      = 0x05, 

+  QSER_WMS_TL_CAUSCODNO_PAGRESPONSE                   = 0x20, 

+  QSER_WMS_TL_CAUSCODDEST_BUSY                          = 0x21, 

+  QSER_WMS_TL_CAUSCODNO_ACK                             = 0x22, 

+  QSER_WMS_TL_CAUSCODDEST_RESOURCSHORTAGE             = 0x23, 

+  QSER_WMS_TL_CAUSCODSMS_DELIVERY_POSTPONED             = 0x24, 

+  QSER_WMS_TL_CAUSCODDEST_OUT_OF_SERV                   = 0x25, 

+  QSER_WMS_TL_CAUSCODDEST_NOT_AT_ADDR                   = 0x26, 

+  QSER_WMS_TL_CAUSCODDEST_OTHER                         = 0x27, 

+  QSER_WMS_TL_CAUSCODRADIO_IF_RESOURCSHORTAGE         = 0x40, 

+  QSER_WMS_TL_CAUSCODRADIO_IF_INCOMPATABILITY           = 0x41, 

+  QSER_WMS_TL_CAUSCODRADIO_IF_OTHER                     = 0x42, 

+  QSER_WMS_TL_CAUSCODENCODING                           = 0x60, 

+  QSER_WMS_TL_CAUSCODSMS_ORIG_DENIED                    = 0x61, 

+  QSER_WMS_TL_CAUSCODSMS_TERM_DENIED                    = 0x62, 

+  QSER_WMS_TL_CAUSCODSUPP_SERV_NOT_SUPP                 = 0x63, 

+  QSER_WMS_TL_CAUSCODSMS_NOT_SUPP                       = 0x64, 

+  QSER_WMS_TL_CAUSCODMISSING_EXPECTED_PARAM             = 0x65, 

+  QSER_WMS_TL_CAUSCODMISSING_MAND_PARAM                 = 0x66, 

+  QSER_WMS_TL_CAUSCODUNRECOGNIZED_PARAM_VAL             = 0x67, 

+  QSER_WMS_TL_CAUSCODUNEXPECTED_PARAM_VAL               = 0x68, 

+  QSER_WMS_TL_CAUSCODUSER_DATA_SIZERR                 = 0x69, 

+  QSER_WMS_TL_CAUSCODGENERAL_OTHER                      = 0x6A, 

+}QSER_WMS_TL_CAUSCODTYPE;

+

+

+

+typedef struct

+ {

+  uint16_t                              messagid;            /*  Message ID */

+  uint8_t                               causcodvalid;      /**< Must be set to true if causcode is being passed */

+  QSER_WMS_TL_CAUSCODTYPE           causcode;  

+}QSER_wms_raw_send_resp_t;

+

+typedef struct 

+ {

+  char service_center_addr[QSER_SMS_MAX_ADDR_LENGTH + 1];         /**<   Address of the service center.*/

+  uint8_t service_center_addr_typvalid;

+  char service_center_addr_type[QSER_SMS_MAX_SCA_TYPLENGTH + 1];    /**<   129 if the SMSC address does not start with a "+" characte;

+                                                                           145 if the SMSC address starts with a "+" character*/

+}QSER_sms_service_center_cfg_t;

+

+typedef QSER_sms_info_t       QSER_SMS_Msg_t; 

+typedef QSER_sms_info_t*      QSER_SMS_MsgRef; 

+typedef void (*QSER_SMS_RxMsgHandlerFunc_t)(QSER_SMS_MsgRef msgRef, void* contextPtr);

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-thermal-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-qser-thermal-demo.cpp
new file mode 100755
index 0000000..03a5926
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-thermal-demo.cpp
@@ -0,0 +1,49 @@
+#include <sys/types.h>

+#include <dirent.h>

+#include <unistd.h>

+#include <stdio.h>

+#include <string.h>

+#include <fcntl.h>

+#include <stdlib.h>

+#include <unistd.h>

+#include <dlfcn.h>

+

+#include"lynq-qser-thermal-demo.h"

+

+

+int (*get_thermal_zone)(int *numbers, int size);

+

+

+int main(int argc, char *argv[]){

+    int numbers[MAX_SIZE];

+    int ret = 0;

+    const char *lynq_libpath_thermal = "/lib/liblynq-qser-thermal.so";

+

+    void *dlHandle_thermal = dlopen(lynq_libpath_thermal, RTLD_NOW);

+    if (dlHandle_thermal == NULL) 

+    {

+        printf("dlopen dlHandle_thermal failed: %s\n", dlerror());

+        exit(EXIT_FAILURE);

+    }

+    get_thermal_zone = (int(*)(int *numbers, int size))dlsym(dlHandle_thermal,"get_thermal_zone");

+    if(NULL != get_thermal_zone)

+    {

+        ret = get_thermal_zone(numbers, MAX_SIZE);

+        if (ret <= 0) {

+            printf("get_thermal_zone error\n");

+            return -1;

+    }

+    }else{

+            printf("get_thermal_zone dlsym error\n");

+     }

+

+    for (int j = 0; j < ret; ++j) {

+        printf("[%s-%d] temp[%d] = %d \n", __func__, __LINE__, j, numbers[j]);

+    }

+

+    return 0;

+}

+

+

+

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-thermal-demo.h b/mbtk/test/liblynq_lib_t106/lynq-qser-thermal-demo.h
new file mode 100755
index 0000000..6366538
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-thermal-demo.h
@@ -0,0 +1,5 @@
+#define MAX_SIZE 100

+#define MAX_LINES 5

+#define MAX_LINE_LENGTH 10

+

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-voice-demo.cpp b/mbtk/test/liblynq_lib_t106/lynq-qser-voice-demo.cpp
new file mode 100755
index 0000000..951bfb3
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-voice-demo.cpp
@@ -0,0 +1,312 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/types.h>

+#include <pthread.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+

+#include"lynq-qser-voice-demo.h"

+#include "mbtk_log.h"

+

+typedef struct

+{

+    int  cmdIdx;

+    char *funcName;

+} st_api_test_case;

+

+//for server test

+st_api_test_case at_api_testcases[] =

+{

+    {0,   (char*)"print_help"},

+    {1,   (char*)"qser_voice_call_start"},

+    {2,   (char*)"qser_voice_call_end"},

+    {3,   (char*)"qser_voice_call_answer"},

+    {4,   (char*)"qser_voice_set_speech_volume"},

+    {5,   (char*)"qser_voice_get_speech_volume"},

+    {6,   (char*)"qser_voice_set_dtmf"},

+    {-1,    NULL}

+};

+

+

+

+typedef uint32_t voice_client_handle_type;

+

+

+int (*qser_voice_call_client_init)(voice_client_handle_type *ph_voice);

+int (*qser_voice_call_client_deinit)(voice_client_handle_type );

+int (*qser_voice_call_addstatehandler)(voice_client_handle_type  h_voice,

+                                       QSER_VoiceCall_StateHandlerFunc_t  handlerPtr,

+                                       void *contextPtr);

+

+int (*qser_voice_call_removestatehandle)(voice_client_handle_type );

+int (*qser_voice_call_start)(voice_client_handle_type  h_voice,

+                             E_QSER_VCALL_ID_T   simId,

+                             char *phone_number, int *call_id);

+

+int (*qser_voice_call_end)(voice_client_handle_type ,int );

+int (*qser_voice_call_answer)(voice_client_handle_type ,int  );

+int (*qser_voice_set_speech_volume)(const int volume);

+int (*qser_voice_get_speech_volume)(int *volume);

+int (*qser_voice_set_dtmf)(const char callnum);

+

+void *dlHandle_call = NULL;

+

+static void yk_voice_call_cb_func(int                     call_id,

+                                  char*                   phone_num,

+                                  qser_voice_call_state_t state,

+                                  void                    *contextPtr)

+{

+    char *call_state[] = {(char*)"INCOMING", (char*)"DIALING", (char*)"ALERTING", (char*)"ACTIVE", (char*)"HOLDING", (char*)"END", (char*)"WAITING"};

+

+    printf("######### Call id=%d, PhoneNum:%s, event=%s!  ######\n", call_id, phone_num, call_state[state]);

+}

+

+void print_help(void)

+{

+    int i;

+    printf("Supported test cases:\n");

+    for(i = 0; ; i++)

+    {

+        if(at_api_testcases[i].cmdIdx == -1)

+        {

+            break;

+        }

+        printf("%d:\t%s\n", at_api_testcases[i].cmdIdx, at_api_testcases[i].funcName);

+    }

+}

+

+int main(int argc, char const *argv[])

+{

+    int cmdIdx = 0;

+    int ret    = 0;

+    int  voice_call_id = 0;

+    voice_client_handle_type    h_voice     = 0;

+

+    mbtk_log_init((char*)"radio", (char*)"MBTK");

+

+    const char *lynqLibPath_Call = (char*)"/lib/liblynq-qser-voice.so";

+    dlHandle_call = dlopen(lynqLibPath_Call, RTLD_NOW);

+    if (dlHandle_call == NULL)

+    {

+        printf("dlopen dlHandle_call failed: %s\n", dlerror());

+        exit(EXIT_FAILURE);

+    }

+

+    qser_voice_call_client_init = (int(*)(voice_client_handle_type *h_voice))dlsym(dlHandle_call, "qser_voice_call_client_init");

+    if(qser_voice_call_client_init == NULL)

+    {

+        printf("qser_voice_call_client_init not defined or exported in %s\n", lynqLibPath_Call);

+        return -1;

+    }

+

+    qser_voice_call_addstatehandler = (int(*)(voice_client_handle_type          h_voice,

+                                            QSER_VoiceCall_StateHandlerFunc_t    handlerPtr,

+                                            void  *contextPtr))dlsym(dlHandle_call,"qser_voice_call_addstatehandler");

+    if(qser_voice_call_addstatehandler == NULL)

+    {

+        printf("qser_voice_call_addstatehandler not defined or exported in %s\n", lynqLibPath_Call);

+        return -1;

+    }

+

+    qser_voice_call_answer = (int(*)(voice_client_handle_type,int ))dlsym(dlHandle_call,"qser_voice_call_answer");

+    if(qser_voice_call_answer == NULL)

+    {

+        printf("qser_voice_call_answer not defined or exported in %s\n", lynqLibPath_Call);

+        return -1;

+    }

+

+    qser_voice_call_start = (int(*)(voice_client_handle_type  h_voice,E_QSER_VCALL_ID_T   simId,

+                                    char *phone_number, int *call_id))dlsym(dlHandle_call,"qser_voice_call_start");

+    if(qser_voice_call_start == NULL)

+    {

+        printf("qser_voice_call_start not defined or exported in %s\n", lynqLibPath_Call);

+        return -1;

+    }

+

+    qser_voice_call_end = (int(*)(voice_client_handle_type ,int))dlsym(dlHandle_call,"qser_voice_call_end");

+    if(qser_voice_call_end == NULL)

+    {

+        printf("qser_voice_call_end not defined or exported in %s\n", lynqLibPath_Call);

+        return -1;

+    }

+

+

+    qser_voice_call_client_deinit = (int (*)(voice_client_handle_type h_voice))dlsym(dlHandle_call,"qser_voice_call_client_deinit");

+    if(qser_voice_call_client_deinit == NULL)

+    {

+        printf("qser_voice_call_client_deinit  not defined or exported in %s\n", lynqLibPath_Call);

+        return -1;

+    }

+

+    qser_voice_call_removestatehandle = (int (*)(voice_client_handle_type))dlsym(dlHandle_call,"qser_voice_call_removestatehandle");

+    if(qser_voice_call_removestatehandle == NULL)

+    {

+        printf("qser_voice_call_removestatehandle not defined or exported in %s\n", lynqLibPath_Call);

+        return -1;

+    }

+

+    qser_voice_set_speech_volume = (int (*)(const int ))dlsym(dlHandle_call,"qser_voice_set_speech_volume");

+    if(qser_voice_set_speech_volume == NULL)

+    {

+            printf("qser_voice_set_speech_volume not defined or exported in %s\n", lynqLibPath_Call);

+            return -1;

+    }

+

+    qser_voice_get_speech_volume = (int (*)(int* ))dlsym(dlHandle_call,"qser_voice_get_speech_volume");

+    if(qser_voice_get_speech_volume == NULL)

+    {

+            printf("qser_voice_get_speech_volume not defined or exported in %s\n", lynqLibPath_Call);

+            return -1;

+    }

+

+    qser_voice_set_dtmf = (int (*)(const char ))dlsym(dlHandle_call,"qser_voice_set_dtmf");

+    if(qser_voice_set_dtmf == NULL)

+    {

+            printf("qser_voice_set_dtmf not defined or exported in %s\n", lynqLibPath_Call);

+            return -1;

+    }

+

+    ret = qser_voice_call_client_init(&h_voice);

+    if(ret != 0 )

+    {

+        printf("qser_voice_call_client_init FAIL\n");

+        return -1;

+    }

+

+    ret = qser_voice_call_addstatehandler(h_voice, yk_voice_call_cb_func, &voice_call_id);

+    if(ret != 0)

+    {

+        printf("qser_voice_call_addstatehandler FAIL\n");

+        return -1;

+    }

+

+

+    print_help();

+    while(1)

+    {

+        printf("\nplease input cmd index(-1 exit): ");

+        if(1 != scanf("%d", &cmdIdx))

+            break;

+        if(cmdIdx == -1)

+        {

+            break;

+        }

+

+        switch(cmdIdx)

+        {

+            //"print_help

+            case 0:

+                print_help();

+                break;

+

+            //"qser_voice_call_start"

+            case 1:

+            {

+                char    PhoneNum[32] = {0};

+

+                printf("please input dest phone number: \n");

+                if(1 != scanf("%s", PhoneNum))

+                    break;

+

+                ret = qser_voice_call_start(h_voice, E_QSER_VCALL_EXTERNAL_SLOT_1, PhoneNum, &voice_call_id);

+                printf("qser_voice_call_start ret = %d, with voice_call_id=%d\n", ret, voice_call_id);

+                break;

+            }

+

+            //"qser_voice_call_end"

+            case 2:

+            {

+                int call_id = -1;

+                printf("please input end call id: \n");

+                if(1 != scanf("%d", &call_id))

+                    break;

+                ret = qser_voice_call_end(h_voice, call_id);

+                printf(" ret = %d\n", ret);

+                break;

+            }

+

+            //"qser_voice_call_answer"

+            case 3:

+            {

+                int call_id = -1;

+                printf(" please input answer call id\n");

+                if(1 != scanf("%d", &call_id))

+                    break;

+                ret = qser_voice_call_answer(h_voice, call_id);

+                printf(" ret = %d\n", ret);

+                break;

+            }

+

+            case 4:

+            {

+                int volume = 0;

+                printf("Please set speech volume:0-5 level\n");

+                if(1 != scanf("%d",&volume))

+                    break;

+                ret = qser_voice_set_speech_volume(volume);

+                printf("ret is %d\n",ret);

+                break;

+

+            }

+

+            case 5:

+            {

+                int volume = -1;

+                printf("Enter get speech volume\n");

+                ret = qser_voice_get_speech_volume(&volume);

+                printf("ret is %d,get volume is %d\n",ret,volume);

+                break;

+

+            }

+            case 6:

+            {

+

+               int ret;

+               char inputChar;

+

+               printf("Enter set dtmf\n");

+               if(1 != scanf(" %c", &inputChar))

+                    break;

+               printf("inputChar is %c\n", inputChar);

+               ret = qser_voice_set_dtmf(inputChar);

+

+               if (ret != 0)

+               {

+                   printf("qser set voice dtmf failed\n");

+                   return -1;

+               }

+              break;

+            }

+

+            default:

+                print_help();

+                break;

+        }

+

+    }

+

+    ret = qser_voice_call_removestatehandle(h_voice);

+    if(ret != 0 && ret != 1)

+    {

+        printf("qser_voice_call_removestatehandle FAIL!!!\n");

+        return -1;

+    }

+    printf("qser_voice_call_removestatehandle ret = %d\n", ret);

+

+

+    ret = qser_voice_call_client_deinit(h_voice);

+    if(ret != 0)

+    {

+        printf("qser_voice_call_client_deinit FAIL\n");

+        return -1;

+    }

+    printf("qser_voice_call_client_deinit ret = %d, with h_voice=%d\n", ret, h_voice);

+

+   return 0;

+

+

+}

+

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-qser-voice-demo.h b/mbtk/test/liblynq_lib_t106/lynq-qser-voice-demo.h
new file mode 100755
index 0000000..79977b9
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-qser-voice-demo.h
@@ -0,0 +1,31 @@
+typedef enum 

+{

+    E_QSER_VOICE_CALL_STATE_INCOMING      = 0x0000, /**< MT incoming; CC setup. */

+    E_QSER_VOICE_CALL_STATE_DIALING       = 0x0001, /**< Dialing state. */

+    E_QSER_VOICE_CALL_STATE_ALERTING      = 0x0002, /**< MT call waiting; MO alterting. */

+    E_QSER_VOICE_CALL_STATE_ACTIVE        = 0x0003, /**< Call is active. */

+    E_QSER_VOICE_CALL_STATE_HOLDING       = 0x0004, /**< Call is on hold. */

+    E_QSER_VOICE_CALL_STATE_END           = 0x0005, /**< Call is disconnected. */

+    E_QSER_VOICE_CALL_STATE_WAITING       = 0x0006, /**< Call is waiting. */

+}qser_voice_call_state_t;

+

+typedef enum

+{

+    E_QSER_VCALL_EXTERNAL_SLOT_1,

+    E_QSER_VCALL_EXTERNAL_SLOT_2,

+    E_QSER_VCALL_EMBEDDED,

+    E_QSER_VCALL_REMOTE,

+    E_QSER_VCALL_ID_MAX

+}E_QSER_VCALL_ID_T;

+

+

+typedef qser_voice_call_state_t E_QSER_VOICE_CALL_STATE_T;

+

+typedef void (*QSER_VoiceCall_StateHandlerFunc_t)

+(

+    int                     caLOCAL_C_INCLUDESll_id,

+    char*                   phone_num,

+    E_QSER_VOICE_CALL_STATE_T state,

+    void                    *contextPtr

+);

+

diff --git a/mbtk/test/liblynq_lib_t106/lynq-usb-demo.cc b/mbtk/test/liblynq_lib_t106/lynq-usb-demo.cc
new file mode 100755
index 0000000..2ba3d35
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq-usb-demo.cc
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <sys/socket.h>
+#include <semaphore.h>
+#include <linux/netlink.h>
+
+#include <lynq/lynq-qser-usb.h>
+
+sem_t usbplug_sem;
+void do_get_adb_state(int nargs, char **argv)
+{
+
+    int ret = 0;
+
+    ret = qser_get_usb_usermode_adb_state();
+    if (ret < 0)
+    {
+        printf("get adb state fail,ret:%d \n", ret);
+        return;
+    }
+
+    printf("adb state:%d, %s\n", ret, ((ret == 0) ? "off" : "on"));
+}
+
+void do_get_net_state(int nargs, char **argv)
+{
+
+    int ret = 0;
+
+    ret = qser_get_usb_usermode_net_state();
+    if (ret < 0)
+    {
+        printf("get net state fail,ret:%d \n", ret);
+        return;
+    }
+
+    printf("net state:%d, %s\n", ret, ((ret == 0) ? "off" : "on"));
+}
+
+int main(int argc, char *argv[])
+{
+    sem_init(&usbplug_sem, 0, 0);
+    do_get_adb_state(argc, argv);
+    do_get_net_state(argc, argv);
+    sem_post(&usbplug_sem);
+    return 0;
+}
\ No newline at end of file
diff --git a/mbtk/test/liblynq_lib_t106/lynq_led-demo.c b/mbtk/test/liblynq_lib_t106/lynq_led-demo.c
new file mode 100755
index 0000000..ee85b24
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq_led-demo.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include <strings.h>
+#include<stdlib.h>
+#include "lynq/lynq_uci.h"
+#include "lynq/lynq_led.h"
+
+
+
+int main(int argc, const char *argv[])
+{
+    int ret = 0;
+    ret = lynq_set_netled_on(atoi(argv[1]));
+    if(ret){
+        printf("[%s-%d] lynq_set_netled_on error\n", __FUNCTION__, __LINE__);
+        return -1;
+    }
+    ret = lynq_set_statusled_on(atoi(argv[1]));
+    if(ret){
+        printf("[%s-%d] lynq_set_statusled_on error\n", __FUNCTION__, __LINE__);
+        return -1;
+    }
+
+    return 0;
+}
diff --git a/mbtk/test/liblynq_lib_t106/lynq_qser_network.h b/mbtk/test/liblynq_lib_t106/lynq_qser_network.h
new file mode 100755
index 0000000..75d501b
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq_qser_network.h
@@ -0,0 +1,477 @@
+/**
+ *@file     QSER_nw.h
+ *@date     2018-02-22
+ *@author
+ *@brief
+ */
+#ifndef __LYNQ_QSER_NETWORK_H__
+#define __LYNQ_QSER_NETWORK_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "mbtk_type.h"
+
+typedef uint32_t nw_client_handle_type;
+
+
+#define QSER_NW_MODE_NONE     0x00    /**<  No network. */
+#define QSER_NW_MODE_GSM      0x01    /**<  Include GSM networks. */
+#define QSER_NW_MODE_WCDMA    0x02    /**<  Include WCDMA networks. */
+#define QSER_NW_MODE_CDMA     0x04    /**<  Include CDMA networks. */
+#define QSER_NW_MODE_EVDO     0x08    /**<  Include EVDO networks. */
+#define QSER_NW_MODE_LTE      0x10    /**<  Include LTE networks. */
+#define QSER_NW_MODE_TDSCDMA  0x20    /**<  Include TDSCDMA networks. */
+
+typedef enum
+{
+    E_QSER_NW_ROAM_STATE_OFF  = 0,    /**<  None, or roaming indicator off. */
+    E_QSER_NW_ROAM_STATE_ON   = 1     /**<  Roaming indicator on. */
+}E_QSER_NW_ROAM_STATE_TYPE_T;
+
+/** Configures the settings that define the MCM network interface. */
+typedef struct
+{
+    /*  Configuration parameters for MCM network registration Network registration details Technology dependent network registration details */
+    uint64_t                        preferred_nw_mode;  /**<   Preferred network mode for connections; a bitmask of QSER_NW_MODE_xxxx.*/
+    E_QSER_NW_ROAM_STATE_TYPE_T   roaming_pref;       /**<   Roaming preference.*/
+}QSER_NW_CONFIG_INFO_T;
+
+typedef enum
+{
+    E_QSER_NW_IMS_MODE_OFF    = 0,     /**<  close ims. */
+    E_QSER_NW_IMS_MODE_VOLTE_ENABLE    = 1,  /**<  support volte. */
+}E_QSER_NW_IMS_MODE_TYPE_T;
+
+/** Configures the OOS (out of service)  settings that define the MCM network interface. */
+#define QSER_NW_OOS_CFG_TYPE_FAST_SCAN          0x00    /**<  fast net scan */
+#define QSER_NW_OOS_CFG_TYPE_FULL_BAND_SCAN     0x01    /**<  full band scan */
+
+typedef struct
+{
+    /*    Configuration parameters for MCM network fast network scan when OOS (out of service)*/
+    char                        enable;
+    uint16_t                    time_interval;
+}QSER_NW_OOS_CONFIG_FAST_SCAN_INFO_T;
+
+typedef struct
+{
+    /*    Configuration parameters for MCM network full band network scan when OOS (out of service)*/
+    int t_min;
+    int t_step;
+    int t_num;
+    int t_max;
+}QSER_NW_OOS_CONFIG_FULL_BAND_SCAN_INFO_T;
+
+
+typedef struct
+{
+    char                        type;  /**<   QSER_NW_OOS_CFG_TYPE_xxxx.*/
+    union {
+    QSER_NW_OOS_CONFIG_FAST_SCAN_INFO_T  fast_can_info;       // 00
+    QSER_NW_OOS_CONFIG_FULL_BAND_SCAN_INFO_T full_band_scan_info;     // 01
+  } u;
+}QSER_NW_OOS_CONFIG_INFO_T;
+
+//defined for QSER_NW_EventRegister
+#define     NW_IND_VOICE_REG_EVENT_IND_FLAG               (1 << 0)    /**< msg format : QSER_NW_VOICE_REG_EVENT_IND_T */
+#define     NW_IND_DATA_REG_EVENT_IND_FLAG                (1 << 1)    /**< msg format : QSER_NW_DATA_REG_EVENT_IND_T */
+#define     NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG         (1 << 2)    /**< msg format : QSER_NW_SINGNAL_EVENT_IND_T */
+//#define     NW_IND_CELL_ACCESS_STATE_CHG_EVENT_IND_FLAG   (1 << 3)    /**< msg format : QL_MCM_NW_CELL_ACCESS_STATE_EVENT_IND_T */
+//#define     NW_IND_NITZ_TIME_UPDATE_EVENT_IND_FLAG        (1 << 4)    /**< msg format : QL_MCM_NW_NITZ_TIME_EVENT_IND_T */
+#define     NW_IND_IMS_REG_EVENT_IND_FLAG                 (1 << 5)    /**< msg format : NULL */
+
+typedef struct
+{
+    char long_eons[512 + 1];    /**<   Long EONS.*/
+    char short_eons[512 + 1];   /**<   Short EONS.*/
+    char mcc[10];            /**<   Mobile country code.*/
+    char mnc[10];            /**<   Mobile network code.*/
+}QSER_NW_OPERATOR_NAME_INFO_T;
+
+typedef enum
+{
+    E_QSER_NW_RADIO_TECH_TD_SCDMA = 1,
+    E_QSER_NW_RADIO_TECH_GSM      = 2,    /**<  GSM; only supports voice. */
+    E_QSER_NW_RADIO_TECH_HSPAP    = 3,    /**<  HSPA+. */
+    E_QSER_NW_RADIO_TECH_LTE      = 4,    /**<  LTE. */
+    E_QSER_NW_RADIO_TECH_EHRPD    = 5,    /**<  EHRPD. */
+    E_QSER_NW_RADIO_TECH_EVDO_B   = 6,    /**<  EVDO B. */
+    E_QSER_NW_RADIO_TECH_HSPA     = 7,    /**<  HSPA. */
+    E_QSER_NW_RADIO_TECH_HSUPA    = 8,    /**<  HSUPA. */
+    E_QSER_NW_RADIO_TECH_HSDPA    = 9,    /**<  HSDPA. */
+    E_QSER_NW_RADIO_TECH_EVDO_A   = 10,   /**<  EVDO A. */
+    E_QSER_NW_RADIO_TECH_EVDO_0   = 11,   /**<  EVDO 0. */
+    E_QSER_NW_RADIO_TECH_1xRTT    = 12,   /**<  1xRTT. */
+    E_QSER_NW_RADIO_TECH_IS95B    = 13,   /**<  IS95B. */
+    E_QSER_NW_RADIO_TECH_IS95A    = 14,   /**<  IS95A. */
+    E_QSER_NW_RADIO_TECH_UMTS     = 15,   /**<  UMTS. */
+    E_QSER_NW_RADIO_TECH_EDGE     = 16,   /**<  EDGE. */
+    E_QSER_NW_RADIO_TECH_GPRS     = 17,   /**<  GPRS. */
+    E_QSER_NW_RADIO_TECH_NONE     = 18    /**<  No technology selected. */
+}E_QSER_NW_RADIO_TECH_TYPE_T;
+
+
+typedef enum
+{
+    E_QSER_NW_TECH_DOMAIN_NONE    = 0,    /**<  None. */
+    E_QSER_NW_TECH_DOMAIN_3GPP    = 1,    /**<  3GPP. */
+    E_QSER_NW_TECH_DOMAIN_3GPP2   = 2,    /**<  3GPP2. */
+}E_QSER_NW_TECH_DOMAIN_TYPE_T;
+
+typedef enum
+{
+    E_QSER_NW_IMSI_UNKNOWN_HLR_DENY_REASON                    = 1, /**<  IMSI unknown in HLR. */
+    E_QSER_NW_ILLEGAL_MS_DENY_REASON                          = 2, /**<  Illegal MS. */
+    E_QSER_NW_IMSI_UNKNOWN_VLR_DENY_REASON                    = 3, /**<  IMSI unknown in VLR. */
+    E_QSER_NW_IMEI_NOT_ACCEPTED_DENY_REASON                   = 4, /**<  IMEI not accepted. */
+    E_QSER_NW_ILLEGAL_ME_DENY_REASON                          = 5, /**<  Illegal ME. */
+    E_QSER_NW_PLMN_NOT_ALLOWED_DENY_REASON                    = 6, /**<  PLMN not allowed. */
+    E_QSER_NW_LA_NOT_ALLOWED_DENY_REASON                      = 7, /**<  Location area not allowed. */
+    E_QSER_NW_ROAMING_NOT_ALLOWED_LA_DENY_REASON              = 8, /**<  Roaming not allowed in this location area. */
+    E_QSER_NW_NO_SUITABLE_CELLS_LA_DENY_REASON                = 9, /**<  No suitable cells in location area. */
+    E_QSER_NW_NETWORK_FAILURE_DENY_REASON                     = 10, /**<  Network failure. */
+    E_QSER_NW_MAC_FAILURE_DENY_REASON                         = 11, /**<  MAC failure. */
+    E_QSER_NW_SYNCH_FAILURE_DENY_REASON                       = 12, /**<  Sync failure. */
+    E_QSER_NW_CONGESTION_DENY_REASON                          = 13, /**<  Congestion. */
+    E_QSER_NW_GSM_AUTHENTICATION_UNACCEPTABLE_DENY_REASON     = 14, /**<  GSM authentication unacceptable. */
+    E_QSER_NW_NOT_AUTHORIZED_CSG_DENY_REASON                  = 15, /**<  Not authorized in this CSG. */
+    E_QSER_NW_SERVICE_OPTION_NOT_SUPPORTED_DENY_REASON        = 16, /**<  Service option not supported. */
+    E_QSER_NW_REQ_SERVICE_OPTION_NOT_SUBSCRIBED_DENY_REASON   = 17, /**<  Requested service option not subscribed. */
+    E_QSER_NW_CALL_CANNOT_BE_IDENTIFIED_DENY_REASON           = 18, /**<  Call cannot be identified. */
+    E_QSER_NW_SEMANTICALLY_INCORRECT_MSG_DENY_REASON          = 19, /**<  Semantically incorrect message. */
+    E_QSER_NW_INVALID_MANDATORY_INFO_DENY_REASON              = 20, /**<  Invalid mandatory information. */
+    E_QSER_NW_MSG_TYPE_NON_EXISTENT_DENY_REASON               = 21, /**<  Message type non-existent or not implemented. */
+    E_QSER_NW_INFO_ELEMENT_NON_EXISTENT_DENY_REASON           = 22, /**<  Message type not compatible with the protocol state. */
+    E_QSER_NW_CONDITIONAL_IE_ERR_DENY_REASON                  = 23, /**<  Conditional IE error. */
+    E_QSER_NW_MSG_INCOMPATIBLE_PROTOCOL_STATE_DENY_REASON     = 24, /**<  Message not compatible with the protocol state. */
+    E_QSER_NW_PROTOCOL_ERROR_DENY_REASON                      = 25, /**<  Unspecified protocol error. */
+}E_QSER_NW_DENY_REASON_TYPE_T;
+
+
+typedef enum
+{
+    E_QSER_NW_SERVICE_NONE     = 0x0000,  /**<  Not registered or no data. */
+    E_QSER_NW_SERVICE_LIMITED  = 0x0001,  /**<  Registered; emergency service only. */
+    E_QSER_NW_SERVICE_FULL     = 0x0002,  /**<  Registered, full service. */
+}E_QSER_NW_SERVICE_TYPE_T;
+
+typedef struct
+{
+    E_QSER_NW_TECH_DOMAIN_TYPE_T  tech_domain;        /**<   Technology, used to determine the structure type  tech: 0 -- None, 1 -- 3GPP, 2 -- 3GPP2.*/
+    E_QSER_NW_RADIO_TECH_TYPE_T   radio_tech;         /**<   Radio technology; see #nw_radio_tech_t_v01.*/
+    E_QSER_NW_ROAM_STATE_TYPE_T   roaming;            /**<   0 -- Off, 1 -- Roaming (3GPP2 has extended values).*/
+    E_QSER_NW_DENY_REASON_TYPE_T  deny_reason;        /**<   Set when registration state is #nw_deny_reason_t_v01.*/
+    E_QSER_NW_SERVICE_TYPE_T      registration_state; /**<   Registration state.*/
+}QSER_NW_COMMON_REG_INFO_T;
+
+
+typedef struct
+{
+    E_QSER_NW_TECH_DOMAIN_TYPE_T  tech_domain;        /**<   Technology, used to determine the structure type  tech: 0 -- None, 1 -- 3GPP, 2 -- 3GPP2.*/
+    E_QSER_NW_RADIO_TECH_TYPE_T   radio_tech;         /**<   Radio technology; see #nw_radio_tech_t_v01.*/
+    char                            mcc[10];           /**<   Mobile country code.*/
+    char                            mnc[10];           /**<   Mobile network code.*/
+    E_QSER_NW_ROAM_STATE_TYPE_T   roaming;            /**<   0 -- Off, 1 -- Roaming (3GPP2 has extended values).*/
+    uint8_t                         forbidden;          /**<   Forbidden: 0 -- No, 1 -- Yes.*/
+    uint32_t                        cid;                /**<   Cell ID for the registered 3GPP system.*/
+    uint16_t                        lac;                /**<   Locatin area code for the registered 3GPP system.*/
+    uint16_t                        psc;                /**<   Primary scrambling code (WCDMA only); 0 -- None.*/
+    uint16_t                        tac;                /**<   Tracking area code information for LTE.*/
+}QSER_NW_3GPP_REG_INFO_T;
+
+
+typedef struct
+{
+    E_QSER_NW_TECH_DOMAIN_TYPE_T  tech_domain;        /**<   Technology, used to determine structure type  tech: 0 -- None, 1 -- 3GPP, 2 -- 3GPP2.*/
+    E_QSER_NW_RADIO_TECH_TYPE_T   radio_tech;         /**<   Radio technology; see #nw_radio_tech_t_v01.*/
+    char                            mcc[3+1];           /**<   Mobile country code.*/
+    char                            mnc[3+1];           /**<   Mobile network code.*/
+    E_QSER_NW_ROAM_STATE_TYPE_T   roaming;            /**<   Roaming status; see #nw_roam_state_t_v01.*/
+    uint8_t                         forbidden;          /**<   Forbidden: 0 -- No, 1 -- Yes.*/
+    uint8_t                         inPRL;              /**<   0 -- Not in PRL, 1 -- In PRL.*/
+    uint8_t                         css;                /**<   Concurrent services supported: 0 -- No, 1 -- Yes.*/
+    uint16_t                        sid;                /**<   CDMA system ID.*/
+    uint16_t                        nid;                /**<   CDMA network ID.*/
+    uint16_t                        bsid;               /**<   Base station ID. @newpagetable */
+}QSER_NW_3GPP2_REG_INFO_T;
+
+/** Gets the status associated with the connection of \<id\>. */
+typedef struct
+{
+    uint8_t                         voice_registration_valid;               /**< Must be set to TRUE if voice_registration is being passed. */
+    QSER_NW_COMMON_REG_INFO_T     voice_registration;                     /**<   Voice registration. */
+
+    uint8_t                         data_registration_valid;                /**< Must be set to TRUE if data_registration is being passed. */
+    QSER_NW_COMMON_REG_INFO_T     data_registration;                      /**<   Data registration. */
+
+    uint8_t                         voice_registration_details_3gpp_valid;  /**< Must be set to TRUE if voice_registration_details_3gpp is being passed. */
+    QSER_NW_3GPP_REG_INFO_T       voice_registration_details_3gpp;        /**<   Voice registration details for 3GPP. */
+
+    uint8_t                         data_registration_details_3gpp_valid;   /**< Must be set to TRUE if data_registration_details_3gpp is being passed. */
+    QSER_NW_3GPP_REG_INFO_T       data_registration_details_3gpp;         /**<   Data registration details for 3GPP. */
+
+    uint8_t                         voice_registration_details_3gpp2_valid; /**< Must be set to TRUE if voice_registration_details_3gpp2 is being passed. */
+    QSER_NW_3GPP2_REG_INFO_T      voice_registration_details_3gpp2;       /**<   Voice registration details for 3GPP2. */
+
+    uint8_t                         data_registration_details_3gpp2_valid;  /**< Must be set to TRUE if data_registration_details_3gpp2 is being passed. */
+    QSER_NW_3GPP2_REG_INFO_T      data_registration_details_3gpp2;        /**<   Data registration details for 3GPP2. */
+}QSER_NW_REG_STATUS_INFO_T;
+
+typedef enum
+{
+    E_QSER_NW_IMS_SERVICE_NONE     = 0x0000,  /**<  Not registered */
+    E_QSER_NW_IMS_SERVICE_REGISTERED     = 0x0001,  /**<  Registered*/
+}E_QSER_NW_IMS_SERVICE_TYPE_T;
+
+typedef struct
+{
+    E_QSER_NW_IMS_SERVICE_TYPE_T      registration_state; /**<   Registration state.*/
+}QSER_NW_IMS_REG_STATUS_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates received signal strength. A signed value; -125 or lower indicates no signal.*/
+}QSER_NW_GSM_SIGNAL_INFO_T;
+
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Ec. A signed value; -125 or lower indicates no signal.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+}QSER_NW_WCDMA_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Ec.    a signed value; -125 or lower indicates no signal.*/
+    int8_t      rscp;       /**<   RSCP in dBm.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+    int8_t      sinr;       /**<   Measured SINR in dB. @newpagetable */
+}QSER_NW_TDSCDMA_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Ec. A signed value; -125 or lower indicates no signal.*/
+    int8_t      rsrq;       /**<   RSRQ value in dB (signed integer value), as measured by L1. Range: -3 to -20 (-3 equals -3 dB, -20 equals -20 dB).*/
+    int16_t      rsrp;       /**<   Current RSRP in dBm, as measured by L1. Range: -44 to -140 (-44 equals -44 dBm, -140 equals -140 dBm).*/
+    int16_t      snr;        /**<   SNR level as a scaled integer in units of 0.1 dB; e.g., -16 dB has a value of -160 and 24.6 dB has a value of 246.*/
+}QSER_NW_LTE_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Power (AGC) + Ec/Io. A signed value; -125 or lower indicates no signal.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+}QSER_NW_CDMA_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int8_t      rssi;       /**<   RSSI in dBm. Indicates forward link pilot Power (AGC) + Ec/Io. A signed value; -125 or lower indicates no signal.*/
+    int16_t     ecio;       /**<   Ec/Io value representing negative 0.5 dB increments, e.g., 2 equals -1 dbm.*/
+    int8_t      sinr;       /**<   SINR level.*/
+    int32_t     io;         /**<   Received IO in dBm. */
+}QSER_NW_HDR_SIGNAL_INFO_T;
+
+typedef struct
+{
+    int16_t     ssRsrp;   /* SS(Synchronization Signal) reference signal received power, multipled by -1.
+                      * Reference: 3GPP TS 38.215.
+                      * Range [44, 140], INT_MAX means invalid/unreported.*/
+    int16_t     ssRsrq;   /* SS reference signal received quality, multipled by -1.
+                      * Reference: 3GPP TS 38.215.
+                      * Range [3, 20], INT_MAX means invalid/unreported.*/
+    int16_t     ssSinr;   /* SS signal-to-noise and interference ratio.
+                      * Reference: 3GPP TS 38.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
+                      * Range [-23, 40], INT_MAX means invalid/unreported.*/
+    int16_t     csiRsrp;  /* CSI reference signal received power, multipled by -1.
+                      * Reference: 3GPP TS 38.215.
+                      * Range [44, 140], INT_MAX means invalid/unreported.*/
+    int16_t     csiRsrq;  /* CSI reference signal received quality, multipled by -1.
+                      * Reference: 3GPP TS 38.215.
+                      * Range [3, 20], INT_MAX means invalid/unreported.*/
+    int16_t     csiSinr;  /* CSI signal-to-noise and interference ratio.
+                      * Reference: 3GPP TS 138.215 section 5.1.*, 3GPP TS 38.133 section 10.1.16.1.
+                      * Range [-23, 40], INT_MAX means invalid/unreported.*/
+}QSER_NW_NR_SIGNAL_INFO_T;
+
+
+/** Gets signal strength information. */
+typedef struct
+{
+    uint8_t                         gsm_sig_info_valid;         /**< Must be set to TRUE if gsm_sig_info is being passed. */
+    QSER_NW_GSM_SIGNAL_INFO_T     gsm_sig_info;               /**<   GSM signal information. */
+    uint8_t                         wcdma_sig_info_valid;       /**< Must be set to TRUE if wcdma_sig_info is being passed. */
+    QSER_NW_WCDMA_SIGNAL_INFO_T   wcdma_sig_info;             /**<   WCDMA signal information. */
+    uint8_t                         tdscdma_sig_info_valid;     /**< Must be set to TRUE if tdscdma_sig_info is being passed. */
+    QSER_NW_TDSCDMA_SIGNAL_INFO_T tdscdma_sig_info;           /**<   TDSCDMA signal information. */
+    uint8_t                         lte_sig_info_valid;         /**< Must be set to TRUE if lte_sig_info is being passed. */
+    QSER_NW_LTE_SIGNAL_INFO_T     lte_sig_info;               /**<   LTE signal information. */
+    uint8_t                         cdma_sig_info_valid;        /**< Must be set to TRUE if cdma_sig_info is being passed. */
+    QSER_NW_CDMA_SIGNAL_INFO_T    cdma_sig_info;              /**<   CDMA signal information. */
+    uint8_t                         hdr_sig_info_valid;         /**< Must be set to TRUE if hdr_sig_info is being passed. */
+    QSER_NW_HDR_SIGNAL_INFO_T     hdr_sig_info;               /**<   HDR signal information. */
+    uint8_t                         nr_sig_info_valid;
+    QSER_NW_NR_SIGNAL_INFO_T      nr_sig_info;
+}QSER_NW_SIGNAL_STRENGTH_INFO_T;
+
+
+
+
+
+/* @bridef Callback function registered to QSER_NW_AddRxMsgHandler
+ * map of ind_flag and ind_msg_buf as bellow :
+ *  NW_IND_VOICE_REG_EVENT_IND_FLAG : QSER_NW_VOICE_REG_EVENT_IND_T
+ *  NW_IND_DATA_REG_EVENT_IND_FLAG : QSER_NW_DATA_REG_EVENT_IND_T
+ *  NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG : QSER_NW_SINGNAL_EVENT_IND_T
+ *  NW_IND_CELL_ACCESS_STATE_CHG_EVENT_IND_FLAG : QSER_NW_CELL_ACCESS_STATE_EVENT_IND_T
+ *  NW_IND_NITZ_TIME_UPDATE_EVENT_IND_FLAG : QSER_NW_NITZ_TIME_EVENT_IND_T
+ *  NW_IND_IMS_REG_EVENT_IND_FLAG : NULL
+ * */
+typedef void (*QSER_NW_RxMsgHandlerFunc_t)(
+    nw_client_handle_type h_nw,
+    uint32_t ind_flag,
+    void                  *ind_msg_buf,
+    uint32_t              ind_msg_len,
+    void                  *contextPtr
+);
+
+
+/** Indication message; Indication for the corresponding registered event flag NW_IND_VOICE_REG_EVENT_IND_FLAG */
+typedef struct {
+
+  uint8_t                         registration_valid;               /**< Must be set to TRUE if voice_registration is being passed. */
+  QSER_NW_COMMON_REG_INFO_T     registration;                     /**< Voice registration. */
+
+  uint8_t                         registration_details_3gpp_valid;  /**< Must be set to TRUE if voice_registration_details_3gpp is being passed. */
+  QSER_NW_3GPP_REG_INFO_T       registration_details_3gpp;        /**< Voice registration details for 3GPP. */
+
+  uint8_t                         registration_details_3gpp2_valid; /**< Must be set to TRUE if voice_registration_details_3gpp2 is being passed. */
+  QSER_NW_3GPP2_REG_INFO_T      registration_details_3gpp2;       /**< Voice registration details for 3GPP2. */
+}QSER_NW_VOICE_REG_EVENT_IND_T;
+
+/** Indication message; Indication for the corresponding registered event flag NW_IND_DATA_REG_EVENT_IND_FLAG */
+typedef struct {
+
+  uint8_t                         registration_valid;               /**< Must be set to TRUE if data_registration is being passed. */
+  QSER_NW_COMMON_REG_INFO_T     registration;                     /**< Data registration. */
+
+  uint8_t                         registration_details_3gpp_valid;  /**< Must be set to TRUE if data_registration_details_3gpp is being passed. */
+  QSER_NW_3GPP_REG_INFO_T       registration_details_3gpp;        /**< Data registration details for 3GPP. */
+
+  uint8_t                         registration_details_3gpp2_valid; /**< Must be set to TRUE if data_registration_details_3gpp2 is being passed. */
+  QSER_NW_3GPP2_REG_INFO_T      registration_details_3gpp2;       /**< Data registration details for 3GPP2. */
+}QSER_NW_DATA_REG_EVENT_IND_T;
+
+
+/** Indication message; Indication for the corresponding registered event flag NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG */
+typedef struct {
+    uint8_t gsm_sig_info_valid;                       /**< Must be set to TRUE if gsm_sig_info is being passed. */
+    QSER_NW_GSM_SIGNAL_INFO_T       gsm_sig_info;   /**< GSM singal information. */
+
+    uint8_t wcdma_sig_info_valid;                     /**< Must be set to TRUE if wcdma_sig_info is being passed. */
+    QSER_NW_WCDMA_SIGNAL_INFO_T wcdma_sig_info;     /**< WCDMA singal information. */
+
+    uint8_t tdscdma_sig_info_valid;                   /**< Must be set to TRUE if tdscdma_sig_info is being passed. */
+    QSER_NW_TDSCDMA_SIGNAL_INFO_T tdscdma_sig_info; /**< TDSCDMA singal information. */
+
+    uint8_t lte_sig_info_valid;                       /**< Must be set to TRUE if lte_sig_info is being passed. */
+    QSER_NW_LTE_SIGNAL_INFO_T lte_sig_info;         /**< LTE singal information. */
+
+    uint8_t cdma_sig_info_valid;                      /**< Must be set to TRUE if cdma_sig_info is being passed. */
+    QSER_NW_CDMA_SIGNAL_INFO_T cdma_sig_info;       /**< CDMA singal information. */
+
+    uint8_t hdr_sig_info_valid;                       /**< Must be set to TRUE if hdr_sig_info is being passed. */
+    QSER_NW_HDR_SIGNAL_INFO_T hdr_sig_info;         /**< HDR singal information. */
+
+    uint8_t                         nr_sig_info_valid;
+    QSER_NW_NR_SIGNAL_INFO_T      nr_sig_info;
+}QSER_NW_SINGNAL_EVENT_IND_T;
+
+typedef enum
+{
+    E_QSER_NW_RF_MODE_CFUN_0 = 0,    /**<  CFUN 0. */
+    E_QSER_NW_RF_MODE_CFUN_1 = 1,    /**<  CFUN 1. */
+    E_QSER_NW_RF_MODE_FLIGHT = 4,    /**<  Flight Mode, CFUN 4. */
+}E_QSER_NW_RF_MODE_TYPE_T;
+
+int qser_nw_client_init(nw_client_handle_type  *ph_nw);
+
+int qser_nw_client_deinit(nw_client_handle_type  h_nw);
+
+int qser_nw_set_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_CONFIG_INFO_T     *pt_info
+);
+
+int qser_nw_set_ims_enable
+(
+    nw_client_handle_type h_nw,
+    E_QSER_NW_IMS_MODE_TYPE_T ims_mode
+);
+
+int qser_nw_set_oos_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_OOS_CONFIG_INFO_T     *pt_info
+);
+
+int qser_nw_get_oos_config
+(
+    nw_client_handle_type       h_nw,
+    QSER_NW_OOS_CONFIG_INFO_T     *pt_info
+);
+
+int qser_nw_event_register
+(
+    nw_client_handle_type       h_nw,
+    uint32_t                    bitmask // bit OR of NW_IND_xxxx_EVENT_ON
+);
+
+int qser_nw_get_operator_name
+(
+    nw_client_handle_type           h_nw,
+    QSER_NW_OPERATOR_NAME_INFO_T  *pt_info //You should malloc this or may cause stack overflow
+);
+
+int qser_nw_get_reg_status
+(
+    nw_client_handle_type               h_nw,
+    QSER_NW_REG_STATUS_INFO_T         *pt_info
+);
+
+int qser_nw_get_ims_reg_status
+(
+    nw_client_handle_type h_nw,
+    QSER_NW_IMS_REG_STATUS_INFO_T *pt_info
+);
+
+int qser_nw_get_signal_strength
+(
+    nw_client_handle_type               h_nw,
+    QSER_NW_SIGNAL_STRENGTH_INFO_T    *pt_info
+);
+
+int qser_nw_add_rx_msg_handler
+(
+    nw_client_handle_type        h_nw,
+    QSER_NW_RxMsgHandlerFunc_t handlerPtr,
+    void* contextPtr
+);
+
+int qser_nw_set_rf_mode
+(
+    nw_client_handle_type       h_nw,
+    E_QSER_NW_RF_MODE_TYPE_T    rf_mode
+);
+
+int qser_nw_get_rf_mode
+(
+    nw_client_handle_type       h_nw,
+    E_QSER_NW_RF_MODE_TYPE_T    *rf_mode
+);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif//__QSER_NW_H__
diff --git a/mbtk/test/liblynq_lib_t106/lynq_systime_demo.cpp b/mbtk/test/liblynq_lib_t106/lynq_systime_demo.cpp
new file mode 100755
index 0000000..a600884
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq_systime_demo.cpp
@@ -0,0 +1,274 @@
+/**@File lynq-systime-demo.cpp

+ *

+ * @Brief As a example for liblynq-systime.

+ *

+ * @Author sj.zhang

+ *

+ * @Date 2023-08-15

+ *

+ * @Version V1.0

+ *

+ * @copyright Copyright (c) MobileTek

+ */

+#include <stdio.h>

+#include <dlfcn.h>

+#include <string.h>

+#include <stdlib.h>

+#include <time.h>

+

+typedef struct time_source_status

+{

+    int ntp;

+    int nitz;

+    int gnss;

+} time_src_status_s;

+

+#ifdef MOBILETEK_TARGET_PLATFORM_T106

+int (*lynq_sync_time_from_rtc)(void);

+int (*lynq_set_rtc_time)(void);

+int (*lynq_get_rtc_time)(unsigned long *ulsec);

+

+#endif

+void *dlHandle_systime = NULL;

+int (*modem_time_enable)(int enable);

+int (*gnss_time_enable)(int enable);

+int (*ntp_sync_time)(int enable);

+int (*user_set_time)(char *date, char *time);

+int (*lynq_get_time_src_status)(time_src_status_s *time_src);

+int (*get_sync_time_result)();

+

+

+int lynq_ntp_sync_demo(int argc, char *argv[])

+{

+    int ret = -1;

+    if (argc != 3)

+    {

+        printf("Parameter number wrong !\n");

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    ntp_sync_time = (int (*)(int enable))dlsym(dlHandle_systime, "ntp_sync_time");

+    if (NULL == ntp_sync_time)

+    {

+        fprintf(stderr, "Failed to dlsym function ntp_sync_time : %s\n", dlerror());

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    ret = ntp_sync_time(atoi(argv[2]));

+    switch (ret)

+    {

+    case 0:

+        printf("set success!\n");

+        break;

+    case 1:

+        printf("NTP_ALREADY_ENABLE!\n");

+        break;

+    case 2:

+        printf("NTP_ALREADY_DISENABLE!\n");

+        break;

+    default:

+        break;

+    }

+    return ret;

+}

+

+int lynq_modem_sync_demo(int argc, char *argv[])

+{

+    int ret = -1;

+    if (argc != 3)

+    {

+        printf("Parameter number wrong !\n");

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    modem_time_enable = (int (*)(int enable))dlsym(dlHandle_systime, "modem_time_enable");

+    if (NULL == modem_time_enable)

+    {

+        fprintf(stderr, "Failed to dlsym function modem_time_enable: %s\n", dlerror());

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    ret = modem_time_enable(atoi(argv[2]));

+    printf("ret = %d\n", ret);

+    if (ret != 0 && ret != 4)

+    {

+        printf("modem_time_enable failed !\n");

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    return 0;

+}

+

+int lynq_gnss_sync_demo(int argc, char *argv[])

+{

+    int ret = -1;

+    if (argc != 3)

+    {

+        printf("Parameter number wrong !\n");

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    gnss_time_enable = (int (*)(int enable))dlsym(dlHandle_systime, "gnss_time_enable");

+    if (NULL == gnss_time_enable)

+    {

+        fprintf(stderr, "Failed to dlsym function gnss_time_enable: %s\n", dlerror());

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    ret = gnss_time_enable(atoi(argv[2]));

+    printf("ret = %d\n", ret);

+    if (ret != 0 && ret != 4)

+    {

+        printf("gnss_time_enable failed !\n");

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    return ret;

+}

+

+int lynq_user_set_time_demo(int argc, char *argv[])

+{

+    int ret = -1;

+    if (argc != 4)

+    {

+        printf("Parameter number wrong !\n");

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    user_set_time = (int (*)(char *date, char *time))dlsym(dlHandle_systime, "user_set_time");

+    if (NULL == user_set_time)

+    {

+        fprintf(stderr, "Failed to dlsym function user_set_time: %s\n", dlerror());

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    ret = user_set_time(argv[2], argv[3]);

+    return ret;

+}

+

+int lynq_get_time_src_status_demo(int arg_c, char *arg_v[])

+{

+    lynq_get_time_src_status = (int (*)(time_src_status_s *time_src))dlsym(dlHandle_systime, "lynq_get_time_src_status");

+    if (NULL == lynq_get_time_src_status)

+    {

+        fprintf(stderr, "Failed to dlsym function lynq_get_time_src_status : %s\n", dlerror());

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    time_src_status_s time_src = {0};

+    lynq_get_time_src_status(&time_src);

+    printf("time source status are :\nntp=%d\nnitz=%d\ngnss=%d\n", time_src.ntp, time_src.nitz, time_src.gnss);

+    return 0;

+}

+

+int lynq_get_sync_status_demo(int arg_c, char *arg_v[])

+{

+    get_sync_time_result = (int (*)(void))dlsym(dlHandle_systime, "get_sync_time_result");

+    int ret = 0;

+    if(NULL == get_sync_time_result)

+    {

+        printf("Failed to dlsym function get_sync_time_result: %s\n", dlerror());

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    ret = get_sync_time_result();

+    printf("get_sync_time_result = %d\n",ret);

+	dlclose(dlHandle_systime);

+    return 0;

+}

+

+int main(int argc, char *argv[])

+{

+    int ret = -1;

+    char *cmd = argv[1];

+    printf("enter lynq_systime_demo \n");

+    dlHandle_systime = dlopen("/lib/liblynq-systime.so", RTLD_NOW);

+    if (!dlHandle_systime)

+    {

+        fprintf(stderr, "Failed to load library: %s\n", dlerror());

+        return 1;

+    }

+

+    if (cmd == NULL)

+    {

+        printf("No command received!\n");

+        dlclose(dlHandle_systime);

+        return 1;

+    }

+    else if (strcmp(cmd, "ntp") == 0)

+    {

+        ret = lynq_ntp_sync_demo(argc, argv);

+    }

+    else if (strcmp(cmd, "nitz") == 0)

+    {

+        ret = lynq_modem_sync_demo(argc, argv);

+    }

+    else if (strcmp(cmd, "gnss") == 0)

+    {

+        ret = lynq_gnss_sync_demo(argc, argv);

+    }

+    else if (strcmp(cmd, "user") == 0)

+    {

+        ret = lynq_user_set_time_demo(argc, argv);

+    }

+#ifdef MOBILETEK_TARGET_PLATFORM_T106

+    else if (strcmp(cmd, "sync_rtc") == 0)

+    {

+        lynq_sync_time_from_rtc = (int (*)(void))dlsym(dlHandle_systime, "lynq_sync_time_from_rtc");

+        if (NULL == lynq_sync_time_from_rtc)

+        {

+            fprintf(stderr, "Failed to dlsym function lynq_sync_time_from_rtc : %s\n", dlerror());

+            dlclose(dlHandle_systime);

+            return -1;

+        }

+        ret = lynq_sync_time_from_rtc();

+    }

+    else if (strcmp(cmd, "rtc_set") == 0)

+    {

+        lynq_set_rtc_time = (int (*)(void))dlsym(dlHandle_systime, "lynq_set_rtc_time");

+        if (NULL == lynq_set_rtc_time)

+        {

+            fprintf(stderr, "Failed to dlsym function lynq_set_rtc_time : %s\n", dlerror());

+            dlclose(dlHandle_systime);

+            return -1;

+        }

+        ret = lynq_set_rtc_time();

+    }

+    else if (strcmp(cmd, "rtc_get") == 0)

+    {

+        lynq_get_rtc_time = (int (*)(unsigned long *ulsec))dlsym(dlHandle_systime, "lynq_get_rtc_time");

+        if (NULL == lynq_get_rtc_time)

+        {

+            fprintf(stderr, "Failed to dlsym function lynq_get_rtc_time : %s\n", dlerror());

+            dlclose(dlHandle_systime);

+            return -1;

+        }

+        unsigned long time_ret;

+        ret = lynq_get_rtc_time(&time_ret);

+        time_t tp = (time_t)time_ret;

+        char *rtc_time = ctime(&tp);

+        printf("rtc_time seconds = %lu\n", time_ret);

+        printf("rtc time = %s\n", rtc_time);

+    }

+#endif

+    else if (strcmp(cmd, "src_status") == 0)

+    {

+        ret = lynq_get_time_src_status_demo(argc, argv);

+    }

+    else if (strcmp(cmd,"sync_status") == 0)

+    {

+        ret = lynq_get_sync_status_demo(argc, argv);

+    }

+    else

+    {

+        printf("command wrong !\n");

+        dlclose(dlHandle_systime);

+        return -1;

+    }

+    if (0 != ret)

+    {

+        printf("ret = %d\n Command execution failure.\n", ret);

+    }

+    dlclose(dlHandle_systime);

+    return ret;

+}

diff --git a/mbtk/test/liblynq_lib_t106/lynq_wifi_test.c b/mbtk/test/liblynq_lib_t106/lynq_wifi_test.c
new file mode 100755
index 0000000..b8f5189
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/lynq_wifi_test.c
@@ -0,0 +1,505 @@
+#include "sta_cli.h"
+#include "lynq_wifi.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+#define MAX_LEN 15
+#define MAX_VALUE_LEN 512
+
+#define ENABLE "enable"
+#define DISABLE "disable"
+#define MODE_SET "mode_set"
+#define MODE_GET "mode_get"
+#define AP_GET_STATUS "ap_get_status"
+#define AP_ACL_SET "ap_acl_set"
+#define AP_ACL_GET "ap_acl_get"
+#define AP_SSID_SET "ap_ssid_set"
+#define AP_SSID_GET "ap_ssid_get"
+#define AP_SSID_HIDE_SET "ap_ssid_hide_set"
+#define AP_SSID_HIDE_GET "ap_ssid_hide_get"
+#define AP_MODE_SET "ap_mode_set"
+#define AP_MODE_GET "ap_mode_get"
+#define AP_BAND_SET "ap_band_set"
+#define AP_BAND_GET "ap_band_get"
+#define AP_CHANNEL_SET "ap_channel_set"
+#define AP_CHANNEL_GET "ap_channel_get"
+#define AP_AUTH_SET "ap_auth_set"
+#define AP_AUTH_GET "ap_auth_get"
+#define AP_auth_GET_S "ap_auth_get_s"
+#define AP_MAX_STA_SET "ap_max_sta_set"
+#define AP_MAX_STA_GET "ap_max_sta_get"
+#define AP_LIST_GET "list_get"
+#define AP_PKT_GET "ap_pkt_get"
+#define AP_START "ap_start"
+#define AP_STOP "ap_stop"
+#define AP_RESTART "ap_restart"
+#define AP_REG_HANDLE "reg_handle"
+#define STA_PARAM_SET "sta_param_set"
+#define STA_PARAM_GET "sta_param_get"
+#define STA_START "sta_start"
+#define STA_STOP "sta_stop"
+#define STA_STATUS_GET "sta_status_get"
+#define STA_PKT_GET "sta_pkt_get"
+#define STA_SCAN "sta_scan"
+
+void lynq_wifi_event_handle_sta_demo(lynq_wifi_sta_scan_list_t *event)
+{
+    int i = 0;
+    for (i = 0; i < event->cnt; i++)
+    {
+        printf("[lynq-wifi-demo] %s : ap[%d]:%s,%d,%d,%d,%s,%d,%d,%d\n", __func__, i,
+        event->info[i].essid, event->info[i].auth,
+        event->info[i].cipher, event->info[i].channel, event->info[i].bssid,
+        event->info[i].signal_level,event->info[i].frequency,event->info[i].signal);
+    }
+}
+
+
+static void help()
+{
+    printf("please read the define \n");
+
+}
+
+int main(int argc, char *argv[])
+{
+    int test_int = 0;
+    char value[MAX_VALUE_LEN] = {0};
+    lynq_wifi_ap_auth_t auth_mode = {0};
+    lynq_lanhost_ts lanhost = {0};
+    lynq_wifi_pkt_stats_t pkt_stat = {0};
+    lynq_wifi_sta_param_t sta_param = {0};
+    lynq_wifi_sta_status_t sta_status = {0};
+
+    printf(">>>>>>>>>>>>>>>>>>>>>>>>Enter cmd:\n");
+    char cmd[MAX_VALUE_LEN];
+    while(1)
+    {
+        memset(cmd, 0, MAX_VALUE_LEN);
+        test_int = 0;
+        memset(value, 0, MAX_VALUE_LEN);
+        memset(&auth_mode, 0, sizeof(lynq_wifi_ap_auth_t));
+        memset(&lanhost, 0, sizeof(lynq_lanhost_ts));
+        memset(&pkt_stat, 0, sizeof(lynq_wifi_pkt_stats_t));
+        memset(&sta_param, 0, sizeof(lynq_wifi_sta_param_t));
+        memset(&sta_status, 0, sizeof(lynq_wifi_sta_status_t));
+        if(fgets(cmd, MAX_VALUE_LEN, stdin))
+        {
+            char *ptr = cmd + strlen(cmd) - 1;
+            while(ptr >= cmd && (*ptr == '\r' || *ptr == '\n'))
+            {
+                *ptr-- = '\0';
+            }
+
+            if(!strncasecmp(cmd, ENABLE, strlen(ENABLE)))
+            {
+                if(LYNQ_ERR_SUCCESS != qser_wifi_enable())
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            } 
+            else if(!strncasecmp(cmd, DISABLE, strlen(DISABLE)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_disable())
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, MODE_SET, strlen(MODE_SET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_work_mode_set(LYNQ_WIFI_WORK_MODE_AP0))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, MODE_GET, strlen(MODE_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_work_mode_get(&test_int))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("mode:%d\n",test_int);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+           else if(!strncasecmp(cmd, AP_ACL_SET, strlen(AP_ACL_SET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_acl_set(LYNQ_WIFI_AP_INDEX_AP1, 
+                                            LYNQ_WIFI_MAC_ACL_RULE_WHITE_LIST, "AA:BB:CC:DD:EE:01;AA:BB:CC:01:EE:00;AA:BB:01:DD:EE:00"))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_ACL_GET, strlen(AP_ACL_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_acl_get(LYNQ_WIFI_AP_INDEX_AP1, &test_int, value))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("value:%s\n",value);
+                    printf("mode:%d\n",test_int);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_SSID_SET, strlen(AP_SSID_SET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_ssid_set(LYNQ_WIFI_AP_INDEX_AP1, "testssid"))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_SSID_GET, strlen(AP_SSID_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_ssid_get(LYNQ_WIFI_AP_INDEX_AP1, value))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("value:%s\n",value);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_SSID_HIDE_SET, strlen(AP_SSID_HIDE_SET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_ssid_hide_set(LYNQ_WIFI_AP_INDEX_AP1, 1))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_SSID_HIDE_GET, strlen(AP_SSID_HIDE_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_ssid_hide_get(LYNQ_WIFI_AP_INDEX_AP1, &test_int))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+
+                    printf("value:%d\n", test_int);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_MODE_SET, strlen(AP_MODE_SET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_mode_set(LYNQ_WIFI_AP_INDEX_AP1, 1))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_MODE_GET, strlen(AP_MODE_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_mode_get(LYNQ_WIFI_AP_INDEX_AP1, &test_int))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("value:%d\n", test_int);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_BAND_SET, strlen(AP_BAND_SET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_bandwidth_set(LYNQ_WIFI_AP_INDEX_AP1, 2))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_BAND_GET, strlen(AP_BAND_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_bandwidth_get(LYNQ_WIFI_AP_INDEX_AP1, &test_int))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("value:%d\n", test_int);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_CHANNEL_SET, strlen(AP_CHANNEL_SET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_channel_set(LYNQ_WIFI_AP_INDEX_AP1, "CN", 35))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_CHANNEL_GET, strlen(AP_CHANNEL_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_channel_get(LYNQ_WIFI_AP_INDEX_AP1, value, &test_int))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("country:%s, channel:%d\n", value, test_int);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_AUTH_SET, strlen(AP_AUTH_SET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_auth_set(LYNQ_WIFI_AP_INDEX_AP1, 1, "123456"))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_AUTH_GET, strlen(AP_AUTH_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_auth_get(LYNQ_WIFI_AP_INDEX_AP1, &test_int, value))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("value:%s\n", value);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_auth_GET_S, strlen(AP_auth_GET_S)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_auth_get_s(LYNQ_WIFI_AP_INDEX_AP1, &auth_mode))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("auth_mode:%s\n", auth_mode.passwd);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_MAX_STA_SET, strlen(AP_MAX_STA_SET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_max_sta_set(LYNQ_WIFI_AP_INDEX_AP1, 8))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_MAX_STA_GET, strlen(AP_MAX_STA_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_max_sta_get(LYNQ_WIFI_AP_INDEX_AP1, &test_int))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("max_sta:%d\n",test_int);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_LIST_GET, strlen(AP_LIST_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_lanhost_get_list(&lanhost))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_PKT_GET, strlen(AP_PKT_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_get_ap_pkt_stats(LYNQ_WIFI_AP_INDEX_AP1, &pkt_stat))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_START, strlen(AP_START)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_start(LYNQ_WIFI_AP_INDEX_AP1))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_STOP, strlen(AP_STOP)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_stop(LYNQ_WIFI_AP_INDEX_AP1))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_RESTART, strlen(AP_RESTART)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_ap_restart(LYNQ_WIFI_AP_INDEX_AP1))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, AP_REG_HANDLE, strlen(AP_REG_HANDLE)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_register_handle(NULL, lynq_wifi_event_handle_sta_demo, NULL))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, STA_PARAM_SET, strlen(STA_PARAM_SET)))
+            { 
+                strcpy(sta_param.ssid, "test");
+                strcpy(sta_param.passwd, "123456");
+                if(LYNQ_ERR_SUCCESS != qser_wifi_sta_param_set(&sta_param))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, STA_PARAM_GET, strlen(STA_PARAM_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_sta_param_get(&sta_param))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("ssid:%s, passwd:%s\n", sta_param.ssid, sta_param.passwd);
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, STA_START, strlen(STA_START)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_sta_start())
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, STA_STOP, strlen(STA_STOP)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_sta_stop())
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, STA_STATUS_GET, strlen(STA_STATUS_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_sta_get_status(&sta_status))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, STA_PKT_GET, strlen(STA_PKT_GET)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_get_sta_pkt_stats(&pkt_stat))
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+            else if(!strncasecmp(cmd, STA_SCAN, strlen(STA_SCAN)))
+            { 
+                if(LYNQ_ERR_SUCCESS != qser_wifi_sta_start_scan())
+                {
+                    printf("LYNQ_ERR_FAIL\n");
+                }
+                else
+                {
+                    printf("LYNQ_ERR_SUCCESS\n");
+                }
+            }
+     
+            else if(!strcasecmp(cmd, "h") || !strcasecmp(cmd, "help")) 
+            {
+                help();
+            } 
+            else if(!strcasecmp(cmd, "q")) 
+            {
+                break;
+            } 
+            else 
+            {
+                printf("unknown command\n");
+            }
+        }
+    }
+
+
+    return 0;
+}
+
diff --git a/mbtk/test/liblynq_lib_t106/poweralarm-demo.cpp b/mbtk/test/liblynq_lib_t106/poweralarm-demo.cpp
new file mode 100755
index 0000000..6516165
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/poweralarm-demo.cpp
@@ -0,0 +1,308 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/types.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+

+

+#define INIT_SUCCESS    0

+#define RTC_DEINIT    -1

+typedef struct

+{

+    int  cmdIdx;

+    char *funcName;

+} st_api_test_case;

+

+

+//for server test

+st_api_test_case at_api_testcases[] =

+{

+    {0,   (char*)"print_help"},

+    {1,   (char*)"lynq_rtc_service_init"},

+    {2,   (char*)"poweralarm"},

+    {3,   (char*)"wakealarm"},

+    {4,   (char*)"cancel_wakealarm"},

+    {5,   (char*)"lynq_set_poweralarm"},

+    {6,   (char*)"lynq_set_wakealarm"},

+    {7,   (char*)"lynq_rtc_service_deinit"},

+    {-1,    NULL}

+};

+

+ int init_flag = -1;

+ int src_id = -1;

+ void *dlHandle_poweralarm = NULL;

+

+typedef int (*lynq_wakealarm_add_cb)(unsigned int src_id, int rtc_id);

+

+int (*lynq_rtc_service_init)(void);

+int (*lynq_rtc_service_deinit)(void);

+int (*poweralarm)(char *buffer,int src_id);

+int (*wakealarm)(char *buffer,int srcid,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify);

+int (*cancel_wakealarm)(int src_id,int rtc_id);

+int (*lynq_set_poweralarm)(unsigned long time_sec,int src_id);

+int (*lynq_set_wakealarm)(unsigned long time_sec,int srcid,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify);

+

+

+

+void print_help(void)

+{

+    int i;

+    printf("Supported test cases:\n");

+    for(i = 0; ; i++)

+    {

+        if(at_api_testcases[i].cmdIdx == -1)

+        {

+            break;

+        }

+        printf("%d:\t%s\n", at_api_testcases[i].cmdIdx, at_api_testcases[i].funcName);

+    }

+}

+

+int lynq_wakealarm_add_callback(unsigned int src_id, int rtc_id)

+{

+    printf("wake alarm callback test \n");

+    return 0;

+}

+

+

+int main(int argc,char *argv[])

+{

+

+    int cmdIdx = 0;

+    printf("Enter main function\n");

+

+    const char *dlHandle_Path_poweralarm = "/lib/libpoweralarm.so";

+    dlHandle_poweralarm = dlopen(dlHandle_Path_poweralarm, RTLD_NOW);

+    if (dlHandle_poweralarm == NULL)

+    {

+        printf("dlopen dlHandle_fota failed: %s\n", dlerror());

+        return -1;

+    }

+

+    poweralarm = (int (*)(char *buffer,int src_ids))dlsym(dlHandle_poweralarm, "poweralarm");

+    if(poweralarm == NULL)

+    {

+        printf("poweralarm is null\n");

+        return -1;

+    }

+

+    wakealarm = (int (*)(char *buffer,int srcid,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify))dlsym(dlHandle_poweralarm, "wakealarm");

+    if(wakealarm == NULL)

+    {

+        printf("wakealarm is null\n");

+        return -1;

+    }

+    lynq_set_poweralarm = (int (*)(unsigned long,int src_id))dlsym(dlHandle_poweralarm,"lynq_set_poweralarm");

+    if(lynq_set_poweralarm == NULL)

+    {

+        printf("lynq_set_poweralarm is null\n");

+        return -1;

+    }

+    lynq_set_wakealarm = (int (*)(unsigned long,int srcid,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify))dlsym(dlHandle_poweralarm,"lynq_set_wakealarm");

+    if(lynq_set_wakealarm == NULL)

+    {

+        printf("lynq_set_wakealarm is null\n");

+        return -1;

+    }

+

+    cancel_wakealarm = (int (*)(int src_id,int rtc_id))dlsym(dlHandle_poweralarm, "cancel_wakealarm");

+     if(cancel_wakealarm == NULL)

+    {

+        printf("cancel_wakealarm is null\n");

+        return -1;

+    }

+

+    lynq_rtc_service_init = (int(*)())dlsym(dlHandle_poweralarm,"lynq_rtc_service_init");

+    if(lynq_rtc_service_init == NULL)

+    {

+        printf("lynq_rtc_service_init is null\n");

+        return -1;

+    }

+

+    lynq_rtc_service_deinit = (int (*)())dlsym(dlHandle_poweralarm,"lynq_rtc_service_deinit");

+    if(lynq_rtc_service_deinit == NULL)

+    {

+        printf("lynq_rtc_service_deinit is null \n");

+        return -1;

+    }

+

+    print_help();

+    while(1)

+    {

+

+        printf("\nplease input cmd index(-1 exit): ");

+        if(1 != scanf("%d", &cmdIdx) || cmdIdx == -1)

+        {

+            break;

+        }

+        switch(cmdIdx)

+        {

+            case 0:

+                print_help();

+                break;

+            case 1:

+                {

+                    src_id = lynq_rtc_service_init();

+                    if(src_id <= 0)

+                    {

+

+                        printf("RTC service init failed ");

+                        return -1;

+                    }

+                    else

+                    {

+                        init_flag = INIT_SUCCESS;

+                    }

+

+                    break;

+                }

+            case 2:

+                {

+

+                    if(init_flag != INIT_SUCCESS)

+                    {

+                        printf("*****ERROR must init rtc service ,Please reselect *******\n ");

+                    }

+                    else

+                    {

+                        int ret = 0;

+                        char tmp_time[32] = {0};

+                        printf("Set poweralarm time,e.g: 60 (seconds)\n");

+                        if(1 != scanf("%s",tmp_time))

+                            break;

+                        ret = poweralarm(tmp_time,src_id);

+                        if(ret != 0)

+                        {

+                            printf("set poweralarm failed\n");

+                            return -1;

+                        }

+                    }

+                break;

+                }

+            case 3:

+                {

+                    if(init_flag != INIT_SUCCESS)

+                    {

+                        printf("*****ERROR must init rtc service ,Please reselect *******\n ");

+                    }

+                    else

+                    {

+                        int ret = 0;

+                        char tmp_time[32]={0};

+                        int rtc_id = 0;

+                        printf("Set wakealarm time ,e.g: 60  1 (seconds)\n");

+                        if(2 != scanf("%s%d",tmp_time,&rtc_id))

+                            break;

+

+                        ret = wakealarm(tmp_time,src_id,rtc_id,lynq_wakealarm_add_callback);

+                        if(ret != 0)

+                        {

+                            printf("set wakealarm failed\n");

+                            return -1;

+                        }

+                    }

+                    break;

+                }

+             case 4:

+                {

+                    if(init_flag != INIT_SUCCESS)

+                    {

+                        printf("*****ERROR must init rtc service ,Please reselect *******\n ");

+                    }

+                    else

+                    {

+                        int ret = 0;

+                        int rtc_id = 0;

+                        printf("Please input you want cancel rtc timer rtc id\n");

+                        if(1 != scanf("%d",&rtc_id))

+                            break;

+                        ret = cancel_wakealarm(src_id,rtc_id);

+                        if(ret != 0)

+                        {

+                            printf("Cancel_wakealarm failed!!!");

+                            return -1;

+                        }

+                    }

+                    break;

+                }

+             case 5:

+                {

+                    if(init_flag != INIT_SUCCESS)

+                    {

+                        printf("*****ERROR must init rtc service ,Please reselect *******\n ");

+                    }

+                    else

+                    {

+                        int ret = 0;

+                        unsigned long time_sec = 0;

+                        printf("Input time_sec you want poweralarm,e.g: 60 (seconds)\n");

+                        if(1 != scanf("%lu",&time_sec))

+                            break;

+                        ret =lynq_set_poweralarm(time_sec,src_id);

+                        printf("ret is %d\n",ret);

+                        if(ret != 0)

+                        {

+                            printf("lynq_set_poweralarm failed\n");

+                            return -1;

+                        }

+                    }

+                   break;

+                }

+            case 6:

+                {

+                    if(init_flag != INIT_SUCCESS)

+                    {

+                        printf("*****ERROR must init rtc service ,Please reselect *******\n ");

+                   }

+                   else

+                   {

+                        int ret = 0;

+                        unsigned long time_sec = 0;

+                        int rtc_id;

+                        printf("Input time_sec you want wakealarm,e.g:60  1(seconds)\n");

+                        if(2 != scanf("%lu%d",&time_sec,&rtc_id))

+                            break;

+                        ret =lynq_set_wakealarm(time_sec,src_id,rtc_id,lynq_wakealarm_add_callback);

+                        if(ret != 0)

+                        {

+                            printf("lynq_set_wakealarm failed\n");

+                            return -1;

+                        }

+                    }

+                   break;

+                }

+            case 7:

+                {

+                    if(init_flag != INIT_SUCCESS)

+                    {

+                        printf("*****ERROR must init rtc service ,Please reselect *******\n ");

+                    }

+                    else

+                    {

+                        int ret  = -1;

+                        printf("rtc servce deinit !!!!!!!!!!!!");

+                        ret = lynq_rtc_service_deinit();

+                        if(ret != 0)

+                        {

+                            printf("lynq rtc service deinit failed \n");

+                            return -1;

+                        }

+                        else

+                        {

+                            init_flag = RTC_DEINIT;

+                        }

+                    }

+                    break;

+                }

+

+            default:

+                break;

+        }

+    }

+

+    return 0;

+

+}

+

diff --git a/mbtk/test/liblynq_lib_t106/qser_sim_test.c b/mbtk/test/liblynq_lib_t106/qser_sim_test.c
new file mode 100755
index 0000000..e2bc53a
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/qser_sim_test.c
@@ -0,0 +1,448 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <stdint.h>
+
+#include"lynq_qser_sim.h"
+
+
+#define BUF_SIZE 32
+#define BUF_PIN QSER_SIM_PIN_LEN_MAX
+#define VER_SIZE 128
+
+typedef uint32_t sim_client_handle_type;
+
+sim_client_handle_type  ph_sim = 2023;
+sim_client_handle_type  h_sim = 2023;
+int flag_init = 0;
+
+typedef struct
+{
+    int  cmdIdx;
+    const char *funcName;
+} st_api_test_case;
+
+//for server test
+st_api_test_case at_api_testcases[] =
+{
+    {0,   "qser_sim_init"},
+    {1,   "qser_get_imsi"},
+    {2,   "qser_get_iccid"},
+    {3,   "qser_get_phonenumber"},
+    {4,   "qser_verify_pin"},
+    {5,   "qser_change_pin"},
+    {6,   "qser_unlock_pin"},
+    {7,   "qser_enable_pin"},
+    {8,   "qser_disable_pin"},
+    {9,   "qser_get_sim_status"},
+    {10,   "qser_get_imei"},
+    {11,   "qser_get_imei_and_sv"},
+    {12,   "qser_reset_modem"},
+    {13,   "qser_get_version"},
+    {14,   "qser_reset_sim"},
+    {15,   "qser_deinit_sim"},
+    {-1,    NULL}
+};
+
+void print_help(void)
+{
+    int i;
+    printf("Supported test cases:\n");
+    for(i = 0; ; i++)
+    {
+        if(at_api_testcases[i].cmdIdx == -1)
+        {
+            break;
+        }
+        printf("%d:\t%s\n", at_api_testcases[i].cmdIdx, at_api_testcases[i].funcName);
+    }
+}
+
+int main(int argc, char const *argv[])
+{
+    int cmdIdx = 0;
+    int res    = 0;
+
+    print_help();
+    while(1)
+    {
+        printf("\nplease input cmd index(-1 exit): ");
+        int count = scanf("%d", &cmdIdx);
+        if(cmdIdx == -1 || count != 1)
+        {
+            break;
+        }
+
+        switch(cmdIdx)
+        {
+            //"qser_sim_init"
+            case 0:
+            {
+                if(flag_init == 1)
+                {
+                   printf("init is already\n");
+                   break;
+                }
+                else{
+                    //int token;
+                    //printf("input token\n");
+                    //scanf("%d", &token);
+                    res = qser_sim_client_init(&h_sim);
+                    if(res == 0)
+                    {
+                        printf("Run qser_sim_client_init\n");
+                        flag_init = 1;
+                    }else{
+                        printf("qser_sim_client_init error\n");
+                    }
+
+                    break;
+                }
+            }
+
+            //"qser_sim_getimsi"
+            case 1:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char imsi[BUF_SIZE] = {0};
+                    QSER_SIM_APP_ID_INFO_T pt_info;
+                    res = qser_sim_getimsi(h_sim, &pt_info, imsi, 32);
+                    if(res == 0)
+                    {
+                        printf("imsi is %s!!!\n",imsi);
+                    }else{
+                        printf("get imsi error, res = %d\n", res);
+                    }
+                }
+                break;
+            }
+
+            //"qser_get_iccid"
+            case 2:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char iccid[BUF_SIZE] = {0};
+                    res = qser_sim_geticcid(h_sim, QSER_SIM_SLOT_ID_1, iccid, 32);
+                    if(res == 0)
+                    {
+                        printf("get iccid success!!! iccid is %s\n",iccid);
+                    }else{
+                        printf("get iccid error, res = %d\n", res);
+                    }
+                }
+                break;
+            }
+            //qser_get_phonenumber
+            case 3:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char phonenumber[BUF_SIZE] = "";
+                    QSER_SIM_APP_ID_INFO_T pt_info;
+                    res = qser_sim_getphonenumber(h_sim, &pt_info, phonenumber, 32);
+                    if(res == 0)
+                    {
+                        printf("get phonenumber success!!! phonenumber is %s\n",phonenumber);
+                    }else{
+                        printf("get phonenumber error, res = %d\n", res);
+                    }
+                }
+                break;
+           }
+            //qser_verify_pin
+            case 4:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char pin[BUF_PIN] = {0};
+                    QSER_SIM_VERIFY_PIN_INFO_T pt_info;
+                    printf("input pin\n");
+                    if(scanf("%s", pin) != 1)
+                        break;
+                    strncpy(pt_info.pin_value, pin, BUF_PIN);
+                    printf("pin_value = %s , pin = %s\n", pt_info.pin_value, pin);
+                    pt_info.pin_value_len = strlen(pt_info.pin_value);
+
+                    res = qser_sim_verifypin(h_sim, &pt_info);
+                    if(res == 0)
+                    {
+                        printf("verify pin success!!!\n");
+                    }else{
+                        printf("verify pin error, res = %d\n", res);
+                    }
+
+                }
+                break;
+            }
+            //qser_change_pin
+            case 5:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char old_pin[BUF_PIN] = {0};
+                    QSER_SIM_CHANGE_PIN_INFO_T pt_info;
+                    printf("input old pin\n");
+                    if(scanf("%s", old_pin) != 1)
+                        break;
+                    char new_pin[BUF_PIN] = {0};
+                    printf("input new pin\n");
+                    if(scanf("%s", new_pin) != 1)
+                        break;
+                    strncpy(pt_info.old_pin_value, old_pin, BUF_PIN);
+                    strncpy(pt_info.new_pin_value, new_pin, BUF_PIN);
+                    printf("pt_info.old_pin_value = %s, old_pin = %s\n", pt_info.old_pin_value, old_pin);
+                    printf("pt_info.new_pin_value = %s, new_pin = %s\n", pt_info.new_pin_value, new_pin);
+                    pt_info.old_pin_value_len = strlen(pt_info.old_pin_value);
+                    pt_info.new_pin_value_len = strlen(pt_info.new_pin_value);
+
+                    res = qser_sim_changepin(h_sim, &pt_info);
+                    if(res == 0)
+                    {
+                        printf("change pin success!!!\n");
+                    }else{
+                        printf("change pin error, res = %d\n", res);
+                    }
+                }
+                break;
+            }
+            //qser_unlock_pin
+            case 6:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char puk[BUF_PIN] = {0};
+                    QSER_SIM_UNBLOCK_PIN_INFO_T pt_info;
+                    printf("input  puk\n");
+                    if(scanf("%s", puk) != 1)
+                        break;
+                    char new_pin[BUF_PIN] = {0};
+                    printf("input new pin\n");
+                    if(scanf("%s", new_pin) != 1)
+                        break;
+
+                    strncpy(pt_info.puk_value, puk, BUF_PIN);
+                    strncpy(pt_info.new_pin_value, new_pin, BUF_PIN);
+                    printf("pt_info.puk_value = %s, puk = %s\n", pt_info.puk_value, puk);
+                    printf("pt_info.new_pin_value = %s, new_pin = %s\n", pt_info.new_pin_value, new_pin);
+                    pt_info.new_pin_value_len = strlen(pt_info.new_pin_value);
+                    pt_info.puk_value_len = strlen(pt_info.puk_value);
+
+                    res = qser_sim_unblockpin(h_sim, &pt_info);
+                    if(res == 0)
+                    {
+                        printf("unlock pin success!!!\n");
+                    }else{
+                        printf("unlock pin error, res = %d\n", res);
+                    }
+                }
+                break;
+            }
+            //qser_enable_pin
+            case 7:
+           {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char pin[BUF_PIN] = {0};
+                    QSER_SIM_ENABLE_PIN_INFO_T pt_info;
+                    printf("input pin\n");
+                    if(scanf("%s", pin) != 1)
+                        break;
+                    strncpy(pt_info.pin_value, pin, BUF_PIN);
+                    pt_info.pin_value_len = strlen(pt_info.pin_value);
+
+                    res = qser_sim_enablepin(h_sim, &pt_info);
+                    if(res == 0)
+                    {
+                        printf("pin enabled!!!\n");
+                    }else{
+                        printf("pin enable error, res =%d\n", res);
+                    }
+                }
+                break;
+            }
+            //qser_disable_pin
+            case 8:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char pin[BUF_PIN] = {0};
+                    QSER_SIM_ENABLE_PIN_INFO_T pt_info;
+                    printf("input pin\n");
+                    if(scanf("%s", pin) != 1)
+                        break;
+                    strncpy(pt_info.pin_value, pin, BUF_PIN);
+                    pt_info.pin_value_len = strlen(pt_info.pin_value);
+
+                    res = qser_sim_disablepin(h_sim, &pt_info);
+                    if(res == 0)
+                    {
+                        printf("pin disnabled!!!\n");
+                    }else{
+                        printf("pin disable error,res = %d\n", res);
+                    }
+                }
+                break;
+            }
+            //qser_get_sim_status
+            case 9:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    QSER_SIM_CARD_STATUS_INFO_T pt_info;
+
+                    res = qser_sim_getcardstatus(h_sim, QSER_SIM_SLOT_ID_1, &pt_info);
+                    if(res == 0)
+                    {
+                        printf("state is %d !!!\n",pt_info.e_card_state);
+                    }else{
+                        printf("get imsi error,res = %d\n", res);
+                    }
+                }
+                break;
+            }
+            //qser_get_imei
+            case 10:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    char imei[BUF_SIZE]="";
+                    res = qser_sim_getimei(h_sim, imei);
+                    if(res == 0)
+                    {
+                        printf("get imei success!!! imei = %s\n", imei);
+                    }else{
+                        printf("get imei error, res = %d\n", res);
+                    }
+                }
+                //flag_init = 0;
+                break;
+            }
+            //qser_get_imei_and_sv
+            case 11:
+            {
+                char imei[BUF_SIZE]="";
+                char sv[BUF_SIZE]="";
+
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    res = qser_get_imei_and_sv(h_sim, imei, sv);
+                    if(res == 0)
+                    {
+                        printf("get imei and sv success!!!imei = %s sv = %s\n", imei, sv);
+                    }else{
+                        printf("get imei and sv error, res = %d\n", res);
+                    }
+                }
+                //flag_init = 0;
+                break;
+            }
+            //qser_reset_modem
+            case 12:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    res = qser_reset_modem(h_sim);
+                    if(res == 0)
+                    {
+                        printf("reset modem success!!!\n");
+                    }else{
+                        printf("reset modem error, res = %d\n", res);
+                    }
+                }
+                //flag_init = 0;
+                break;
+            }
+            //qser_get_version
+            case 13:
+            {
+                char buf[VER_SIZE]="";
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    res = qser_get_version(h_sim, buf);
+                    if(res == 0)
+                    {
+                        printf("get version success!!! ver = %s\n", buf);
+                    }else{
+                        printf("get version error, res = %d\n", res);
+                    }
+                }
+                //flag_init = 0;
+                break;
+            }
+            //qser_reset_sim
+            case 14:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    res = qser_reset_sim(h_sim);
+                    if(res == 0)
+                    {
+                        printf("reset sim success!!!\n");
+                    }else{
+                        printf("reset sim error, res = %d\n", res);
+                    }
+                }
+                //flag_init = 0;
+                break;
+            }
+            //qser_deinit_sim
+            case 15:
+            {
+                if(flag_init == 0){
+                    printf("must init first\n");
+                }
+                else{
+                    res = qser_sim_client_deinit(h_sim);
+                    if(res == 0)
+                    {
+                        printf("sim deinit success is!!!\n");
+                    }else{
+                        printf("sim deint errors, res = %d\n", res);
+                    }
+                }
+                flag_init = 0;
+                break;
+            }
+            default:
+                print_help();
+                break;
+        }
+
+    }
+
+   return 0;
+}
diff --git a/mbtk/test/liblynq_lib_t106/ring_tele.h b/mbtk/test/liblynq_lib_t106/ring_tele.h
new file mode 100755
index 0000000..580bfe8
--- /dev/null
+++ b/mbtk/test/liblynq_lib_t106/ring_tele.h
@@ -0,0 +1,6364 @@
+/* Generated by reswrap version 4.0.0 */
+
+/* created by reswrap from file m.pcm */
+#ifndef RING_TELE
+#define RING_TELE
+
+#define PCM_DATA ring_tele
+#define PCM_DATA_SIZE (sizeof(ring_tele) / sizeof(ring_tele[0]))
+
+const unsigned char ring_tele[]={
+0xd8, 0xff, 0xbc, 0xff, 0xa4, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xd8, 0xff,
+0xfc, 0xff, 0x18, 0x00, 0x3a, 0x00, 0x44, 0x00, 0x64, 0x00, 0x6a, 0x00, 0x4e, 0x00, 0x38, 0x00,
+0x14, 0x00, 0xf6, 0xff, 0xc6, 0xff, 0x9a, 0xff, 0x86, 0xff, 0x70, 0xff, 0x68, 0xff, 0x86, 0xff,
+0x9c, 0xff, 0xca, 0xff, 0xf0, 0xff, 0x22, 0x00, 0x58, 0x00, 0x74, 0x00, 0x86, 0x00, 0x82, 0x00,
+0x6a, 0x00, 0x42, 0x00, 0x1a, 0x00, 0xe8, 0xff, 0xa8, 0xff, 0x74, 0xff, 0x66, 0xff, 0x4c, 0xff,
+0x56, 0xff, 0x7e, 0xff, 0xa2, 0xff, 0xd6, 0xff, 0x0c, 0x00, 0x3e, 0x00, 0x72, 0x00, 0x9a, 0x00,
+0xae, 0x00, 0xa0, 0x00, 0x80, 0x00, 0x4e, 0x00, 0x06, 0x00, 0xd2, 0xff, 0x96, 0xff, 0x62, 0xff,
+0x3e, 0xff, 0x3a, 0xff, 0x44, 0xff, 0x5c, 0xff, 0x9e, 0xff, 0xd0, 0xff, 0x06, 0x00, 0x42, 0x00,
+0x8c, 0x00, 0xa0, 0x00, 0xac, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x30, 0x00, 0xfc, 0xff, 0xc2, 0xff,
+0x7c, 0xff, 0x4c, 0xff, 0x20, 0xff, 0x20, 0xff, 0x34, 0xff, 0x64, 0xff, 0xa4, 0xff, 0xec, 0xff,
+0x24, 0x00, 0x5c, 0x00, 0x96, 0x00, 0xb6, 0x00, 0xc2, 0x00, 0x9c, 0x00, 0x6c, 0x00, 0x26, 0x00,
+0xee, 0xff, 0xb2, 0xff, 0x74, 0xff, 0x4e, 0xff, 0x36, 0xff, 0x3a, 0xff, 0x54, 0xff, 0x7a, 0xff,
+0xc8, 0xff, 0x06, 0x00, 0x2e, 0x00, 0x74, 0x00, 0x9c, 0x00, 0xae, 0x00, 0xa2, 0x00, 0x86, 0x00,
+0x4c, 0x00, 0x12, 0x00, 0xdc, 0xff, 0xa2, 0xff, 0x66, 0xff, 0x48, 0xff, 0x44, 0xff, 0x46, 0xff,
+0x62, 0xff, 0x90, 0xff, 0xce, 0xff, 0x02, 0x00, 0x32, 0x00, 0x62, 0x00, 0x8a, 0x00, 0x98, 0x00,
+0x90, 0x00, 0x72, 0x00, 0x42, 0x00, 0x0a, 0x00, 0xd2, 0xff, 0xaa, 0xff, 0x74, 0xff, 0x5a, 0xff,
+0x5a, 0xff, 0x68, 0xff, 0x84, 0xff, 0xa8, 0xff, 0xde, 0xff, 0x1a, 0x00, 0x56, 0x00, 0x74, 0x00,
+0x88, 0x00, 0x96, 0x00, 0x86, 0x00, 0x60, 0x00, 0x3a, 0x00, 0xfe, 0xff, 0xce, 0xff, 0xa8, 0xff,
+0x90, 0xff, 0x82, 0xff, 0x70, 0xff, 0x7e, 0xff, 0x94, 0xff, 0xba, 0xff, 0xf4, 0xff, 0x16, 0x00,
+0x40, 0x00, 0x54, 0x00, 0x6a, 0x00, 0x60, 0x00, 0x52, 0x00, 0x46, 0x00, 0x0c, 0x00, 0xf6, 0xff,
+0xd2, 0xff, 0xa6, 0xff, 0xa0, 0xff, 0x9e, 0xff, 0x94, 0xff, 0x96, 0xff, 0xa6, 0xff, 0xd2, 0xff,
+0xee, 0xff, 0x0a, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x44, 0x00, 0x42, 0x00, 0x36, 0x00,
+0x14, 0x00, 0xfe, 0xff, 0xea, 0xff, 0xd2, 0xff, 0xca, 0xff, 0xc8, 0xff, 0xb4, 0xff, 0xbc, 0xff,
+0xc4, 0xff, 0xd6, 0xff, 0xec, 0xff, 0xf8, 0xff, 0x0e, 0x00, 0x16, 0x00, 0x14, 0x00, 0x22, 0x00,
+0x0e, 0x00, 0x14, 0x00, 0x0e, 0x00, 0xfc, 0xff, 0xfa, 0xff, 0xe8, 0xff, 0xda, 0xff, 0xd2, 0xff,
+0xce, 0xff, 0xc8, 0xff, 0xcc, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd2, 0xff, 0xec, 0xff, 0xec, 0xff,
+0xee, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff,
+0xf8, 0xff, 0xf8, 0xff, 0xee, 0xff, 0xea, 0xff, 0xde, 0xff, 0xd6, 0xff, 0xd2, 0xff, 0xc6, 0xff,
+0xcc, 0xff, 0xca, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xe6, 0xff, 0xf8, 0xff, 0x10, 0x00, 0x1e, 0x00,
+0x20, 0x00, 0x28, 0x00, 0x10, 0x00, 0x16, 0x00, 0x12, 0x00, 0x04, 0x00, 0xe4, 0xff, 0xc0, 0xff,
+0xb6, 0xff, 0x9c, 0xff, 0x8c, 0xff, 0x98, 0xff, 0xac, 0xff, 0xbc, 0xff, 0xdc, 0xff, 0xf8, 0xff,
+0x1a, 0x00, 0x36, 0x00, 0x42, 0x00, 0x50, 0x00, 0x40, 0x00, 0x38, 0x00, 0x18, 0x00, 0xf8, 0xff,
+0xd2, 0xff, 0xa8, 0xff, 0x86, 0xff, 0x78, 0xff, 0x76, 0xff, 0x86, 0xff, 0xa6, 0xff, 0xb6, 0xff,
+0xe4, 0xff, 0x10, 0x00, 0x48, 0x00, 0x68, 0x00, 0x78, 0x00, 0x7c, 0x00, 0x6c, 0x00, 0x46, 0x00,
+0x22, 0x00, 0xf4, 0xff, 0xd0, 0xff, 0x9c, 0xff, 0x74, 0xff, 0x5e, 0xff, 0x5c, 0xff, 0x70, 0xff,
+0x90, 0xff, 0xc2, 0xff, 0xea, 0xff, 0x22, 0x00, 0x60, 0x00, 0x7a, 0x00, 0x94, 0x00, 0x9a, 0x00,
+0x7a, 0x00, 0x54, 0x00, 0x2c, 0x00, 0xf4, 0xff, 0xc2, 0xff, 0x86, 0xff, 0x52, 0xff, 0x3e, 0xff,
+0x3c, 0xff, 0x4a, 0xff, 0x7a, 0xff, 0xb8, 0xff, 0xf4, 0xff, 0x2e, 0x00, 0x68, 0x00, 0x96, 0x00,
+0xaa, 0x00, 0xb6, 0x00, 0x90, 0x00, 0x6a, 0x00, 0x32, 0x00, 0xfa, 0xff, 0xba, 0xff, 0x76, 0xff,
+0x3e, 0xff, 0x2c, 0xff, 0x30, 0xff, 0x4c, 0xff, 0x82, 0xff, 0xc8, 0xff, 0x02, 0x00, 0x36, 0x00,
+0x7c, 0x00, 0xa2, 0x00, 0xb4, 0x00, 0xae, 0x00, 0x8e, 0x00, 0x60, 0x00, 0x0e, 0x00, 0xe4, 0xff,
+0xa0, 0xff, 0x62, 0xff, 0x36, 0xff, 0x18, 0xff, 0x2c, 0xff, 0x56, 0xff, 0x8e, 0xff, 0xcc, 0xff,
+0xfc, 0xff, 0x30, 0x00, 0x72, 0x00, 0x9c, 0x00, 0xa4, 0x00, 0xa8, 0x00, 0x88, 0x00, 0x3e, 0x00,
+0x02, 0x00, 0xce, 0xff, 0x94, 0xff, 0x5a, 0xff, 0x2e, 0xff, 0x26, 0xff, 0x3a, 0xff, 0x5e, 0xff,
+0x96, 0xff, 0xd4, 0xff, 0x0e, 0x00, 0x44, 0x00, 0x78, 0x00, 0xa4, 0x00, 0xb2, 0x00, 0x9c, 0x00,
+0x74, 0x00, 0x3c, 0x00, 0x04, 0x00, 0xbe, 0xff, 0x88, 0xff, 0x54, 0xff, 0x38, 0xff, 0x32, 0xff,
+0x40, 0xff, 0x6e, 0xff, 0xa6, 0xff, 0xe6, 0xff, 0x18, 0x00, 0x48, 0x00, 0x72, 0x00, 0x92, 0x00,
+0x96, 0x00, 0x7e, 0x00, 0x5a, 0x00, 0x28, 0x00, 0xe4, 0xff, 0xb0, 0xff, 0x88, 0xff, 0x5e, 0xff,
+0x4e, 0xff, 0x54, 0xff, 0x68, 0xff, 0x8a, 0xff, 0xc6, 0xff, 0xec, 0xff, 0x1c, 0x00, 0x4c, 0x00,
+0x6c, 0x00, 0x7c, 0x00, 0x76, 0x00, 0x66, 0x00, 0x4c, 0x00, 0x10, 0x00, 0xe6, 0xff, 0xc2, 0xff,
+0xa0, 0xff, 0x90, 0xff, 0x74, 0xff, 0x7c, 0xff, 0x90, 0xff, 0xa2, 0xff, 0xde, 0xff, 0xfc, 0xff,
+0x20, 0x00, 0x44, 0x00, 0x4e, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x56, 0x00, 0x2c, 0x00, 0x0e, 0x00,
+0xe8, 0xff, 0xc4, 0xff, 0xb0, 0xff, 0xa0, 0xff, 0x98, 0xff, 0x94, 0xff, 0xa6, 0xff, 0xb4, 0xff,
+0xe4, 0xff, 0x02, 0x00, 0x14, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x34, 0x00,
+0x08, 0x00, 0xfa, 0xff, 0xe6, 0xff, 0xdc, 0xff, 0xcc, 0xff, 0xc4, 0xff, 0xba, 0xff, 0xbc, 0xff,
+0xd2, 0xff, 0xde, 0xff, 0xf4, 0xff, 0x04, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x10, 0x00,
+0x0c, 0x00, 0x0a, 0x00, 0x08, 0x00, 0xf4, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf4, 0xff,
+0xf4, 0xff, 0xf2, 0xff, 0xe6, 0xff, 0xde, 0xff, 0xd4, 0xff, 0xe4, 0xff, 0xd4, 0xff, 0xd4, 0xff,
+0xde, 0xff, 0xd4, 0xff, 0xde, 0xff, 0xec, 0xff, 0xf8, 0xff, 0x04, 0x00, 0x0e, 0x00, 0x14, 0x00,
+0x1c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x02, 0x00, 0xfc, 0xff, 0xdc, 0xff, 0xc6, 0xff, 0xb0, 0xff,
+0xa4, 0xff, 0xb6, 0xff, 0xac, 0xff, 0xb4, 0xff, 0xd6, 0xff, 0xe4, 0xff, 0xf8, 0xff, 0x14, 0x00,
+0x2a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x10, 0x00, 0xf4, 0xff, 0xde, 0xff,
+0xb4, 0xff, 0x96, 0xff, 0x94, 0xff, 0x86, 0xff, 0x96, 0xff, 0x9e, 0xff, 0xbc, 0xff, 0xee, 0xff,
+0x04, 0x00, 0x32, 0x00, 0x50, 0x00, 0x62, 0x00, 0x60, 0x00, 0x58, 0x00, 0x4c, 0x00, 0x1c, 0x00,
+0xf4, 0xff, 0xca, 0xff, 0x94, 0xff, 0x80, 0xff, 0x6a, 0xff, 0x60, 0xff, 0x7e, 0xff, 0x98, 0xff,
+0xb6, 0xff, 0xec, 0xff, 0x1e, 0x00, 0x4e, 0x00, 0x76, 0x00, 0x94, 0x00, 0x88, 0x00, 0x64, 0x00,
+0x46, 0x00, 0x14, 0x00, 0xf0, 0xff, 0xba, 0xff, 0x80, 0xff, 0x60, 0xff, 0x4a, 0xff, 0x54, 0xff,
+0x68, 0xff, 0xa0, 0xff, 0xd6, 0xff, 0x02, 0x00, 0x3a, 0x00, 0x6e, 0x00, 0x96, 0x00, 0xa8, 0x00,
+0x9c, 0x00, 0x7a, 0x00, 0x44, 0x00, 0x0a, 0x00, 0xd0, 0xff, 0x9a, 0xff, 0x64, 0xff, 0x48, 0xff,
+0x36, 0xff, 0x46, 0xff, 0x66, 0xff, 0xa0, 0xff, 0xe4, 0xff, 0x16, 0x00, 0x48, 0x00, 0x90, 0x00,
+0xb2, 0x00, 0xb4, 0x00, 0x9e, 0x00, 0x78, 0x00, 0x40, 0x00, 0xfc, 0xff, 0xc6, 0xff, 0x86, 0xff,
+0x5c, 0xff, 0x36, 0xff, 0x24, 0xff, 0x3a, 0xff, 0x6e, 0xff, 0xb0, 0xff, 0xec, 0xff, 0x1e, 0x00,
+0x60, 0x00, 0x90, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xa6, 0x00, 0x78, 0x00, 0x26, 0x00, 0xf8, 0xff,
+0xc2, 0xff, 0x7c, 0xff, 0x4a, 0xff, 0x28, 0xff, 0x32, 0xff, 0x40, 0xff, 0x6c, 0xff, 0xb0, 0xff,
+0xf8, 0xff, 0x28, 0x00, 0x62, 0x00, 0x9a, 0x00, 0xae, 0x00, 0xa8, 0x00, 0x8c, 0x00, 0x5a, 0x00,
+0x14, 0x00, 0xe2, 0xff, 0xa4, 0xff, 0x72, 0xff, 0x4a, 0xff, 0x2e, 0xff, 0x32, 0xff, 0x4a, 0xff,
+0x82, 0xff, 0xc0, 0xff, 0xfe, 0xff, 0x32, 0x00, 0x6e, 0x00, 0x90, 0x00, 0x96, 0x00, 0x96, 0x00,
+0x76, 0x00, 0x46, 0x00, 0x06, 0x00, 0xd6, 0xff, 0xa4, 0xff, 0x70, 0xff, 0x58, 0xff, 0x54, 0xff,
+0x52, 0xff, 0x6a, 0xff, 0xa4, 0xff, 0xe2, 0xff, 0x12, 0x00, 0x40, 0x00, 0x66, 0x00, 0x84, 0x00,
+0x90, 0x00, 0x72, 0x00, 0x5a, 0x00, 0x32, 0x00, 0xfc, 0xff, 0xd8, 0xff, 0x9c, 0xff, 0x82, 0xff,
+0x72, 0xff, 0x64, 0xff, 0x72, 0xff, 0x8c, 0xff, 0xb6, 0xff, 0xe8, 0xff, 0x0a, 0x00, 0x3a, 0x00,
+0x54, 0x00, 0x56, 0x00, 0x68, 0x00, 0x56, 0x00, 0x30, 0x00, 0x12, 0x00, 0xf2, 0xff, 0xd6, 0xff,
+0xaa, 0xff, 0x94, 0xff, 0x90, 0xff, 0x8e, 0xff, 0x96, 0xff, 0xb0, 0xff, 0xdc, 0xff, 0xfc, 0xff,
+0x0e, 0x00, 0x30, 0x00, 0x42, 0x00, 0x40, 0x00, 0x4a, 0x00, 0x3e, 0x00, 0x20, 0x00, 0x04, 0x00,
+0xfa, 0xff, 0xdc, 0xff, 0xc2, 0xff, 0xc8, 0xff, 0xb6, 0xff, 0xb0, 0xff, 0xb8, 0xff, 0xce, 0xff,
+0xee, 0xff, 0xf6, 0xff, 0x08, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x18, 0x00, 0x20, 0x00, 0x1e, 0x00,
+0x12, 0x00, 0xfc, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xe4, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xd4, 0xff,
+0xdc, 0xff, 0xd8, 0xff, 0xe2, 0xff, 0xe8, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0x00, 0x00,
+0xf4, 0xff, 0x06, 0x00, 0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfc, 0xff,
+0xf2, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xdc, 0xff, 0xd2, 0xff, 0xcc, 0xff, 0xcc, 0xff,
+0xd0, 0xff, 0xd6, 0xff, 0xe0, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0x06, 0x00, 0x16, 0x00, 0x20, 0x00,
+0x2a, 0x00, 0x18, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0xfc, 0xff, 0xea, 0xff, 0xd6, 0xff, 0xbc, 0xff,
+0xa8, 0xff, 0xa4, 0xff, 0x9a, 0xff, 0xb4, 0xff, 0xb8, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0x18, 0x00,
+0x2e, 0x00, 0x40, 0x00, 0x48, 0x00, 0x42, 0x00, 0x40, 0x00, 0x38, 0x00, 0x14, 0x00, 0xe8, 0xff,
+0xcc, 0xff, 0xa0, 0xff, 0x88, 0xff, 0x7e, 0xff, 0x7a, 0xff, 0x96, 0xff, 0xaa, 0xff, 0xda, 0xff,
+0xfe, 0xff, 0x2a, 0x00, 0x54, 0x00, 0x64, 0x00, 0x7e, 0x00, 0x6e, 0x00, 0x5e, 0x00, 0x3e, 0x00,
+0x08, 0x00, 0xe2, 0xff, 0xb2, 0xff, 0x7c, 0xff, 0x66, 0xff, 0x54, 0xff, 0x5c, 0xff, 0x7c, 0xff,
+0x9e, 0xff, 0xdc, 0xff, 0x10, 0x00, 0x40, 0x00, 0x64, 0x00, 0x8a, 0x00, 0x9a, 0x00, 0x94, 0x00,
+0x72, 0x00, 0x36, 0x00, 0x06, 0x00, 0xc2, 0xff, 0x90, 0xff, 0x5e, 0xff, 0x52, 0xff, 0x3c, 0xff,
+0x42, 0xff, 0x78, 0xff, 0xa2, 0xff, 0xe6, 0xff, 0x18, 0x00, 0x62, 0x00, 0x8a, 0x00, 0xa4, 0x00,
+0xb2, 0x00, 0x9a, 0x00, 0x7e, 0x00, 0x3a, 0x00, 0xf6, 0xff, 0xc0, 0xff, 0x84, 0xff, 0x4a, 0xff,
+0x30, 0xff, 0x32, 0xff, 0x4c, 0xff, 0x7e, 0xff, 0xc8, 0xff, 0xf4, 0xff, 0x2a, 0x00, 0x70, 0x00,
+0xa6, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x20, 0x00, 0xf2, 0xff, 0xae, 0xff,
+0x6c, 0xff, 0x4a, 0xff, 0x24, 0xff, 0x30, 0xff, 0x58, 0xff, 0x88, 0xff, 0xce, 0xff, 0x08, 0x00,
+0x32, 0x00, 0x72, 0x00, 0xa8, 0x00, 0xbc, 0x00, 0xaa, 0x00, 0x92, 0x00, 0x4c, 0x00, 0x12, 0x00,
+0xde, 0xff, 0x9e, 0xff, 0x6c, 0xff, 0x42, 0xff, 0x2c, 0xff, 0x38, 0xff, 0x60, 0xff, 0x96, 0xff,
+0xd0, 0xff, 0x0c, 0x00, 0x42, 0x00, 0x7c, 0x00, 0xaa, 0x00, 0xb0, 0x00, 0xa4, 0x00, 0x7e, 0x00,
+0x48, 0x00, 0x08, 0x00, 0xcc, 0xff, 0x98, 0xff, 0x6a, 0xff, 0x48, 0xff, 0x3a, 0xff, 0x46, 0xff,
+0x70, 0xff, 0xa8, 0xff, 0xe4, 0xff, 0x1a, 0x00, 0x48, 0x00, 0x74, 0x00, 0x90, 0x00, 0x9a, 0x00,
+0x88, 0x00, 0x5e, 0x00, 0x28, 0x00, 0xf4, 0xff, 0xbc, 0xff, 0x92, 0xff, 0x70, 0xff, 0x56, 0xff,
+0x5a, 0xff, 0x70, 0xff, 0x8c, 0xff, 0xc0, 0xff, 0xe8, 0xff, 0x1c, 0x00, 0x4a, 0x00, 0x6c, 0x00,
+0x76, 0x00, 0x6e, 0x00, 0x62, 0x00, 0x38, 0x00, 0x06, 0x00, 0xe8, 0xff, 0xb8, 0xff, 0x98, 0xff,
+0x88, 0xff, 0x76, 0xff, 0x7e, 0xff, 0x8c, 0xff, 0xa4, 0xff, 0xd2, 0xff, 0xfa, 0xff, 0x22, 0x00,
+0x4e, 0x00, 0x4c, 0x00, 0x48, 0x00, 0x48, 0x00, 0x38, 0x00, 0x14, 0x00, 0x02, 0x00, 0xde, 0xff,
+0xc4, 0xff, 0xa0, 0xff, 0xa6, 0xff, 0xa8, 0xff, 0x9e, 0xff, 0xb4, 0xff, 0xc4, 0xff, 0xe0, 0xff,
+0xfe, 0xff, 0x10, 0x00, 0x20, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x1e, 0x00, 0x0a, 0x00, 0x08, 0x00,
+0xfc, 0xff, 0xec, 0xff, 0xe0, 0xff, 0xd4, 0xff, 0xe0, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xe0, 0xff,
+0xe4, 0xff, 0xee, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00,
+0x06, 0x00, 0x04, 0x00, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0x04, 0x00, 0xfc, 0xff, 0xfc, 0xff,
+0x02, 0x00, 0xf0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xd4, 0xff, 0xd6, 0xff,
+0xd4, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xf8, 0xff, 0x08, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x18, 0x00,
+0x1e, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf2, 0xff, 0xce, 0xff, 0xc2, 0xff, 0xa4, 0xff,
+0xa8, 0xff, 0xb4, 0xff, 0xb2, 0xff, 0xcc, 0xff, 0xea, 0xff, 0x04, 0x00, 0x1e, 0x00, 0x38, 0x00,
+0x44, 0x00, 0x46, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x18, 0x00, 0x04, 0x00, 0xe0, 0xff, 0xbc, 0xff,
+0x9c, 0xff, 0x8c, 0xff, 0x86, 0xff, 0x92, 0xff, 0xa4, 0xff, 0xb2, 0xff, 0xe0, 0xff, 0x06, 0x00,
+0x2c, 0x00, 0x54, 0x00, 0x62, 0x00, 0x58, 0x00, 0x4e, 0x00, 0x3c, 0x00, 0x1e, 0x00, 0xf2, 0xff,
+0xcc, 0xff, 0x96, 0xff, 0x80, 0xff, 0x62, 0xff, 0x54, 0xff, 0x72, 0xff, 0x94, 0xff, 0xb6, 0xff,
+0xe4, 0xff, 0x14, 0x00, 0x50, 0x00, 0x6a, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x6e, 0x00, 0x46, 0x00,
+0x1a, 0x00, 0xee, 0xff, 0xbc, 0xff, 0x8a, 0xff, 0x60, 0xff, 0x48, 0xff, 0x46, 0xff, 0x5c, 0xff,
+0x96, 0xff, 0xb6, 0xff, 0xf6, 0xff, 0x30, 0x00, 0x60, 0x00, 0x94, 0x00, 0xa2, 0x00, 0xa2, 0x00,
+0x82, 0x00, 0x56, 0x00, 0x12, 0x00, 0xec, 0xff, 0xb2, 0xff, 0x6a, 0xff, 0x3e, 0xff, 0x30, 0xff,
+0x30, 0xff, 0x54, 0xff, 0x86, 0xff, 0xc2, 0xff, 0xf8, 0xff, 0x3e, 0x00, 0x82, 0x00, 0xa0, 0x00,
+0xbe, 0x00, 0xae, 0x00, 0x8e, 0x00, 0x52, 0x00, 0x0c, 0x00, 0xe6, 0xff, 0xa2, 0xff, 0x66, 0xff,
+0x3e, 0xff, 0x22, 0xff, 0x3e, 0xff, 0x5c, 0xff, 0x98, 0xff, 0xd8, 0xff, 0x0e, 0x00, 0x56, 0x00,
+0x88, 0x00, 0xb4, 0x00, 0xc2, 0x00, 0xac, 0x00, 0x8a, 0x00, 0x46, 0x00, 0xfc, 0xff, 0xd2, 0xff,
+0x8e, 0xff, 0x54, 0xff, 0x30, 0xff, 0x30, 0xff, 0x3a, 0xff, 0x64, 0xff, 0xa2, 0xff, 0xe0, 0xff,
+0x16, 0x00, 0x56, 0x00, 0x8c, 0x00, 0xb0, 0x00, 0xb6, 0x00, 0x9a, 0x00, 0x62, 0x00, 0x24, 0x00,
+0xf6, 0xff, 0xba, 0xff, 0x7e, 0xff, 0x4a, 0xff, 0x32, 0xff, 0x38, 0xff, 0x58, 0xff, 0x82, 0xff,
+0xc8, 0xff, 0xf8, 0xff, 0x30, 0x00, 0x68, 0x00, 0x8e, 0x00, 0xaa, 0x00, 0x9c, 0x00, 0x86, 0x00,
+0x50, 0x00, 0x1a, 0x00, 0xf2, 0xff, 0xb0, 0xff, 0x7a, 0xff, 0x5a, 0xff, 0x44, 0xff, 0x58, 0xff,
+0x76, 0xff, 0xa0, 0xff, 0xe0, 0xff, 0x08, 0x00, 0x32, 0x00, 0x56, 0x00, 0x78, 0x00, 0x7e, 0x00,
+0x7a, 0x00, 0x60, 0x00, 0x34, 0x00, 0x04, 0x00, 0xdc, 0xff, 0xa2, 0xff, 0x7e, 0xff, 0x66, 0xff,
+0x64, 0xff, 0x72, 0xff, 0x7a, 0xff, 0xac, 0xff, 0xe0, 0xff, 0x00, 0x00, 0x22, 0x00, 0x42, 0x00,
+0x4e, 0x00, 0x56, 0x00, 0x4a, 0x00, 0x36, 0x00, 0x18, 0x00, 0xfe, 0xff, 0xe2, 0xff, 0xb4, 0xff,
+0xa2, 0xff, 0x8e, 0xff, 0x96, 0xff, 0x96, 0xff, 0xa8, 0xff, 0xce, 0xff, 0xf4, 0xff, 0x06, 0x00,
+0x1a, 0x00, 0x2e, 0x00, 0x2a, 0x00, 0x3a, 0x00, 0x32, 0x00, 0x26, 0x00, 0x08, 0x00, 0xfa, 0xff,
+0xea, 0xff, 0xce, 0xff, 0xbc, 0xff, 0xc0, 0xff, 0xb2, 0xff, 0xb6, 0xff, 0xca, 0xff, 0xd8, 0xff,
+0xf4, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x0a, 0x00, 0x12, 0x00, 0x10, 0x00, 0x16, 0x00, 0x0a, 0x00,
+0x04, 0x00, 0xfa, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xda, 0xff, 0xe4, 0xff, 0xdc, 0xff,
+0xde, 0xff, 0xe6, 0xff, 0xdc, 0xff, 0xde, 0xff, 0xe8, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xf8, 0xff,
+0xf2, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x12, 0x00, 0x0c, 0x00,
+0x12, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xdc, 0xff, 0xc4, 0xff, 0xc8, 0xff, 0xcc, 0xff,
+0xd0, 0xff, 0xca, 0xff, 0xda, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0x14, 0x00, 0x20, 0x00, 0x30, 0x00,
+0x2a, 0x00, 0x28, 0x00, 0x26, 0x00, 0x0a, 0x00, 0xfc, 0xff, 0xdc, 0xff, 0xc0, 0xff, 0xac, 0xff,
+0xa6, 0xff, 0xa8, 0xff, 0xb0, 0xff, 0xba, 0xff, 0xd0, 0xff, 0xee, 0xff, 0xfc, 0xff, 0x28, 0x00,
+0x40, 0x00, 0x56, 0x00, 0x54, 0x00, 0x48, 0x00, 0x3a, 0x00, 0x16, 0x00, 0xfc, 0xff, 0xc4, 0xff,
+0xa6, 0xff, 0x8e, 0xff, 0x7e, 0xff, 0x84, 0xff, 0x98, 0xff, 0xa6, 0xff, 0xc4, 0xff, 0xea, 0xff,
+0x0c, 0x00, 0x48, 0x00, 0x5e, 0x00, 0x6c, 0x00, 0x72, 0x00, 0x5c, 0x00, 0x3c, 0x00, 0x10, 0x00,
+0xe8, 0xff, 0xa8, 0xff, 0x74, 0xff, 0x5c, 0xff, 0x56, 0xff, 0x4e, 0xff, 0x60, 0xff, 0x8a, 0xff,
+0xb8, 0xff, 0xea, 0xff, 0x1c, 0x00, 0x52, 0x00, 0x78, 0x00, 0x8e, 0x00, 0x88, 0x00, 0x68, 0x00,
+0x40, 0x00, 0x0e, 0x00, 0xd6, 0xff, 0xa0, 0xff, 0x6a, 0xff, 0x48, 0xff, 0x3c, 0xff, 0x42, 0xff,
+0x60, 0xff, 0x9a, 0xff, 0xc8, 0xff, 0xfa, 0xff, 0x3c, 0x00, 0x78, 0x00, 0x98, 0x00, 0xae, 0x00,
+0x9e, 0x00, 0x80, 0x00, 0x40, 0x00, 0x12, 0x00, 0xd0, 0xff, 0x8e, 0xff, 0x62, 0xff, 0x32, 0xff,
+0x28, 0xff, 0x32, 0xff, 0x56, 0xff, 0xa2, 0xff, 0xd6, 0xff, 0x10, 0x00, 0x5c, 0x00, 0x8a, 0x00,
+0xb2, 0x00, 0xb6, 0x00, 0xa8, 0x00, 0x6c, 0x00, 0x24, 0x00, 0xf0, 0xff, 0xbc, 0xff, 0x80, 0xff,
+0x48, 0xff, 0x28, 0xff, 0x2a, 0xff, 0x46, 0xff, 0x7a, 0xff, 0xcc, 0xff, 0xfa, 0xff, 0x28, 0x00,
+0x6e, 0x00, 0xb0, 0x00, 0xca, 0x00, 0xb8, 0x00, 0x9a, 0x00, 0x60, 0x00, 0x1e, 0x00, 0xe0, 0xff,
+0xb0, 0xff, 0x74, 0xff, 0x46, 0xff, 0x36, 0xff, 0x3c, 0xff, 0x64, 0xff, 0x9e, 0xff, 0xd6, 0xff,
+0x20, 0x00, 0x4e, 0x00, 0x86, 0x00, 0xa0, 0x00, 0xbc, 0x00, 0xae, 0x00, 0x74, 0x00, 0x48, 0x00,
+0x06, 0x00, 0xce, 0xff, 0x96, 0xff, 0x6c, 0xff, 0x44, 0xff, 0x3e, 0xff, 0x4a, 0xff, 0x70, 0xff,
+0xae, 0xff, 0xe2, 0xff, 0x18, 0x00, 0x48, 0x00, 0x84, 0x00, 0x90, 0x00, 0xa6, 0x00, 0x82, 0x00,
+0x62, 0x00, 0x34, 0x00, 0xfa, 0xff, 0xd4, 0xff, 0x90, 0xff, 0x76, 0xff, 0x60, 0xff, 0x58, 0xff,
+0x68, 0xff, 0x8a, 0xff, 0xc0, 0xff, 0xf4, 0xff, 0x1e, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x80, 0x00,
+0x7c, 0x00, 0x64, 0x00, 0x54, 0x00, 0x1e, 0x00, 0xec, 0xff, 0xc2, 0xff, 0x9a, 0xff, 0x8c, 0xff,
+0x7c, 0xff, 0x74, 0xff, 0x7c, 0xff, 0xa0, 0xff, 0xce, 0xff, 0xf2, 0xff, 0x1c, 0x00, 0x3e, 0x00,
+0x3e, 0x00, 0x50, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x1e, 0x00, 0x06, 0x00, 0xe6, 0xff, 0xc2, 0xff,
+0xa0, 0xff, 0x94, 0xff, 0x96, 0xff, 0x94, 0xff, 0xa0, 0xff, 0xbe, 0xff, 0xda, 0xff, 0xf6, 0xff,
+0x0c, 0x00, 0x28, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x22, 0x00, 0x10, 0x00, 0xfe, 0xff,
+0xe8, 0xff, 0xd6, 0xff, 0xc8, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xb6, 0xff, 0xcc, 0xff, 0xda, 0xff,
+0xec, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf8, 0xff,
+0xfc, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xe8, 0xff, 0xee, 0xff, 0xea, 0xff, 0xe6, 0xff, 0xe8, 0xff,
+0xee, 0xff, 0xe8, 0xff, 0xdc, 0xff, 0xde, 0xff, 0xd6, 0xff, 0xde, 0xff, 0xe2, 0xff, 0xda, 0xff,
+0xe0, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0x02, 0x00, 0x12, 0x00, 0x14, 0x00, 0x20, 0x00, 0x12, 0x00,
+0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xe4, 0xff, 0xd4, 0xff, 0xbc, 0xff, 0xbc, 0xff,
+0xc6, 0xff, 0xd6, 0xff, 0xce, 0xff, 0xf4, 0xff, 0x00, 0x00, 0x18, 0x00, 0x36, 0x00, 0x3c, 0x00,
+0x46, 0x00, 0x3c, 0x00, 0x28, 0x00, 0x22, 0x00, 0xfc, 0xff, 0xe4, 0xff, 0xc8, 0xff, 0x98, 0xff,
+0x9a, 0xff, 0x92, 0xff, 0x88, 0xff, 0xa0, 0xff, 0xba, 0xff, 0xee, 0xff, 0x08, 0x00, 0x2a, 0x00,
+0x58, 0x00, 0x5a, 0x00, 0x6c, 0x00, 0x60, 0x00, 0x42, 0x00, 0x34, 0x00, 0x02, 0x00, 0xda, 0xff,
+0xac, 0xff, 0x7c, 0xff, 0x6c, 0xff, 0x62, 0xff, 0x74, 0xff, 0x94, 0xff, 0xba, 0xff, 0xe6, 0xff,
+0x14, 0x00, 0x4c, 0x00, 0x78, 0x00, 0x88, 0x00, 0x84, 0x00, 0x7a, 0x00, 0x5c, 0x00, 0x28, 0x00,
+0x00, 0x00, 0xcc, 0xff, 0x96, 0xff, 0x58, 0xff, 0x42, 0xff, 0x44, 0xff, 0x52, 0xff, 0x7e, 0xff,
+0xb2, 0xff, 0xe8, 0xff, 0x20, 0x00, 0x50, 0x00, 0x78, 0x00, 0x94, 0x00, 0x94, 0x00, 0x86, 0x00,
+0x52, 0x00, 0x14, 0x00, 0xdc, 0xff, 0xa0, 0xff, 0x70, 0xff, 0x4e, 0xff, 0x62, 0xff, 0x8a, 0xff,
+0xc4, 0xff, 0xfe, 0xff, 0x38, 0x00, 0x76, 0x00, 0x9a, 0x00, 0xa6, 0x00, 0xa8, 0x00, 0x8c, 0x00,
+0x52, 0x00, 0x0c, 0x00, 0xd4, 0xff, 0x9a, 0xff, 0x60, 0xff, 0x2a, 0xff, 0x1e, 0xff, 0x36, 0xff,
+0x62, 0xff, 0x9c, 0xff, 0xda, 0xff, 0x0c, 0x00, 0x48, 0x00, 0x86, 0x00, 0xa0, 0x00, 0xb8, 0x00,
+0xa8, 0x00, 0x74, 0x00, 0x38, 0x00, 0xf6, 0xff, 0xc2, 0xff, 0x86, 0xff, 0x52, 0xff, 0x28, 0xff,
+0x26, 0xff, 0x3e, 0xff, 0x68, 0xff, 0xa0, 0xff, 0xe6, 0xff, 0x14, 0x00, 0x4e, 0x00, 0x80, 0x00,
+0xa2, 0x00, 0xb6, 0x00, 0x94, 0x00, 0x6c, 0x00, 0x2a, 0x00, 0xf2, 0xff, 0xb8, 0xff, 0x7a, 0xff,
+0x5c, 0xff, 0x48, 0xff, 0x46, 0xff, 0x62, 0xff, 0x82, 0xff, 0xb4, 0xff, 0xf4, 0xff, 0x26, 0x00,
+0x5a, 0x00, 0x84, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x8c, 0x00, 0x60, 0x00, 0x20, 0x00, 0xf4, 0xff,
+0xbe, 0xff, 0x8c, 0xff, 0x62, 0xff, 0x44, 0xff, 0x54, 0xff, 0x6e, 0xff, 0x8e, 0xff, 0xc2, 0xff,
+0xf6, 0xff, 0x26, 0x00, 0x52, 0x00, 0x78, 0x00, 0x82, 0x00, 0x7a, 0x00, 0x6e, 0x00, 0x40, 0x00,
+0x0e, 0x00, 0xe2, 0xff, 0xb2, 0xff, 0x8c, 0xff, 0x7c, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x82, 0xff,
+0x9e, 0xff, 0xda, 0xff, 0x06, 0x00, 0x2e, 0x00, 0x4c, 0x00, 0x66, 0x00, 0x60, 0x00, 0x56, 0x00,
+0x50, 0x00, 0x24, 0x00, 0x06, 0x00, 0xec, 0xff, 0xc2, 0xff, 0xa6, 0xff, 0xa4, 0xff, 0x98, 0xff,
+0xa4, 0xff, 0xaa, 0xff, 0xc0, 0xff, 0xea, 0xff, 0xfe, 0xff, 0x14, 0x00, 0x28, 0x00, 0x3a, 0x00,
+0x40, 0x00, 0x38, 0x00, 0x1a, 0x00, 0x08, 0x00, 0xfe, 0xff, 0xe4, 0xff, 0xcc, 0xff, 0xba, 0xff,
+0xb4, 0xff, 0xbc, 0xff, 0xac, 0xff, 0xc6, 0xff, 0xe0, 0xff, 0xee, 0xff, 0xf6, 0xff, 0xfe, 0xff,
+0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x06, 0x00, 0x06, 0x00, 0xfc, 0xff, 0xf2, 0xff, 0xf0, 0xff,
+0xe8, 0xff, 0xd6, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd0, 0xff, 0xea, 0xff,
+0xf2, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xf0, 0xff,
+0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x02, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xf6, 0xff, 0xe6, 0xff,
+0xe6, 0xff, 0xd2, 0xff, 0xc6, 0xff, 0xc4, 0xff, 0xcc, 0xff, 0xd4, 0xff, 0xd2, 0xff, 0xe0, 0xff,
+0xf0, 0xff, 0x06, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x3a, 0x00, 0x22, 0x00, 0x1a, 0x00, 0x16, 0x00,
+0x02, 0x00, 0xf4, 0xff, 0xd4, 0xff, 0xb0, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xa2, 0xff, 0xa0, 0xff,
+0xb4, 0xff, 0xd2, 0xff, 0xfc, 0xff, 0x14, 0x00, 0x3c, 0x00, 0x60, 0x00, 0x5c, 0x00, 0x6a, 0x00,
+0x4c, 0x00, 0x30, 0x00, 0x10, 0x00, 0xe8, 0xff, 0xca, 0xff, 0x9e, 0xff, 0x8a, 0xff, 0x82, 0xff,
+0x7a, 0xff, 0x90, 0xff, 0xac, 0xff, 0xd0, 0xff, 0x06, 0x00, 0x2a, 0x00, 0x5a, 0x00, 0x78, 0x00,
+0x82, 0x00, 0x7e, 0x00, 0x60, 0x00, 0x30, 0x00, 0x04, 0x00, 0xde, 0xff, 0xa4, 0xff, 0x6c, 0xff,
+0x5a, 0xff, 0x50, 0xff, 0x54, 0xff, 0x74, 0xff, 0x9c, 0xff, 0xd6, 0xff, 0x14, 0x00, 0x46, 0x00,
+0x6e, 0x00, 0x90, 0x00, 0x96, 0x00, 0x8a, 0x00, 0x60, 0x00, 0x30, 0x00, 0x06, 0x00, 0xca, 0xff,
+0x94, 0xff, 0x66, 0xff, 0x42, 0xff, 0x3a, 0xff, 0x48, 0xff, 0x68, 0xff, 0xa8, 0xff, 0xec, 0xff,
+0x20, 0x00, 0x5e, 0x00, 0x92, 0x00, 0xa4, 0x00, 0xa8, 0x00, 0x90, 0x00, 0x62, 0x00, 0x2e, 0x00,
+0xee, 0xff, 0xba, 0xff, 0x7e, 0xff, 0x4a, 0xff, 0x2e, 0xff, 0x22, 0xff, 0x44, 0xff, 0x70, 0xff,
+0xa8, 0xff, 0xee, 0xff, 0x20, 0x00, 0x5c, 0x00, 0x92, 0x00, 0xac, 0x00, 0xa4, 0x00, 0x90, 0x00,
+0x62, 0x00, 0x2a, 0x00, 0xe8, 0xff, 0xb0, 0xff, 0x66, 0xff, 0x38, 0xff, 0x28, 0xff, 0x22, 0xff,
+0x44, 0xff, 0x74, 0xff, 0xc2, 0xff, 0x00, 0x00, 0x36, 0x00, 0x74, 0x00, 0x98, 0x00, 0xac, 0x00,
+0xaa, 0x00, 0x92, 0x00, 0x5a, 0x00, 0x1c, 0x00, 0xe8, 0xff, 0xa6, 0xff, 0x72, 0xff, 0x46, 0xff,
+0x2c, 0xff, 0x40, 0xff, 0x5a, 0xff, 0x8c, 0xff, 0xd4, 0xff, 0x0e, 0x00, 0x38, 0x00, 0x70, 0x00,
+0x92, 0x00, 0xa0, 0x00, 0x96, 0x00, 0x74, 0x00, 0x3c, 0x00, 0x04, 0x00, 0xc8, 0xff, 0x8a, 0xff,
+0x6a, 0xff, 0x50, 0xff, 0x42, 0xff, 0x4c, 0xff, 0x76, 0xff, 0xa8, 0xff, 0xdc, 0xff, 0x0a, 0x00,
+0x3e, 0x00, 0x74, 0x00, 0x86, 0x00, 0x8e, 0x00, 0x80, 0x00, 0x5e, 0x00, 0x32, 0x00, 0xf4, 0xff,
+0xc2, 0xff, 0x9e, 0xff, 0x76, 0xff, 0x64, 0xff, 0x66, 0xff, 0x6c, 0xff, 0x8e, 0xff, 0xbe, 0xff,
+0xf6, 0xff, 0x2a, 0x00, 0x50, 0x00, 0x5c, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x5c, 0x00, 0x46, 0x00,
+0x14, 0x00, 0xec, 0xff, 0xc6, 0xff, 0xa0, 0xff, 0x90, 0xff, 0x78, 0xff, 0x74, 0xff, 0x88, 0xff,
+0xa6, 0xff, 0xd2, 0xff, 0xf6, 0xff, 0x12, 0x00, 0x32, 0x00, 0x3e, 0x00, 0x48, 0x00, 0x3c, 0x00,
+0x3a, 0x00, 0x26, 0x00, 0xfa, 0xff, 0xe0, 0xff, 0xc2, 0xff, 0xae, 0xff, 0xaa, 0xff, 0xa0, 0xff,
+0xaa, 0xff, 0xae, 0xff, 0xbe, 0xff, 0xe8, 0xff, 0xf8, 0xff, 0x04, 0x00, 0x0e, 0x00, 0x24, 0x00,
+0x20, 0x00, 0x24, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x08, 0x00, 0xec, 0xff, 0xe8, 0xff, 0xcc, 0xff,
+0xca, 0xff, 0xdc, 0xff, 0xc8, 0xff, 0xce, 0xff, 0xdc, 0xff, 0xe2, 0xff, 0xe8, 0xff, 0xf6, 0xff,
+0xf2, 0xff, 0xe8, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xfe, 0xff,
+0xfa, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xdc, 0xff,
+0xd0, 0xff, 0xd0, 0xff, 0xc2, 0xff, 0xca, 0xff, 0xca, 0xff, 0xca, 0xff, 0xe4, 0xff, 0xf6, 0xff,
+0x0e, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x26, 0x00, 0x1a, 0x00, 0x2a, 0x00, 0x1e, 0x00, 0x04, 0x00,
+0xf0, 0xff, 0xd0, 0xff, 0xbc, 0xff, 0xa2, 0xff, 0xa6, 0xff, 0xa2, 0xff, 0xb2, 0xff, 0xc0, 0xff,
+0xe4, 0xff, 0x04, 0x00, 0x10, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x3e, 0x00, 0x4c, 0x00, 0x3a, 0x00,
+0x26, 0x00, 0x08, 0x00, 0xda, 0xff, 0xb6, 0xff, 0x98, 0xff, 0x88, 0xff, 0x7c, 0xff, 0x86, 0xff,
+0x9c, 0xff, 0xb2, 0xff, 0xe0, 0xff, 0x08, 0x00, 0x2a, 0x00, 0x4c, 0x00, 0x6a, 0x00, 0x76, 0x00,
+0x72, 0x00, 0x50, 0x00, 0x2e, 0x00, 0xfc, 0xff, 0xde, 0xff, 0xa8, 0xff, 0x82, 0xff, 0x80, 0xff,
+0x68, 0xff, 0x72, 0xff, 0x8e, 0xff, 0xb6, 0xff, 0xf0, 0xff, 0x1c, 0x00, 0x4e, 0x00, 0x6a, 0x00,
+0x90, 0x00, 0x9a, 0x00, 0x8e, 0x00, 0x6a, 0x00, 0x2c, 0x00, 0x12, 0x00, 0xce, 0xff, 0x98, 0xff,
+0x66, 0xff, 0x4e, 0xff, 0x42, 0xff, 0x56, 0xff, 0x86, 0xff, 0xb8, 0xff, 0xf8, 0xff, 0x26, 0x00,
+0x56, 0x00, 0x86, 0x00, 0xa0, 0x00, 0xb0, 0x00, 0x9c, 0x00, 0x66, 0x00, 0x28, 0x00, 0xf0, 0xff,
+0xbc, 0xff, 0x7a, 0xff, 0x4e, 0xff, 0x3c, 0xff, 0x32, 0xff, 0x58, 0xff, 0x8a, 0xff, 0xc0, 0xff,
+0xfa, 0xff, 0x36, 0x00, 0x80, 0x00, 0xa0, 0x00, 0xc0, 0x00, 0xc2, 0x00, 0x90, 0x00, 0x60, 0x00,
+0x14, 0x00, 0xec, 0xff, 0xa8, 0xff, 0x6a, 0xff, 0x4e, 0xff, 0x2a, 0xff, 0x34, 0xff, 0x4a, 0xff,
+0x7a, 0xff, 0xd2, 0xff, 0xfe, 0xff, 0x38, 0x00, 0x7c, 0x00, 0xae, 0x00, 0xb6, 0x00, 0xaa, 0x00,
+0x8a, 0x00, 0x48, 0x00, 0x06, 0x00, 0xd2, 0xff, 0x8e, 0xff, 0x4a, 0xff, 0x32, 0xff, 0x1a, 0xff,
+0x2c, 0xff, 0x50, 0xff, 0x8e, 0xff, 0xda, 0xff, 0x18, 0x00, 0x4c, 0x00, 0x8c, 0x00, 0xae, 0x00,
+0xb0, 0x00, 0x98, 0x00, 0x74, 0x00, 0x3a, 0x00, 0xfa, 0xff, 0xc6, 0xff, 0x86, 0xff, 0x5c, 0xff,
+0x32, 0xff, 0x3c, 0xff, 0x4c, 0xff, 0x70, 0xff, 0xae, 0xff, 0xea, 0xff, 0x2a, 0x00, 0x60, 0x00,
+0x86, 0x00, 0x94, 0x00, 0x94, 0x00, 0x7e, 0x00, 0x58, 0x00, 0x2e, 0x00, 0xf2, 0xff, 0xbe, 0xff,
+0x8c, 0xff, 0x6e, 0xff, 0x4c, 0xff, 0x52, 0xff, 0x74, 0xff, 0x88, 0xff, 0xc6, 0xff, 0xfa, 0xff,
+0x28, 0x00, 0x4e, 0x00, 0x6e, 0x00, 0x80, 0x00, 0x76, 0x00, 0x5a, 0x00, 0x3c, 0x00, 0x1a, 0x00,
+0xf8, 0xff, 0xbc, 0xff, 0x9a, 0xff, 0x90, 0xff, 0x80, 0xff, 0x86, 0xff, 0x96, 0xff, 0xb6, 0xff,
+0xe4, 0xff, 0x08, 0x00, 0x2a, 0x00, 0x4e, 0x00, 0x5c, 0x00, 0x64, 0x00, 0x5c, 0x00, 0x48, 0x00,
+0x28, 0x00, 0x12, 0x00, 0xec, 0xff, 0xc6, 0xff, 0xb0, 0xff, 0x9e, 0xff, 0x9c, 0xff, 0x9c, 0xff,
+0xae, 0xff, 0xce, 0xff, 0xf4, 0xff, 0x04, 0x00, 0x26, 0x00, 0x3a, 0x00, 0x2e, 0x00, 0x38, 0x00,
+0x3e, 0x00, 0x30, 0x00, 0x10, 0x00, 0xfa, 0xff, 0xe8, 0xff, 0xd0, 0xff, 0xbc, 0xff, 0xba, 0xff,
+0xc2, 0xff, 0xba, 0xff, 0xcc, 0xff, 0xdc, 0xff, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x1c, 0x00,
+0x16, 0x00, 0x20, 0x00, 0x18, 0x00, 0x16, 0x00, 0x12, 0x00, 0xfc, 0xff, 0xf4, 0xff, 0xf2, 0xff,
+0xde, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0xec, 0xff,
+0xf6, 0xff, 0xe8, 0xff, 0xe6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0x04, 0x00,
+0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x02, 0x00, 0xee, 0xff, 0xe8, 0xff, 0xe4, 0xff,
+0xd0, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb6, 0xff, 0xb8, 0xff, 0xc2, 0xff, 0xd6, 0xff, 0xf0, 0xff,
+0xf6, 0xff, 0x04, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x22, 0x00, 0x06, 0x00,
+0xe8, 0xff, 0xd2, 0xff, 0xb4, 0xff, 0xa2, 0xff, 0x94, 0xff, 0x8e, 0xff, 0x9c, 0xff, 0xa6, 0xff,
+0xbe, 0xff, 0xf0, 0xff, 0x0a, 0x00, 0x32, 0x00, 0x52, 0x00, 0x52, 0x00, 0x5e, 0x00, 0x40, 0x00,
+0x36, 0x00, 0x14, 0x00, 0xf2, 0xff, 0xd0, 0xff, 0xa2, 0xff, 0x7c, 0xff, 0x6a, 0xff, 0x62, 0xff,
+0x78, 0xff, 0x92, 0xff, 0xb2, 0xff, 0xf6, 0xff, 0x14, 0x00, 0x50, 0x00, 0x66, 0x00, 0x72, 0x00,
+0x80, 0x00, 0x66, 0x00, 0x52, 0x00, 0x1e, 0x00, 0xfc, 0xff, 0xb6, 0xff, 0x7a, 0xff, 0x6a, 0xff,
+0x48, 0xff, 0x4e, 0xff, 0x6c, 0xff, 0x90, 0xff, 0xc0, 0xff, 0xfa, 0xff, 0x32, 0x00, 0x6c, 0x00,
+0x8a, 0x00, 0xac, 0x00, 0xa2, 0x00, 0x84, 0x00, 0x5a, 0x00, 0x22, 0x00, 0xec, 0xff, 0xb6, 0xff,
+0x78, 0xff, 0x4a, 0xff, 0x3a, 0xff, 0x36, 0xff, 0x56, 0xff, 0x92, 0xff, 0xcc, 0xff, 0x04, 0x00,
+0x44, 0x00, 0x7c, 0x00, 0xa2, 0x00, 0xb2, 0x00, 0xaa, 0x00, 0x86, 0x00, 0x50, 0x00, 0x16, 0x00,
+0xe2, 0xff, 0x9c, 0xff, 0x54, 0xff, 0x32, 0xff, 0x1a, 0xff, 0x38, 0xff, 0x58, 0xff, 0x96, 0xff,
+0xe2, 0xff, 0x16, 0x00, 0x52, 0x00, 0x8e, 0x00, 0xb2, 0x00, 0xb8, 0x00, 0xac, 0x00, 0x80, 0x00,
+0x42, 0x00, 0x02, 0x00, 0xce, 0xff, 0x7e, 0xff, 0x4e, 0xff, 0x1e, 0xff, 0x16, 0xff, 0x3e, 0xff,
+0x68, 0xff, 0xb0, 0xff, 0xf2, 0xff, 0x22, 0x00, 0x64, 0x00, 0x8e, 0x00, 0xae, 0x00, 0xb4, 0x00,
+0x96, 0x00, 0x6e, 0x00, 0x2a, 0x00, 0xe6, 0xff, 0xb4, 0xff, 0x6a, 0xff, 0x36, 0xff, 0x28, 0xff,
+0x2e, 0xff, 0x4e, 0xff, 0x80, 0xff, 0xbc, 0xff, 0xf4, 0xff, 0x24, 0x00, 0x58, 0x00, 0x84, 0x00,
+0x98, 0x00, 0x9c, 0x00, 0x7e, 0x00, 0x42, 0x00, 0x18, 0x00, 0xd0, 0xff, 0x9c, 0xff, 0x72, 0xff,
+0x4c, 0xff, 0x44, 0xff, 0x48, 0xff, 0x74, 0xff, 0x90, 0xff, 0xc8, 0xff, 0xfc, 0xff, 0x2c, 0x00,
+0x66, 0x00, 0x74, 0x00, 0x88, 0x00, 0x74, 0x00, 0x56, 0x00, 0x3a, 0x00, 0x06, 0x00, 0xd6, 0xff,
+0xa4, 0xff, 0x7e, 0xff, 0x6c, 0xff, 0x66, 0xff, 0x72, 0xff, 0x8a, 0xff, 0xb8, 0xff, 0xe2, 0xff,
+0x04, 0x00, 0x38, 0x00, 0x46, 0x00, 0x5a, 0x00, 0x5e, 0x00, 0x50, 0x00, 0x48, 0x00, 0x16, 0x00,
+0xec, 0xff, 0xd2, 0xff, 0xa8, 0xff, 0x9a, 0xff, 0x96, 0xff, 0x8a, 0xff, 0x9e, 0xff, 0xb6, 0xff,
+0xd4, 0xff, 0xee, 0xff, 0x0a, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x44, 0x00, 0x40, 0x00, 0x34, 0x00,
+0x22, 0x00, 0x0c, 0x00, 0xec, 0xff, 0xde, 0xff, 0xca, 0xff, 0xc2, 0xff, 0xb8, 0xff, 0xc0, 0xff,
+0xc2, 0xff, 0xd0, 0xff, 0xe6, 0xff, 0xfc, 0xff, 0x04, 0x00, 0x14, 0x00, 0x26, 0x00, 0x20, 0x00,
+0x24, 0x00, 0x1e, 0x00, 0x08, 0x00, 0x02, 0x00, 0xf6, 0xff, 0xea, 0xff, 0xda, 0xff, 0xd8, 0xff,
+0xe6, 0xff, 0xe0, 0xff, 0xda, 0xff, 0xe0, 0xff, 0xe4, 0xff, 0xee, 0xff, 0xf2, 0xff, 0xf6, 0xff,
+0xf4, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00,
+0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0xee, 0xff, 0xf0, 0xff, 0xde, 0xff, 0xdc, 0xff,
+0xe2, 0xff, 0xd6, 0xff, 0xd8, 0xff, 0xd4, 0xff, 0xda, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0x02, 0x00,
+0x10, 0x00, 0x1a, 0x00, 0x22, 0x00, 0x22, 0x00, 0x16, 0x00, 0x0e, 0x00, 0xfa, 0xff, 0xf0, 0xff,
+0xda, 0xff, 0xbc, 0xff, 0xb4, 0xff, 0xa4, 0xff, 0xb0, 0xff, 0xb4, 0xff, 0xbc, 0xff, 0xd4, 0xff,
+0xe2, 0xff, 0x06, 0x00, 0x26, 0x00, 0x32, 0x00, 0x34, 0x00, 0x34, 0x00, 0x22, 0x00, 0x26, 0x00,
+0x00, 0x00, 0xdc, 0xff, 0xc4, 0xff, 0x90, 0xff, 0x94, 0xff, 0x86, 0xff, 0x80, 0xff, 0x9a, 0xff,
+0x9e, 0xff, 0xd4, 0xff, 0xfc, 0xff, 0x18, 0x00, 0x4e, 0x00, 0x5c, 0x00, 0x70, 0x00, 0x5c, 0x00,
+0x48, 0x00, 0x2e, 0x00, 0x06, 0x00, 0xdc, 0xff, 0xa6, 0xff, 0x84, 0xff, 0x66, 0xff, 0x58, 0xff,
+0x64, 0xff, 0x7c, 0xff, 0xac, 0xff, 0xd8, 0xff, 0x06, 0x00, 0x46, 0x00, 0x68, 0x00, 0x88, 0x00,
+0x8c, 0x00, 0x86, 0x00, 0x50, 0x00, 0x34, 0x00, 0xfa, 0xff, 0xc0, 0xff, 0x92, 0xff, 0x5a, 0xff,
+0x44, 0xff, 0x3a, 0xff, 0x48, 0xff, 0x78, 0xff, 0xac, 0xff, 0xea, 0xff, 0x26, 0x00, 0x56, 0x00,
+0x98, 0x00, 0xaa, 0x00, 0xae, 0x00, 0x94, 0x00, 0x68, 0x00, 0x28, 0x00, 0xf2, 0xff, 0xbe, 0xff,
+0x86, 0xff, 0x58, 0xff, 0x38, 0xff, 0x34, 0xff, 0x4c, 0xff, 0x8c, 0xff, 0xca, 0xff, 0x06, 0x00,
+0x3e, 0x00, 0x76, 0x00, 0xa6, 0x00, 0xb8, 0x00, 0xc0, 0x00, 0x98, 0x00, 0x66, 0x00, 0x18, 0x00,
+0xe0, 0xff, 0xb8, 0xff, 0x72, 0xff, 0x4c, 0xff, 0x2a, 0xff, 0x28, 0xff, 0x5c, 0xff, 0x86, 0xff,
+0xd4, 0xff, 0x02, 0x00, 0x38, 0x00, 0x88, 0x00, 0x9a, 0x00, 0xbc, 0x00, 0xaa, 0x00, 0x90, 0x00,
+0x4e, 0x00, 0x0a, 0x00, 0xe2, 0xff, 0xa0, 0xff, 0x7a, 0xff, 0x40, 0xff, 0x32, 0xff, 0x3c, 0xff,
+0x5e, 0xff, 0xac, 0xff, 0xe4, 0xff, 0x22, 0x00, 0x54, 0x00, 0x82, 0x00, 0xb2, 0x00, 0xb2, 0x00,
+0x98, 0x00, 0x78, 0x00, 0x3e, 0x00, 0x0c, 0x00, 0xd2, 0xff, 0x9c, 0xff, 0x64, 0xff, 0x40, 0xff,
+0x4c, 0xff, 0x5c, 0xff, 0x82, 0xff, 0xb2, 0xff, 0xf2, 0xff, 0x22, 0x00, 0x56, 0x00, 0x82, 0x00,
+0x8e, 0x00, 0x8e, 0x00, 0x84, 0x00, 0x58, 0x00, 0x20, 0x00, 0xf0, 0xff, 0xb6, 0xff, 0x8c, 0xff,
+0x66, 0xff, 0x5a, 0xff, 0x4e, 0xff, 0x60, 0xff, 0x92, 0xff, 0xcc, 0xff, 0xee, 0xff, 0x20, 0x00,
+0x52, 0x00, 0x62, 0x00, 0x74, 0x00, 0x72, 0x00, 0x5a, 0x00, 0x40, 0x00, 0x12, 0x00, 0xee, 0xff,
+0xc8, 0xff, 0x92, 0xff, 0x86, 0xff, 0x78, 0xff, 0x7c, 0xff, 0x9a, 0xff, 0xae, 0xff, 0xe4, 0xff,
+0x02, 0x00, 0x1e, 0x00, 0x42, 0x00, 0x44, 0x00, 0x5e, 0x00, 0x52, 0x00, 0x40, 0x00, 0x32, 0x00,
+0xfc, 0xff, 0xe4, 0xff, 0xc6, 0xff, 0xac, 0xff, 0xa0, 0xff, 0x96, 0xff, 0xa0, 0xff, 0xaa, 0xff,
+0xc8, 0xff, 0xe6, 0xff, 0x00, 0x00, 0x10, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2a, 0x00, 0x2e, 0x00,
+0x26, 0x00, 0x0a, 0x00, 0xf6, 0xff, 0xf2, 0xff, 0xd2, 0xff, 0xc8, 0xff, 0xc6, 0xff, 0xc0, 0xff,
+0xca, 0xff, 0xd2, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0x02, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x14, 0x00,
+0x12, 0x00, 0x24, 0x00, 0x16, 0x00, 0x0c, 0x00, 0xfc, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf4, 0xff,
+0xe6, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xf2, 0xff,
+0xee, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0x02, 0x00,
+0x0a, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x08, 0x00, 0xfc, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xe0, 0xff,
+0xcc, 0xff, 0xca, 0xff, 0xbe, 0xff, 0xc8, 0xff, 0xcc, 0xff, 0xd0, 0xff, 0xf4, 0xff, 0xf8, 0xff,
+0x10, 0x00, 0x2a, 0x00, 0x24, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x34, 0x00, 0x24, 0x00, 0x06, 0x00,
+0xf0, 0xff, 0xce, 0xff, 0xa0, 0xff, 0xa2, 0xff, 0xa0, 0xff, 0x9c, 0xff, 0xa4, 0xff, 0xbc, 0xff,
+0xda, 0xff, 0xee, 0xff, 0x20, 0x00, 0x3a, 0x00, 0x4e, 0x00, 0x58, 0x00, 0x50, 0x00, 0x42, 0x00,
+0x1c, 0x00, 0xf2, 0xff, 0xd2, 0xff, 0x9c, 0xff, 0x7c, 0xff, 0x6c, 0xff, 0x60, 0xff, 0x6c, 0xff,
+0x7e, 0xff, 0xa0, 0xff, 0xd4, 0xff, 0xfc, 0xff, 0x36, 0x00, 0x58, 0x00, 0x66, 0x00, 0x78, 0x00,
+0x6c, 0x00, 0x50, 0x00, 0x2c, 0x00, 0xf0, 0xff, 0xb6, 0xff, 0x86, 0xff, 0x5c, 0xff, 0x58, 0xff,
+0x50, 0xff, 0x56, 0xff, 0x7e, 0xff, 0xa8, 0xff, 0xe4, 0xff, 0x1a, 0x00, 0x52, 0x00, 0x7a, 0x00,
+0x86, 0x00, 0x92, 0x00, 0x88, 0x00, 0x4e, 0x00, 0x1c, 0x00, 0xea, 0xff, 0xaa, 0xff, 0x78, 0xff,
+0x52, 0xff, 0x32, 0xff, 0x34, 0xff, 0x4c, 0xff, 0x7a, 0xff, 0xb6, 0xff, 0xea, 0xff, 0x26, 0x00,
+0x62, 0x00, 0x82, 0x00, 0x94, 0x00, 0xa2, 0x00, 0x7e, 0x00, 0x42, 0x00, 0x08, 0x00, 0xce, 0xff,
+0x98, 0xff, 0x68, 0xff, 0x42, 0xff, 0x38, 0xff, 0x42, 0xff, 0x5a, 0xff, 0x90, 0xff, 0xda, 0xff,
+0x0a, 0x00, 0x48, 0x00, 0x84, 0x00, 0xa6, 0x00, 0xb8, 0x00, 0x9e, 0x00, 0x76, 0x00, 0x40, 0x00,
+0x04, 0x00, 0xd4, 0xff, 0x98, 0xff, 0x60, 0xff, 0x42, 0xff, 0x3a, 0xff, 0x48, 0xff, 0x70, 0xff,
+0xb4, 0xff, 0xf4, 0xff, 0x20, 0x00, 0x60, 0x00, 0x92, 0x00, 0xaa, 0x00, 0xac, 0x00, 0x98, 0x00,
+0x68, 0x00, 0x2c, 0x00, 0xf2, 0xff, 0xb6, 0xff, 0x8a, 0xff, 0x54, 0xff, 0x3c, 0xff, 0x3c, 0xff,
+0x54, 0xff, 0x86, 0xff, 0xc0, 0xff, 0xf8, 0xff, 0x28, 0x00, 0x60, 0x00, 0x8a, 0x00, 0xa6, 0x00,
+0xac, 0x00, 0x92, 0x00, 0x62, 0x00, 0x22, 0x00, 0xf0, 0xff, 0xbe, 0xff, 0x84, 0xff, 0x5c, 0xff,
+0x56, 0xff, 0x50, 0xff, 0x72, 0xff, 0x92, 0xff, 0xba, 0xff, 0x00, 0x00, 0x32, 0x00, 0x64, 0x00,
+0x86, 0x00, 0x90, 0x00, 0x8e, 0x00, 0x72, 0x00, 0x40, 0x00, 0x0a, 0x00, 0xe4, 0xff, 0xb4, 0xff,
+0x8c, 0xff, 0x78, 0xff, 0x64, 0xff, 0x62, 0xff, 0x70, 0xff, 0x9a, 0xff, 0xd4, 0xff, 0xfc, 0xff,
+0x22, 0x00, 0x3e, 0x00, 0x56, 0x00, 0x60, 0x00, 0x52, 0x00, 0x46, 0x00, 0x22, 0x00, 0xfc, 0xff,
+0xe2, 0xff, 0xba, 0xff, 0xa4, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0x8c, 0xff, 0x96, 0xff, 0xc0, 0xff,
+0xd6, 0xff, 0xfa, 0xff, 0x1c, 0x00, 0x2e, 0x00, 0x3a, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x30, 0x00,
+0x16, 0x00, 0x04, 0x00, 0xe8, 0xff, 0xd2, 0xff, 0xbe, 0xff, 0xbc, 0xff, 0xb4, 0xff, 0xac, 0xff,
+0xc0, 0xff, 0xd0, 0xff, 0xea, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x12, 0x00,
+0x0e, 0x00, 0x04, 0x00, 0xfe, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xe2, 0xff, 0xd8, 0xff, 0xe0, 0xff,
+0xd6, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xea, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf8, 0xff,
+0xf6, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0x0e, 0x00, 0x04, 0x00, 0xfc, 0xff,
+0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfc, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xe6, 0xff, 0xdc, 0xff,
+0xde, 0xff, 0xd4, 0xff, 0xd8, 0xff, 0xde, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf6, 0xff, 0x0a, 0x00,
+0x18, 0x00, 0x24, 0x00, 0x18, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xea, 0xff,
+0xca, 0xff, 0xb6, 0xff, 0xb4, 0xff, 0xb0, 0xff, 0xaa, 0xff, 0xb4, 0xff, 0xcc, 0xff, 0xe6, 0xff,
+0x0a, 0x00, 0x26, 0x00, 0x4a, 0x00, 0x5a, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x3a, 0x00, 0x1a, 0x00,
+0xfe, 0xff, 0xdc, 0xff, 0xac, 0xff, 0x9c, 0xff, 0x8c, 0xff, 0x8a, 0xff, 0x90, 0xff, 0x9e, 0xff,
+0xd2, 0xff, 0xfa, 0xff, 0x2a, 0x00, 0x56, 0x00, 0x68, 0x00, 0x7c, 0x00, 0x68, 0x00, 0x4e, 0x00,
+0x3e, 0x00, 0x0e, 0x00, 0xe4, 0xff, 0xb6, 0xff, 0x88, 0xff, 0x68, 0xff, 0x48, 0xff, 0x5c, 0xff,
+0x78, 0xff, 0xa0, 0xff, 0xd6, 0xff, 0x08, 0x00, 0x3e, 0x00, 0x62, 0x00, 0x7c, 0x00, 0x8a, 0x00,
+0x80, 0x00, 0x5c, 0x00, 0x2e, 0x00, 0x06, 0x00, 0xd0, 0xff, 0x9e, 0xff, 0x6a, 0xff, 0x4a, 0xff,
+0x48, 0xff, 0x54, 0xff, 0x80, 0xff, 0xb0, 0xff, 0xde, 0xff, 0x1e, 0x00, 0x56, 0x00, 0x7a, 0x00,
+0x94, 0x00, 0x96, 0x00, 0x8e, 0x00, 0x70, 0x00, 0x26, 0x00, 0xf2, 0xff, 0xbe, 0xff, 0x80, 0xff,
+0x48, 0xff, 0x3a, 0xff, 0x32, 0xff, 0x4c, 0xff, 0x7c, 0xff, 0xbc, 0xff, 0x02, 0x00, 0x26, 0x00,
+0x6a, 0x00, 0x96, 0x00, 0xb4, 0x00, 0xb0, 0x00, 0x88, 0x00, 0x58, 0x00, 0x0e, 0x00, 0xd0, 0xff,
+0x98, 0xff, 0x64, 0xff, 0x44, 0xff, 0x22, 0xff, 0x28, 0xff, 0x56, 0xff, 0x82, 0xff, 0xd2, 0xff,
+0x10, 0x00, 0x46, 0x00, 0x86, 0x00, 0xa0, 0x00, 0xb6, 0x00, 0xa6, 0x00, 0x84, 0x00, 0x50, 0x00,
+0x12, 0x00, 0xdc, 0xff, 0x96, 0xff, 0x68, 0xff, 0x46, 0xff, 0x2e, 0xff, 0x40, 0xff, 0x62, 0xff,
+0x9a, 0xff, 0xe0, 0xff, 0x18, 0x00, 0x4e, 0x00, 0x7a, 0x00, 0xa4, 0x00, 0xae, 0x00, 0xaa, 0x00,
+0x88, 0x00, 0x42, 0x00, 0x14, 0x00, 0xd6, 0xff, 0x98, 0xff, 0x70, 0xff, 0x48, 0xff, 0x42, 0xff,
+0x4e, 0xff, 0x6e, 0xff, 0xa8, 0xff, 0xe2, 0xff, 0x20, 0x00, 0x46, 0x00, 0x74, 0x00, 0x8e, 0x00,
+0x90, 0x00, 0x88, 0x00, 0x66, 0x00, 0x2e, 0x00, 0xfe, 0xff, 0xc6, 0xff, 0x94, 0xff, 0x6e, 0xff,
+0x4e, 0xff, 0x4c, 0xff, 0x64, 0xff, 0x82, 0xff, 0xb6, 0xff, 0xee, 0xff, 0x1c, 0x00, 0x48, 0x00,
+0x6a, 0x00, 0x7e, 0x00, 0x86, 0x00, 0x70, 0x00, 0x50, 0x00, 0x1e, 0x00, 0xf2, 0xff, 0xc2, 0xff,
+0x9c, 0xff, 0x88, 0xff, 0x70, 0xff, 0x78, 0xff, 0x8c, 0xff, 0xa0, 0xff, 0xca, 0xff, 0xf6, 0xff,
+0x10, 0x00, 0x38, 0x00, 0x48, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x4c, 0x00, 0x32, 0x00, 0x06, 0x00,
+0xe2, 0xff, 0xc0, 0xff, 0xac, 0xff, 0x98, 0xff, 0x92, 0xff, 0x92, 0xff, 0xa0, 0xff, 0xb4, 0xff,
+0xd2, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0x1e, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x20, 0x00,
+0x16, 0x00, 0x00, 0x00, 0xea, 0xff, 0xdc, 0xff, 0xd0, 0xff, 0xc8, 0xff, 0xd0, 0xff, 0xc0, 0xff,
+0xc6, 0xff, 0xd2, 0xff, 0xdc, 0xff, 0xec, 0xff, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x06, 0x00,
+0x08, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfe, 0xff,
+0xf4, 0xff, 0xec, 0xff, 0xe2, 0xff, 0xe0, 0xff, 0xdc, 0xff, 0xd8, 0xff, 0xdc, 0xff, 0xe8, 0xff,
+0xee, 0xff, 0xe2, 0xff, 0xe8, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0x0a, 0x00, 0x18, 0x00,
+0x0c, 0x00, 0x12, 0x00, 0x18, 0x00, 0xfe, 0xff, 0xf4, 0xff, 0xe2, 0xff, 0xdc, 0xff, 0xce, 0xff,
+0xbc, 0xff, 0xce, 0xff, 0xc8, 0xff, 0xca, 0xff, 0xd4, 0xff, 0xe4, 0xff, 0xfe, 0xff, 0x0a, 0x00,
+0x24, 0x00, 0x36, 0x00, 0x42, 0x00, 0x2c, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x04, 0x00, 0xf0, 0xff,
+0xda, 0xff, 0xbe, 0xff, 0xa0, 0xff, 0x92, 0xff, 0xac, 0xff, 0xb0, 0xff, 0xb2, 0xff, 0xea, 0xff,
+0x16, 0x00, 0x2e, 0x00, 0x46, 0x00, 0x50, 0x00, 0x62, 0x00, 0x66, 0x00, 0x3e, 0x00, 0x14, 0x00,
+0xee, 0xff, 0xd6, 0xff, 0xb0, 0xff, 0x84, 0xff, 0x68, 0xff, 0x5a, 0xff, 0x7a, 0xff, 0xac, 0xff,
+0xa0, 0xff, 0xc6, 0xff, 0x20, 0x00, 0x74, 0x00, 0x6a, 0x00, 0x5c, 0x00, 0x82, 0x00, 0x64, 0x00,
+0x4a, 0x00, 0x28, 0x00, 0xf6, 0xff, 0xbe, 0xff, 0x8a, 0xff, 0x7e, 0xff, 0x52, 0xff, 0x86, 0xff,
+0x7a, 0xff, 0x2c, 0xff, 0x98, 0xff, 0x26, 0x00, 0x6c, 0x00, 0x52, 0x00, 0x72, 0x00, 0xb8, 0x00,
+0xb6, 0x00, 0x04, 0x01, 0x34, 0x01, 0x48, 0x01, 0xbc, 0x00, 0xf0, 0xfe, 0x16, 0xfc, 0x70, 0xf8,
+0xc2, 0xf4, 0xf4, 0xf1, 0x12, 0xf1, 0x4c, 0xf3, 0xde, 0xf8, 0x9c, 0x01, 0x90, 0x0c, 0x1a, 0x18,
+0x0f, 0x22, 0x9b, 0x28, 0x0d, 0x2a, 0xb7, 0x24, 0xd4, 0x18, 0x6c, 0x07, 0x06, 0xf3, 0xcb, 0xde,
+0x0d, 0xcd, 0x37, 0xc0, 0x15, 0xba, 0xe1, 0xbc, 0xab, 0xc8, 0xf9, 0xdb, 0x28, 0xf5, 0x32, 0x11,
+0x43, 0x2c, 0x41, 0x42, 0xd1, 0x50, 0x7a, 0x55, 0x0d, 0x4f, 0x6b, 0x3e, 0x41, 0x25, 0xde, 0x06,
+0x6e, 0xe7, 0x63, 0xca, 0xf7, 0xb3, 0x14, 0xa7, 0x48, 0xa5, 0x41, 0xae, 0x5b, 0xc1, 0xad, 0xdc,
+0xf0, 0xfb, 0xf6, 0x1a, 0x4b, 0x35, 0xe7, 0x48, 0x45, 0x54, 0x88, 0x56, 0x4f, 0x4e, 0x6b, 0x3d,
+0xc1, 0x24, 0xbc, 0x06, 0x4c, 0xe7, 0x09, 0xca, 0x1b, 0xb4, 0xc2, 0xa8, 0x54, 0xa9, 0xf3, 0xb4,
+0x9b, 0xc9, 0x8a, 0xe4, 0x3a, 0x01, 0x9e, 0x1b, 0x71, 0x31, 0x03, 0x42, 0x7f, 0x4c, 0x8f, 0x4f,
+0xe3, 0x49, 0xcd, 0x3a, 0x49, 0x23, 0xa2, 0x05, 0xbe, 0xe5, 0x19, 0xc9, 0x87, 0xb4, 0x41, 0xab,
+0x37, 0xae, 0xdb, 0xbb, 0x37, 0xd1, 0x7e, 0xea, 0x40, 0x04, 0xa4, 0x1b, 0x51, 0x2f, 0x7b, 0x3e,
+0x1d, 0x48, 0xe3, 0x4a, 0x33, 0x45, 0xfb, 0x35, 0x07, 0x1e, 0x14, 0x00, 0xd3, 0xe0, 0xe3, 0xc5,
+0x79, 0xb4, 0x1f, 0xaf, 0x7d, 0xb5, 0x19, 0xc5, 0xc9, 0xda, 0x06, 0xf3, 0x10, 0x0a, 0x93, 0x1e,
+0x0b, 0x2f, 0xb7, 0x3a, 0x3f, 0x41, 0x59, 0x41, 0x91, 0x39, 0xb1, 0x29, 0x26, 0x13, 0xf4, 0xf8,
+0xbf, 0xdf, 0x33, 0xcc, 0xb9, 0xc1, 0xe1, 0xc0, 0x69, 0xc8, 0xc7, 0xd5, 0x14, 0xe6, 0x1a, 0xf7,
+0x12, 0x07, 0xf8, 0x14, 0x37, 0x20, 0x5d, 0x28, 0xd5, 0x2c, 0x27, 0x2d, 0xdf, 0x27, 0xff, 0x1c,
+0x9a, 0x0d, 0xbe, 0xfb, 0xdc, 0xea, 0x41, 0xde, 0x87, 0xd7, 0x43, 0xd7, 0x2b, 0xdc, 0x60, 0xe4,
+0x2e, 0xee, 0x14, 0xf8, 0x62, 0x01, 0x4c, 0x09, 0x98, 0x0f, 0x5e, 0x14, 0xba, 0x17, 0x2e, 0x19,
+0x36, 0x18, 0x4a, 0x14, 0x8a, 0x0d, 0x06, 0x05, 0x08, 0xfc, 0x30, 0xf4, 0xe8, 0xee, 0xbc, 0xec,
+0x4c, 0xed, 0xb2, 0xef, 0x20, 0xf3, 0x58, 0xf6, 0xde, 0xf8, 0xb0, 0xfa, 0x42, 0xfc, 0x34, 0xfe,
+0x6c, 0x01, 0x0c, 0x06, 0x62, 0x0b, 0x1c, 0x10, 0x8e, 0x12, 0x44, 0x12, 0x8c, 0x0f, 0x50, 0x0b,
+0x56, 0x06, 0xaa, 0x01, 0xc2, 0xfd, 0x54, 0xfa, 0x9c, 0xf6, 0x22, 0xf2, 0x2e, 0xed, 0xb6, 0xe8,
+0x12, 0xe6, 0xd0, 0xe6, 0x66, 0xec, 0xc8, 0xf6, 0x3c, 0x04, 0xa0, 0x11, 0x65, 0x1c, 0xad, 0x22,
+0x0f, 0x24, 0x0d, 0x21, 0x2a, 0x1b, 0xac, 0x13, 0x26, 0x0b, 0x82, 0x01, 0x5e, 0xf6, 0x22, 0xea,
+0xdf, 0xdd, 0xe3, 0xd3, 0x91, 0xce, 0x6f, 0xd0, 0x79, 0xda, 0xb0, 0xeb, 0xfe, 0x00, 0x76, 0x16,
+0x65, 0x28, 0x1f, 0x34, 0xc1, 0x38, 0xd5, 0x36, 0xb5, 0x2f, 0x63, 0x24, 0xb8, 0x15, 0xda, 0x03,
+0xde, 0xef, 0x45, 0xdb, 0x0b, 0xc9, 0x6b, 0xbc, 0x2b, 0xb8, 0x31, 0xbe, 0x59, 0xce, 0x68, 0xe6,
+0x82, 0x02, 0x13, 0x1e, 0xdb, 0x34, 0x95, 0x44, 0xa5, 0x4b, 0x33, 0x4a, 0x01, 0x41, 0x15, 0x31,
+0x44, 0x1b, 0x2c, 0x01, 0x24, 0xe5, 0x6b, 0xca, 0x2b, 0xb5, 0xc6, 0xa8, 0xb2, 0xa7, 0x8b, 0xb2,
+0x3f, 0xc8, 0x04, 0xe6, 0xae, 0x07, 0x0d, 0x28, 0xf1, 0x42, 0xe8, 0x54, 0x72, 0x5c, 0x34, 0x59,
+0xaf, 0x4b, 0x39, 0x35, 0x06, 0x18, 0x44, 0xf7, 0x67, 0xd6, 0xdf, 0xb9, 0x7a, 0xa5, 0x44, 0x9c,
+0x50, 0x9f, 0x5f, 0xae, 0x05, 0xc8, 0x94, 0xe9, 0xbc, 0x0e, 0x6f, 0x32, 0xf7, 0x4f, 0x6a, 0x63,
+0x5a, 0x6a, 0xdc, 0x63, 0x9f, 0x50, 0x11, 0x33, 0x44, 0x0f, 0xa6, 0xe9, 0x1f, 0xc7, 0xd3, 0xab,
+0xe8, 0x9a, 0xac, 0x95, 0x66, 0x9c, 0xa7, 0xae, 0x19, 0xcb, 0x4c, 0xef, 0xf4, 0x16, 0xc3, 0x3c,
+0x6c, 0x5b, 0x66, 0x6e, 0x4a, 0x72, 0x60, 0x66, 0xb3, 0x4c, 0xb5, 0x29, 0xc0, 0x02, 0xef, 0xdc,
+0xbb, 0xbc, 0x4e, 0xa5, 0x4e, 0x98, 0x4c, 0x96, 0x48, 0x9f, 0x0f, 0xb3, 0x1d, 0xd1, 0xc6, 0xf6,
+0x99, 0x1f, 0xd3, 0x45, 0x82, 0x63, 0x8a, 0x73, 0xcc, 0x72, 0xc8, 0x61, 0x27, 0x44, 0x91, 0x1f,
+0x88, 0xf9, 0x7b, 0xd6, 0xa7, 0xb9, 0x86, 0xa5, 0x26, 0x9b, 0x00, 0x9b, 0x70, 0xa5, 0xb5, 0xba,
+0xe9, 0xd9, 0x24, 0x00, 0x63, 0x28, 0x75, 0x4c, 0x4c, 0x66, 0x28, 0x71, 0x70, 0x6b, 0xec, 0x56,
+0x8d, 0x38, 0x8c, 0x15, 0x94, 0xf2, 0x37, 0xd3, 0x1f, 0xba, 0x4a, 0xa9, 0xb0, 0xa1, 0xee, 0xa3,
+0x57, 0xb0, 0xf3, 0xc6, 0x2a, 0xe6, 0x88, 0x0a, 0xcb, 0x2e, 0x3d, 0x4d, 0xa8, 0x60, 0x02, 0x66,
+0x14, 0x5d, 0x9d, 0x48, 0xdf, 0x2c, 0x28, 0x0e, 0x10, 0xf0, 0x6f, 0xd5, 0xab, 0xc0, 0x3d, 0xb3,
+0x4f, 0xae, 0x47, 0xb2, 0x7b, 0xbf, 0x4f, 0xd5, 0xa2, 0xf1, 0xca, 0x10, 0x45, 0x2e, 0x97, 0x45,
+0x17, 0x53, 0x10, 0x55, 0xb5, 0x4b, 0x7b, 0x39, 0xa9, 0x21, 0xc6, 0x07, 0xd2, 0xee, 0x6b, 0xd9,
+0x85, 0xc9, 0x83, 0xc0, 0xf3, 0xbe, 0xed, 0xc4, 0xed, 0xd1, 0x84, 0xe4, 0xca, 0xfa, 0xda, 0x11,
+0xef, 0x26, 0x1f, 0x37, 0x35, 0x40, 0xd7, 0x40, 0x3f, 0x39, 0xc1, 0x2a, 0xf4, 0x17, 0xc6, 0x03,
+0xd0, 0xf0, 0x6d, 0xe1, 0x01, 0xd7, 0x73, 0xd2, 0x79, 0xd3, 0x8f, 0xd9, 0x79, 0xe3, 0xee, 0xef,
+0xa4, 0xfd, 0x84, 0x0b, 0x62, 0x18, 0xcf, 0x22, 0x6d, 0x29, 0xc1, 0x2a, 0x67, 0x26, 0x11, 0x1d,
+0x8c, 0x10, 0x2a, 0x03, 0x4e, 0xf7, 0x7e, 0xee, 0x9e, 0xe9, 0x8e, 0xe8, 0x50, 0xea, 0x7a, 0xed,
+0x1a, 0xf1, 0xbe, 0xf4, 0xda, 0xf8, 0x22, 0xfe, 0xa2, 0x04, 0xd8, 0x0b, 0x1e, 0x12, 0xf6, 0x15,
+0xf4, 0x15, 0x76, 0x12, 0xce, 0x0c, 0xfc, 0x06, 0xb4, 0x02, 0x8e, 0x00, 0x4a, 0x00, 0xc4, 0x00,
+0x70, 0x00, 0x0e, 0xfe, 0xb6, 0xf9, 0x48, 0xf4, 0xb0, 0xef, 0xc0, 0xed, 0x48, 0xef, 0xdc, 0xf3,
+0x46, 0xfa, 0xa4, 0x00, 0xb8, 0x05, 0x50, 0x09, 0x2e, 0x0c, 0x4c, 0x0f, 0xea, 0x12, 0x82, 0x16,
+0xa0, 0x18, 0xda, 0x17, 0xd8, 0x12, 0x8c, 0x09, 0x18, 0xfd, 0x9c, 0xef, 0xd2, 0xe3, 0xf3, 0xdb,
+0x77, 0xd9, 0x87, 0xdc, 0x1a, 0xe4, 0x84, 0xee, 0x60, 0xfa, 0x98, 0x06, 0xd0, 0x12, 0x41, 0x1e,
+0xd7, 0x27, 0xed, 0x2d, 0x19, 0x2f, 0x59, 0x2a, 0x8f, 0x1f, 0x98, 0x0f, 0x3a, 0xfc, 0x30, 0xe8,
+0x4d, 0xd6, 0x8d, 0xc9, 0xb9, 0xc3, 0xed, 0xc5, 0xc5, 0xcf, 0xcf, 0xdf, 0xba, 0xf3, 0x3c, 0x09,
+0x1f, 0x1e, 0x0d, 0x30, 0xf1, 0x3c, 0xff, 0x42, 0x9b, 0x41, 0x8d, 0x38, 0x71, 0x28, 0x86, 0x12,
+0xfe, 0xf8, 0xa1, 0xde, 0x17, 0xc7, 0xcf, 0xb5, 0x0d, 0xae, 0x9f, 0xb1, 0x33, 0xc0, 0xb9, 0xd7,
+0x7e, 0xf4, 0x40, 0x12, 0x07, 0x2d, 0xf5, 0x41, 0xdf, 0x4e, 0x49, 0x53, 0x8f, 0x4e, 0x5d, 0x41,
+0xb3, 0x2c, 0xe6, 0x11, 0x12, 0xf3, 0x8b, 0xd3, 0x93, 0xb7, 0x00, 0xa4, 0xee, 0x9c, 0xfa, 0xa3,
+0xcd, 0xb8, 0xbb, 0xd7, 0x5c, 0xfb, 0xdd, 0x1d, 0x0b, 0x3b, 0x31, 0x50, 0xfa, 0x5b, 0xf6, 0x5d,
+0x30, 0x56, 0x83, 0x45, 0xdd, 0x2c, 0x90, 0x0d, 0xfe, 0xe9, 0x4d, 0xc6, 0x10, 0xa8, 0xac, 0x94,
+0x7a, 0x90, 0xd6, 0x9c, 0xe1, 0xb7, 0x9d, 0xdc, 0x44, 0x04, 0xe1, 0x28, 0x8f, 0x46, 0xde, 0x5a,
+0x0c, 0x65, 0xc6, 0x64, 0x00, 0x5a, 0xbf, 0x45, 0xed, 0x28, 0x38, 0x05, 0x11, 0xde, 0x8d, 0xb8,
+0xc2, 0x9a, 0xb6, 0x8a, 0x8e, 0x8b, 0x80, 0x9d, 0x23, 0xbd, 0xc8, 0xe4, 0x60, 0x0d, 0xb1, 0x31,
+0xfd, 0x4d, 0x82, 0x60, 0x7e, 0x68, 0x84, 0x65, 0xc0, 0x57, 0xf9, 0x3f, 0xc3, 0x1f, 0x5c, 0xf9,
+0x6b, 0xd1, 0x77, 0xad, 0xd2, 0x93, 0xf4, 0x88, 0xfe, 0x8e, 0x9a, 0xa4, 0x25, 0xc6, 0xb4, 0xed,
+0xee, 0x14, 0x45, 0x37, 0x4d, 0x51, 0x7c, 0x61, 0xd8, 0x66, 0xde, 0x60, 0xe7, 0x4f, 0x63, 0x35,
+0x48, 0x13, 0x38, 0xed, 0x17, 0xc8, 0x38, 0xa9, 0x76, 0x95, 0xd2, 0x8f, 0x1a, 0x99, 0x9f, 0xaf,
+0x15, 0xd0, 0x12, 0xf5, 0x48, 0x19, 0x6f, 0x38, 0xab, 0x4f, 0xd8, 0x5c, 0x3a, 0x5f, 0x3e, 0x56,
+0xd7, 0x42, 0x53, 0x27, 0x88, 0x06, 0x86, 0xe4, 0xad, 0xc5, 0xc1, 0xad, 0x90, 0x9f, 0x68, 0x9d,
+0x44, 0xa7, 0x75, 0xbc, 0xa1, 0xd9, 0x9c, 0xfa, 0xf0, 0x1a, 0xa3, 0x36, 0x47, 0x4a, 0x0d, 0x54,
+0xdf, 0x52, 0x2d, 0x47, 0x0b, 0x33, 0x06, 0x19, 0xd8, 0xfc, 0xbb, 0xe1, 0x69, 0xca, 0xd9, 0xb8,
+0xfb, 0xae, 0x2d, 0xae, 0x39, 0xb7, 0x5d, 0xc9, 0x77, 0xe2, 0xfc, 0xfe, 0xb8, 0x1a, 0xb9, 0x31,
+0x9f, 0x40, 0xc5, 0x45, 0x6b, 0x41, 0xb3, 0x34, 0x67, 0x22, 0xa4, 0x0d, 0xda, 0xf8, 0x14, 0xe6,
+0x4f, 0xd6, 0x33, 0xca, 0x21, 0xc3, 0x69, 0xc2, 0xf7, 0xc8, 0x37, 0xd7, 0x1e, 0xeb, 0xae, 0x01,
+0x08, 0x17, 0x6d, 0x27, 0x8f, 0x30, 0xb1, 0x31, 0xb3, 0x2b, 0x07, 0x21, 0x24, 0x14, 0xfc, 0x06,
+0xe8, 0xfa, 0x42, 0xf0, 0xec, 0xe6, 0x21, 0xdf, 0x61, 0xd9, 0xa5, 0xd7, 0x0f, 0xdb, 0xe2, 0xe3,
+0x0a, 0xf1, 0xde, 0xff, 0x60, 0x0d, 0xee, 0x16, 0x26, 0x1b, 0x30, 0x1a, 0x1e, 0x16, 0x4e, 0x10,
+0xc4, 0x0a, 0x2e, 0x06, 0x94, 0x02, 0x3c, 0xff, 0x32, 0xfb, 0x34, 0xf6, 0x00, 0xf1, 0x0c, 0xed,
+0x8e, 0xeb, 0x5c, 0xed, 0xcc, 0xf1, 0x9e, 0xf7, 0xdc, 0xfc, 0x54, 0x00, 0xfa, 0x01, 0x52, 0x02,
+0x76, 0x02, 0x78, 0x03, 0xd4, 0x05, 0x74, 0x09, 0x5e, 0x0d, 0x22, 0x10, 0xa8, 0x10, 0x28, 0x0e,
+0xac, 0x08, 0x4e, 0x01, 0x64, 0xf9, 0x4c, 0xf2, 0x0c, 0xed, 0xb0, 0xe9, 0x16, 0xe8, 0x32, 0xe8,
+0xf4, 0xe9, 0x90, 0xed, 0x4c, 0xf3, 0x20, 0xfb, 0xc8, 0x04, 0xae, 0x0f, 0x3c, 0x1a, 0x9f, 0x22,
+0x0d, 0x27, 0xd7, 0x25, 0x53, 0x1e, 0x5e, 0x11, 0x20, 0x01, 0x3c, 0xf0, 0xc1, 0xe1, 0xfd, 0xd6,
+0x35, 0xd1, 0x89, 0xd0, 0x9b, 0xd4, 0xad, 0xdc, 0x4a, 0xe8, 0xe6, 0xf6, 0xaa, 0x07, 0x7e, 0x19,
+0x01, 0x2a, 0x19, 0x37, 0x7b, 0x3d, 0x0d, 0x3b, 0xcf, 0x2e, 0x92, 0x1a, 0x8a, 0x01, 0x1c, 0xe8,
+0x71, 0xd2, 0x8b, 0xc3, 0x7b, 0xbc, 0x0b, 0xbd, 0x29, 0xc4, 0xa1, 0xd0, 0xcf, 0xe1, 0x7c, 0xf6,
+0xb2, 0x0d, 0xc7, 0x25, 0xaf, 0x3b, 0x4b, 0x4b, 0x91, 0x51, 0x69, 0x4b, 0x41, 0x39, 0x7f, 0x1d,
+0xe6, 0xfc, 0x3b, 0xdd, 0x77, 0xc3, 0x31, 0xb2, 0xbe, 0xaa, 0xc5, 0xac, 0xa3, 0xb6, 0xcd, 0xc7,
+0xc9, 0xde, 0x98, 0xfa, 0x08, 0x19, 0xaf, 0x36, 0x4d, 0x4f, 0x02, 0x5f, 0xc6, 0x61, 0xf8, 0x55,
+0x09, 0x3d, 0xee, 0x1a, 0x84, 0xf5, 0x89, 0xd2, 0xcb, 0xb6, 0x68, 0xa5, 0xfa, 0x9e, 0xec, 0xa2,
+0x07, 0xb0, 0x7d, 0xc5, 0x13, 0xe2, 0x3c, 0x03, 0xa3, 0x25, 0x6b, 0x45, 0xf6, 0x5d, 0xda, 0x6a,
+0x38, 0x69, 0x5a, 0x58, 0x45, 0x3b, 0x36, 0x16, 0x60, 0xee, 0xdd, 0xc9, 0x57, 0xad, 0x90, 0x9b,
+0xc2, 0x95, 0xa0, 0x9b, 0x8f, 0xac, 0x93, 0xc7, 0xd2, 0xe9, 0x86, 0x0f, 0x85, 0x34, 0xcf, 0x53,
+0x40, 0x69, 0x68, 0x71, 0xc6, 0x6a, 0x34, 0x56, 0xa7, 0x36, 0x28, 0x10, 0xc4, 0xe7, 0xf1, 0xc2,
+0x44, 0xa6, 0x4c, 0x95, 0x76, 0x91, 0x0a, 0x9b, 0x03, 0xb1, 0xf9, 0xd0, 0xce, 0xf6, 0x7b, 0x1d,
+0x4d, 0x40, 0x28, 0x5b, 0x36, 0x6b, 0x76, 0x6e, 0x6c, 0x64, 0x73, 0x4e, 0xe3, 0x2e, 0x3e, 0x09,
+0xbd, 0xe1, 0xf1, 0xbd, 0xdc, 0xa2, 0x6e, 0x94, 0x2a, 0x94, 0x16, 0xa2, 0x0f, 0xbc, 0x57, 0xde,
+0xc6, 0x03, 0x4f, 0x27, 0x15, 0x45, 0x38, 0x5a, 0x16, 0x65, 0x1a, 0x65, 0x1c, 0x5a, 0xc9, 0x44,
+0xd9, 0x26, 0xfe, 0x02, 0x8b, 0xdd, 0x0f, 0xbc, 0xdc, 0xa3, 0xfe, 0x98, 0x00, 0x9d, 0x5d, 0xae,
+0x3f, 0xca, 0x8a, 0xeb, 0x4c, 0x0d, 0x0f, 0x2b, 0x75, 0x42, 0x11, 0x52, 0x64, 0x59, 0xca, 0x57,
+0x1b, 0x4d, 0x8d, 0x39, 0xc3, 0x1d, 0xaa, 0xfc, 0x85, 0xda, 0x5d, 0xbd, 0x50, 0xaa, 0x70, 0xa4,
+0x09, 0xac, 0x4f, 0xbf, 0xa3, 0xd9, 0x64, 0xf6, 0x94, 0x11, 0x79, 0x28, 0xef, 0x39, 0x17, 0x45,
+0xa3, 0x49, 0x89, 0x47, 0x0d, 0x3e, 0xab, 0x2c, 0x56, 0x14, 0xd4, 0xf7, 0xbf, 0xdb, 0x07, 0xc5,
+0xb5, 0xb7, 0x15, 0xb6, 0x7f, 0xbf, 0xd5, 0xd0, 0x4a, 0xe6, 0x30, 0xfc, 0x14, 0x10, 0x87, 0x20,
+0x91, 0x2c, 0x39, 0x34, 0x45, 0x37, 0x3d, 0x35, 0x71, 0x2d, 0xbf, 0x1f, 0xf6, 0x0c, 0xbc, 0xf7,
+0x73, 0xe3, 0xdf, 0xd3, 0x09, 0xcc, 0x45, 0xcc, 0xfb, 0xd3, 0x7f, 0xe0, 0x24, 0xef, 0x70, 0xfd,
+0xf2, 0x09, 0xd8, 0x13, 0x40, 0x1b, 0xcd, 0x1f, 0x71, 0x21, 0x8b, 0x20, 0x5f, 0x1c, 0xe0, 0x14,
+0x68, 0x0a, 0x58, 0xfe, 0x9e, 0xf2, 0x8c, 0xe9, 0x62, 0xe4, 0xe8, 0xe3, 0x72, 0xe7, 0x7e, 0xed,
+0x6a, 0xf4, 0x18, 0xfb, 0x90, 0x00, 0x8a, 0x04, 0x38, 0x07, 0x14, 0x09, 0xac, 0x0a, 0x74, 0x0c,
+0x44, 0x0e, 0x38, 0x0f, 0xa0, 0x0e, 0xb0, 0x0b, 0x0a, 0x07, 0x9e, 0x01, 0xce, 0xfc, 0x40, 0xf9,
+0x5c, 0xf7, 0x96, 0xf6, 0x2c, 0xf6, 0x86, 0xf5, 0x20, 0xf4, 0x4e, 0xf2, 0x04, 0xf1, 0x6a, 0xf1,
+0xae, 0xf4, 0x88, 0xfb, 0x2e, 0x05, 0x88, 0x0f, 0x34, 0x18, 0xe5, 0x1c, 0x09, 0x1d, 0x82, 0x19,
+0x90, 0x13, 0x82, 0x0c, 0x2e, 0x05, 0x90, 0xfd, 0x80, 0xf5, 0x06, 0xed, 0x34, 0xe4, 0xad, 0xdc,
+0x89, 0xd8, 0xbd, 0xd9, 0xa1, 0xe1, 0xe6, 0xef, 0x64, 0x02, 0xee, 0x15, 0x55, 0x26, 0x63, 0x30,
+0x6b, 0x33, 0x0b, 0x30, 0xdb, 0x27, 0x55, 0x1c, 0xac, 0x0e, 0x88, 0xff, 0x66, 0xef, 0xdd, 0xde,
+0xd9, 0xcf, 0x33, 0xc5, 0x9f, 0xc1, 0xc7, 0xc6, 0x0d, 0xd5, 0x30, 0xeb, 0xbc, 0x05, 0xd1, 0x1f,
+0x29, 0x35, 0xa9, 0x42, 0x15, 0x47, 0x1f, 0x43, 0x27, 0x38, 0xfd, 0x27, 0xe2, 0x13, 0xec, 0xfc,
+0xb2, 0xe4, 0xdf, 0xcd, 0x45, 0xbb, 0x77, 0xb0, 0xe1, 0xaf, 0x61, 0xba, 0x47, 0xcf, 0x94, 0xeb,
+0x68, 0x0b, 0xef, 0x29, 0xe1, 0x42, 0xb9, 0x52, 0x44, 0x58, 0x3d, 0x53, 0xdb, 0x44, 0xc5, 0x2e,
+0x14, 0x13, 0x5e, 0xf4, 0xc1, 0xd5, 0x35, 0xbb, 0x82, 0xa8, 0x80, 0xa0, 0x82, 0xa4, 0x65, 0xb4,
+0x41, 0xce, 0x44, 0xef, 0xf2, 0x12, 0x91, 0x34, 0xc3, 0x4f, 0x26, 0x61, 0x28, 0x66, 0x62, 0x5e,
+0xd7, 0x4a, 0x17, 0x2e, 0x88, 0x0b, 0x10, 0xe7, 0x87, 0xc5, 0x5f, 0xab, 0xde, 0x9b, 0x2a, 0x98,
+0xb4, 0xa0, 0x6b, 0xb4, 0x9d, 0xd1, 0x04, 0xf5, 0xb0, 0x1a, 0x3f, 0x3e, 0xd4, 0x5a, 0x3a, 0x6c,
+0x44, 0x6f, 0x48, 0x63, 0x05, 0x4a, 0x91, 0x27, 0x7e, 0x00, 0x2d, 0xda, 0x7f, 0xb9, 0x44, 0xa2,
+0x7a, 0x96, 0x66, 0x96, 0xa2, 0xa1, 0x71, 0xb7, 0x1f, 0xd6, 0xae, 0xfa, 0x8d, 0x21, 0x0d, 0x46,
+0xf6, 0x62, 0x12, 0x73, 0xd0, 0x72, 0x1a, 0x62, 0x21, 0x44, 0xf7, 0x1d, 0x7a, 0xf5, 0x35, 0xd0,
+0x99, 0xb2, 0x54, 0x9f, 0x16, 0x97, 0xa0, 0x99, 0xd4, 0xa6, 0x09, 0xbe, 0xc5, 0xdd, 0x56, 0x03,
+0x93, 0x2a, 0x4d, 0x4e, 0x8a, 0x68, 0x06, 0x74, 0x5e, 0x6e, 0xe2, 0x58, 0xe5, 0x37, 0x5e, 0x11,
+0x10, 0xeb, 0xb3, 0xc9, 0xab, 0xb0, 0x8a, 0xa1, 0xc4, 0x9c, 0x22, 0xa2, 0x23, 0xb1, 0x39, 0xc9,
+0xd2, 0xe8, 0x1a, 0x0d, 0x9b, 0x31, 0xfd, 0x50, 0x82, 0x65, 0x76, 0x6b, 0xae, 0x61, 0xb5, 0x4a,
+0x2d, 0x2b, 0x7e, 0x08, 0x72, 0xe7, 0x93, 0xcb, 0x65, 0xb7, 0xfb, 0xab, 0x9e, 0xa9, 0x07, 0xb0,
+0x4b, 0xbf, 0x4f, 0xd6, 0x84, 0xf3, 0xd2, 0x13, 0xef, 0x32, 0xe9, 0x4b, 0x70, 0x5a, 0x08, 0x5c,
+0xd3, 0x50, 0x8b, 0x3b, 0xcd, 0x1f, 0x52, 0x02, 0xac, 0xe6, 0xe5, 0xcf, 0xd5, 0xbf, 0xb5, 0xb7,
+0xc7, 0xb7, 0xf7, 0xbf, 0x5f, 0xcf, 0x9e, 0xe4, 0xbe, 0xfd, 0x70, 0x17, 0xab, 0x2e, 0x03, 0x40,
+0x15, 0x49, 0x79, 0x48, 0x8d, 0x3e, 0x0b, 0x2d, 0x46, 0x17, 0x5a, 0x00, 0x36, 0xeb, 0x1d, 0xda,
+0xc3, 0xce, 0x09, 0xca, 0xd7, 0xcb, 0xb5, 0xd3, 0x61, 0xe0, 0x64, 0xf0, 0x82, 0x01, 0x88, 0x12,
+0x77, 0x21, 0xed, 0x2c, 0x33, 0x33, 0x57, 0x33, 0xfb, 0x2c, 0x0f, 0x21, 0x54, 0x11, 0xa0, 0x00,
+0xbc, 0xf1, 0x74, 0xe6, 0x49, 0xe0, 0x1d, 0xdf, 0x71, 0xe2, 0x92, 0xe8, 0x20, 0xf0, 0xbc, 0xf7,
+0x60, 0xff, 0xc0, 0x06, 0x2e, 0x0e, 0x4c, 0x15, 0xdc, 0x1a, 0x81, 0x1d, 0xfe, 0x1b, 0x7c, 0x16,
+0x34, 0x0e, 0x2e, 0x05, 0x4c, 0xfd, 0x4c, 0xf8, 0x58, 0xf6, 0xcc, 0xf6, 0x36, 0xf8, 0xf2, 0xf8,
+0x86, 0xf8, 0x16, 0xf7, 0x82, 0xf5, 0x80, 0xf5, 0x10, 0xf8, 0x42, 0xfd, 0xce, 0x03, 0xc8, 0x09,
+0xc0, 0x0d, 0x42, 0x0f, 0xb8, 0x0e, 0x88, 0x0d, 0xfa, 0x0c, 0x3a, 0x0d, 0xe6, 0x0d, 0x98, 0x0d,
+0xe2, 0x0a, 0xf4, 0x04, 0x26, 0xfc, 0x0e, 0xf2, 0xf6, 0xe8, 0x03, 0xe3, 0xc5, 0xe1, 0xc4, 0xe5,
+0xa2, 0xed, 0x92, 0xf7, 0xb8, 0x01, 0x10, 0x0b, 0x9e, 0x13, 0x04, 0x1b, 0x0b, 0x21, 0xff, 0x24,
+0xbd, 0x25, 0xeb, 0x21, 0x0a, 0x19, 0x7c, 0x0b, 0xde, 0xfa, 0x7c, 0xe9, 0xd1, 0xd9, 0x25, 0xcf,
+0x29, 0xcb, 0xb7, 0xce, 0xfb, 0xd8, 0x22, 0xe8, 0x20, 0xfa, 0xd4, 0x0c, 0x71, 0x1e, 0x2f, 0x2d,
+0xcb, 0x37, 0x59, 0x3c, 0x65, 0x3a, 0x7d, 0x31, 0x37, 0x22, 0xf2, 0x0d, 0xae, 0xf6, 0x3b, 0xdf,
+0xa9, 0xca, 0x4b, 0xbc, 0x7f, 0xb6, 0xf3, 0xba, 0x0f, 0xc9, 0xff, 0xde, 0x64, 0xf9, 0xb4, 0x14,
+0x6f, 0x2d, 0x8d, 0x40, 0xe1, 0x4b, 0x87, 0x4e, 0x55, 0x48, 0x2b, 0x3a, 0x69, 0x25, 0xe6, 0x0b,
+0xaa, 0xef, 0xa1, 0xd3, 0x37, 0xbb, 0x4e, 0xaa, 0x88, 0xa4, 0x8d, 0xab, 0x69, 0xbf, 0xdd, 0xdc,
+0x7c, 0xff, 0x65, 0x21, 0x01, 0x3e, 0x05, 0x52, 0xfe, 0x5b, 0x5c, 0x5b, 0x03, 0x51, 0xa7, 0x3e,
+0xab, 0x25, 0xf2, 0x07, 0x4a, 0xe7, 0x3b, 0xc7, 0x01, 0xac, 0x62, 0x9a, 0x54, 0x96, 0x1e, 0xa2,
+0xa5, 0xbc, 0x65, 0xe1, 0x9e, 0x09, 0xc1, 0x2e, 0x1b, 0x4c, 0xee, 0x5e, 0x1c, 0x66, 0x56, 0x62,
+0xaf, 0x54, 0xd3, 0x3e, 0x1d, 0x22, 0x4a, 0x00, 0x19, 0xdc, 0xa3, 0xb9, 0x2a, 0x9e, 0xca, 0x8e,
+0x7e, 0x8f, 0x04, 0xa1, 0x23, 0xc1, 0xdc, 0xe9, 0xfc, 0x13, 0x0f, 0x39, 0xd4, 0x54, 0x80, 0x65,
+0x74, 0x6a, 0x38, 0x64, 0xf5, 0x53, 0x3b, 0x3b, 0x7c, 0x1b, 0xca, 0xf6, 0xbb, 0xd0, 0x47, 0xae,
+0x5c, 0x95, 0x50, 0x8a, 0x04, 0x90, 0x3c, 0xa6, 0x47, 0xc9, 0xb8, 0xf2, 0x98, 0x1b, 0x81, 0x3e,
+0xee, 0x57, 0x78, 0x66, 0x44, 0x69, 0xdc, 0x60, 0x29, 0x4e, 0xc9, 0x32, 0xca, 0x10, 0x10, 0xeb,
+0x51, 0xc6, 0x92, 0xa7, 0xc6, 0x93, 0x3c, 0x8e, 0x60, 0x98, 0xc7, 0xb0, 0x95, 0xd3, 0x0a, 0xfb,
+0xdd, 0x20, 0x9d, 0x40, 0x10, 0x57, 0xcc, 0x62, 0xfa, 0x62, 0x08, 0x58, 0x3f, 0x43, 0x89, 0x26,
+0x92, 0x04, 0x27, 0xe1, 0xf5, 0xc0, 0x4a, 0xa8, 0xa0, 0x9a, 0xba, 0x99, 0xc0, 0xa5, 0x7f, 0xbd,
+0x45, 0xdd, 0x74, 0x00, 0x05, 0x22, 0xf3, 0x3d, 0x37, 0x51, 0xe2, 0x59, 0x86, 0x57, 0x6f, 0x4a,
+0xa5, 0x34, 0x6c, 0x18, 0xc0, 0xf9, 0x0b, 0xdc, 0x43, 0xc3, 0xcb, 0xb1, 0x36, 0xa9, 0x7a, 0xaa,
+0xa3, 0xb5, 0xe7, 0xc9, 0xdc, 0xe4, 0x10, 0x03, 0xeb, 0x1f, 0xbb, 0x37, 0x13, 0x47, 0x5b, 0x4c,
+0x67, 0x47, 0x61, 0x39, 0x9f, 0x24, 0x9e, 0x0c, 0x4c, 0xf4, 0xc3, 0xde, 0xa1, 0xcd, 0x0d, 0xc2,
+0x7b, 0xbc, 0xc7, 0xbd, 0x4d, 0xc6, 0x03, 0xd6, 0x8a, 0xeb, 0xc4, 0x03, 0x3a, 0x1b, 0xb7, 0x2d,
+0xc3, 0x38, 0x9d, 0x3a, 0x13, 0x34, 0xdd, 0x26, 0x08, 0x16, 0x4e, 0x04, 0x1e, 0xf4, 0xc6, 0xe6,
+0x85, 0xdc, 0x67, 0xd5, 0x85, 0xd1, 0xb3, 0xd1, 0xd5, 0xd6, 0x59, 0xe1, 0x7c, 0xf0, 0xe2, 0x01,
+0x4c, 0x12, 0x93, 0x1e, 0x99, 0x24, 0x1b, 0x24, 0x3f, 0x1e, 0x4e, 0x15, 0x7a, 0x0b, 0xac, 0x02,
+0x6c, 0xfb, 0xaa, 0xf5, 0xe2, 0xf0, 0xa4, 0xec, 0xf6, 0xe8, 0xa6, 0xe6, 0x06, 0xe7, 0xe8, 0xea,
+0xfc, 0xf1, 0xee, 0xfa, 0x60, 0x03, 0x9e, 0x09, 0x90, 0x0c, 0x78, 0x0c, 0x7a, 0x0a, 0x52, 0x08,
+0x12, 0x07, 0xdc, 0x06, 0x8a, 0x07, 0xe4, 0x07, 0x26, 0x07, 0x40, 0x04, 0x68, 0xff, 0x42, 0xf9,
+0x62, 0xf3, 0x16, 0xef, 0x20, 0xed, 0x60, 0xed, 0x0a, 0xef, 0x86, 0xf1, 0x36, 0xf4, 0x62, 0xf7,
+0x70, 0xfb, 0xc2, 0x00, 0x60, 0x07, 0xc0, 0x0e, 0xbe, 0x15, 0x0e, 0x1b, 0x53, 0x1d, 0x62, 0x1b,
+0xa2, 0x14, 0xd2, 0x09, 0x7c, 0xfc, 0x10, 0xef, 0x85, 0xe3, 0x8d, 0xdb, 0xe7, 0xd7, 0xa1, 0xd8,
+0x63, 0xdd, 0x50, 0xe5, 0xf4, 0xef, 0x6c, 0xfc, 0x58, 0x0a, 0x64, 0x18, 0x45, 0x25, 0x01, 0x2f,
+0x7f, 0x33, 0x09, 0x31, 0x8d, 0x26, 0x08, 0x15, 0xd2, 0xfe, 0xe8, 0xe7, 0x17, 0xd4, 0x8d, 0xc6,
+0xc7, 0xc0, 0xb5, 0xc2, 0x3d, 0xcb, 0xa1, 0xd8, 0x98, 0xe9, 0xbe, 0xfc, 0x14, 0x11, 0x0b, 0x25,
+0xc3, 0x36, 0x73, 0x43, 0x37, 0x48, 0xcb, 0x42, 0x79, 0x32, 0xf4, 0x18, 0x42, 0xfa, 0xf1, 0xdb,
+0x41, 0xc3, 0xa3, 0xb3, 0x43, 0xae, 0x6d, 0xb2, 0x5f, 0xbe, 0x69, 0xd0, 0xa8, 0xe6, 0xd6, 0xff,
+0xfc, 0x19, 0x4d, 0x33, 0xa3, 0x48, 0x9a, 0x56, 0x7e, 0x59, 0x43, 0x4f, 0x1b, 0x38, 0x22, 0x17,
+0xd8, 0xf1, 0xab, 0xce, 0x8f, 0xb3, 0x7a, 0xa3, 0x62, 0x9f, 0xf0, 0xa5, 0x93, 0xb5, 0x4f, 0xcc,
+0x40, 0xe8, 0x24, 0x07, 0x67, 0x26, 0x37, 0x43, 0x70, 0x59, 0x32, 0x65, 0x30, 0x63, 0xb9, 0x52,
+0xc1, 0x35, 0x72, 0x10, 0xb8, 0xe8, 0x95, 0xc4, 0x5c, 0xa9, 0xd6, 0x99, 0xba, 0x96, 0x28, 0x9f,
+0xd1, 0xb1, 0xf5, 0xcc, 0x06, 0xee, 0xd8, 0x11, 0xb5, 0x34, 0xa3, 0x52, 0x2c, 0x67, 0xb2, 0x6e,
+0x5a, 0x67, 0xdf, 0x51, 0x57, 0x31, 0x06, 0x0a, 0x45, 0xe1, 0xab, 0xbc, 0x6e, 0xa1, 0xac, 0x92,
+0x44, 0x91, 0xbe, 0x9c, 0x5d, 0xb3, 0x3f, 0xd3, 0x82, 0xf8, 0x0d, 0x1f, 0x19, 0x42, 0x48, 0x5d,
+0xee, 0x6c, 0xb2, 0x6e, 0x8a, 0x62, 0x29, 0x4a, 0xc9, 0x28, 0xfe, 0x01, 0x95, 0xda, 0xa5, 0xb7,
+0x2a, 0x9e, 0x6c, 0x91, 0x9c, 0x92, 0x88, 0xa1, 0x47, 0xbc, 0x83, 0xdf, 0x54, 0x06, 0x87, 0x2b,
+0x83, 0x4a, 0xd4, 0x5f, 0x8a, 0x69, 0xd6, 0x66, 0xc0, 0x58, 0xc5, 0x40, 0x35, 0x21, 0xd6, 0xfc,
+0x9d, 0xd7, 0xc5, 0xb6, 0x60, 0x9f, 0x18, 0x95, 0x72, 0x99, 0xad, 0xab, 0x09, 0xc9, 0xcc, 0xec,
+0x68, 0x11, 0xaf, 0x31, 0x5d, 0x4a, 0x90, 0x59, 0xce, 0x5e, 0x50, 0x5a, 0x9b, 0x4c, 0xcd, 0x36,
+0xea, 0x19, 0x7c, 0xf8, 0x39, 0xd6, 0xa3, 0xb8, 0xb6, 0xa4, 0x4a, 0x9e, 0x3a, 0xa6, 0xf5, 0xba,
+0x65, 0xd8, 0x34, 0xf9, 0x3c, 0x18, 0xad, 0x31, 0xc1, 0x43, 0xc9, 0x4d, 0x39, 0x50, 0x13, 0x4b,
+0xc9, 0x3e, 0x5f, 0x2b, 0xdc, 0x11, 0x70, 0xf4, 0x17, 0xd7, 0xb5, 0xbe, 0x15, 0xb0, 0xdf, 0xad,
+0x2f, 0xb8, 0x57, 0xcc, 0xd6, 0xe5, 0x30, 0x00, 0x8a, 0x17, 0xd1, 0x29, 0x25, 0x36, 0xa7, 0x3c,
+0x9b, 0x3d, 0x3d, 0x39, 0x53, 0x2f, 0xd7, 0x1f, 0x82, 0x0b, 0x6c, 0xf4, 0xeb, 0xdd, 0x35, 0xcc,
+0xbb, 0xc2, 0x3b, 0xc3, 0xdd, 0xcc, 0xcb, 0xdc, 0x8e, 0xef, 0xd4, 0x01, 0x6c, 0x11, 0x25, 0x1d,
+0xcb, 0x24, 0xa5, 0x28, 0x0f, 0x29, 0xf5, 0x25, 0x6f, 0x1f, 0x4e, 0x15, 0x06, 0x08, 0x06, 0xf9,
+0x78, 0xea, 0x33, 0xdf, 0x7d, 0xd9, 0x15, 0xda, 0x29, 0xe0, 0xe0, 0xe9, 0xcc, 0xf4, 0x26, 0xff,
+0xa4, 0x07, 0xa4, 0x0d, 0x56, 0x11, 0x1c, 0x13, 0x62, 0x13, 0xae, 0x12, 0x08, 0x11, 0x42, 0x0e,
+0x1c, 0x0a, 0x76, 0x04, 0xe2, 0xfd, 0x9a, 0xf7, 0xe6, 0xf2, 0x92, 0xf0, 0xba, 0xf0, 0x94, 0xf2,
+0x68, 0xf5, 0x08, 0xf8, 0xf8, 0xf9, 0xe0, 0xfa, 0x44, 0xfb, 0xd8, 0xfb, 0xb2, 0xfd, 0x5e, 0x01,
+0x20, 0x07, 0xb6, 0x0d, 0x30, 0x13, 0xe8, 0x15, 0xda, 0x14, 0x8a, 0x10, 0x50, 0x0a, 0x82, 0x03,
+0x3e, 0xfd, 0xe8, 0xf7, 0x04, 0xf3, 0x5e, 0xee, 0xd4, 0xe9, 0xd4, 0xe5, 0x9d, 0xe3, 0xa4, 0xe4,
+0x20, 0xea, 0xd0, 0xf4, 0x92, 0x03, 0xc2, 0x13, 0xd9, 0x21, 0x8f, 0x2a, 0x79, 0x2c, 0xf9, 0x27,
+0xc5, 0x1e, 0xf6, 0x12, 0x66, 0x06, 0xb8, 0xf9, 0x5e, 0xed, 0x5d, 0xe1, 0xa1, 0xd6, 0xc1, 0xce,
+0xd5, 0xcb, 0xd3, 0xcf, 0xb7, 0xdb, 0xde, 0xee, 0x9e, 0x06, 0xd7, 0x1e, 0xab, 0x32, 0xeb, 0x3e,
+0xd9, 0x41, 0x2d, 0x3c, 0xc3, 0x2f, 0x05, 0x1f, 0xf0, 0x0b, 0xd8, 0xf7, 0x79, 0xe3, 0x7b, 0xd0,
+0x39, 0xc1, 0x37, 0xb8, 0xfb, 0xb7, 0xc1, 0xc1, 0x25, 0xd5, 0xfe, 0xef, 0x5e, 0x0e, 0x5f, 0x2b,
+0x9f, 0x42, 0x83, 0x50, 0x93, 0x53, 0x49, 0x4c, 0x67, 0x3c, 0x4d, 0x26, 0x5c, 0x0c, 0x96, 0xf0,
+0x61, 0xd5, 0xb5, 0xbd, 0xeb, 0xac, 0x24, 0xa6, 0xb2, 0xaa, 0xad, 0xba, 0x79, 0xd4, 0xca, 0xf4,
+0x22, 0x17, 0xf1, 0x36, 0xd9, 0x4f, 0xa8, 0x5e, 0x5e, 0x61, 0xd4, 0x57, 0xed, 0x43, 0x11, 0x28,
+0x4e, 0x07, 0x12, 0xe5, 0x63, 0xc5, 0x47, 0xac, 0x74, 0x9d, 0xbc, 0x9a, 0x9e, 0xa4, 0xdb, 0xb9,
+0xdb, 0xd7, 0x34, 0xfb, 0xa7, 0x1f, 0xd9, 0x40, 0xc2, 0x5a, 0xac, 0x69, 0x1c, 0x6b, 0x9a, 0x5e,
+0xb1, 0x45, 0xdf, 0x23, 0x8e, 0xfd, 0x5f, 0xd7, 0xaf, 0xb6, 0xc0, 0x9f, 0xf0, 0x94, 0xea, 0x96,
+0xea, 0xa4, 0x1d, 0xbd, 0x37, 0xdd, 0xb2, 0x01, 0xe7, 0x26, 0xbf, 0x48, 0xd4, 0x62, 0xd6, 0x70,
+0xda, 0x6f, 0x14, 0x5f, 0x41, 0x41, 0xc8, 0x1a, 0x5a, 0xf1, 0x15, 0xcb, 0xe7, 0xac, 0x20, 0x9a,
+0xec, 0x93, 0xa2, 0x99, 0xf0, 0xa9, 0x8f, 0xc3, 0xfc, 0xe3, 0x78, 0x08, 0x85, 0x2d, 0xc3, 0x4e,
+0x9a, 0x67, 0x12, 0x73, 0x2a, 0x6e, 0x1e, 0x59, 0x89, 0x37, 0xf0, 0x0e, 0x04, 0xe6, 0x7b, 0xc2,
+0xb2, 0xa8, 0xd6, 0x9a, 0x92, 0x98, 0x0e, 0xa1, 0xe9, 0xb2, 0xe1, 0xcc, 0xf4, 0xec, 0x80, 0x10,
+0xc3, 0x33, 0x9d, 0x52, 0xa4, 0x67, 0x76, 0x6e, 0x1c, 0x65, 0xf1, 0x4c, 0x8b, 0x2a, 0x1a, 0x04,
+0x55, 0xdf, 0x4b, 0xc1, 0xf5, 0xac, 0x38, 0xa3, 0xa4, 0xa3, 0x3f, 0xad, 0x1f, 0xbf, 0x19, 0xd8,
+0x5a, 0xf6, 0xfa, 0x16, 0x59, 0x36, 0xe5, 0x4f, 0x56, 0x5f, 0x64, 0x61, 0x52, 0x55, 0x83, 0x3d,
+0x41, 0x1e, 0xf8, 0xfc, 0x5b, 0xde, 0x61, 0xc6, 0xc1, 0xb6, 0x5b, 0xb0, 0x79, 0xb2, 0x97, 0xbc,
+0xc1, 0xcd, 0xca, 0xe4, 0x98, 0xff, 0x38, 0x1b, 0x5d, 0x34, 0x6d, 0x47, 0x67, 0x51, 0x3b, 0x50,
+0x4d, 0x44, 0x7b, 0x2f, 0xa8, 0x15, 0xc4, 0xfa, 0x93, 0xe2, 0x0b, 0xd0, 0xaf, 0xc4, 0xe3, 0xc0,
+0x7b, 0xc4, 0x8b, 0xce, 0xd1, 0xdd, 0xbe, 0xf0, 0xdc, 0x04, 0x58, 0x18, 0x45, 0x29, 0xb9, 0x35,
+0x09, 0x3c, 0x23, 0x3b, 0xa5, 0x32, 0x03, 0x24, 0x48, 0x11, 0x6a, 0xfd, 0x6e, 0xeb, 0x9b, 0xdd,
+0x99, 0xd5, 0xc9, 0xd3, 0xcd, 0xd7, 0x55, 0xe0, 0xce, 0xeb, 0x2a, 0xf8, 0x6a, 0x04, 0x5e, 0x0f,
+0xc6, 0x18, 0x0d, 0x20, 0x95, 0x24, 0x61, 0x25, 0xcd, 0x21, 0xca, 0x19, 0x96, 0x0e, 0x5a, 0x02,
+0x3a, 0xf7, 0x54, 0xef, 0x7e, 0xeb, 0xbe, 0xeb, 0xf0, 0xee, 0x64, 0xf3, 0x60, 0xf7, 0x6e, 0xfa,
+0x80, 0xfc, 0xa0, 0xfe, 0xd6, 0x01, 0x64, 0x06, 0xe0, 0x0b, 0xc4, 0x10, 0x50, 0x13, 0xce, 0x12,
+0xa4, 0x0f, 0x00, 0x0b, 0xee, 0x06, 0x46, 0x04, 0x72, 0x03, 0x8c, 0x03, 0xf2, 0x02, 0x74, 0x00,
+0xba, 0xfb, 0x52, 0xf5, 0x14, 0xef, 0xec, 0xea, 0x7c, 0xea, 0x9a, 0xee, 0x2c, 0xf6, 0x64, 0xff,
+0x34, 0x08, 0x10, 0x0f, 0xe0, 0x13, 0x28, 0x17, 0x6a, 0x19, 0x10, 0x1b, 0x3c, 0x1b, 0xc2, 0x18,
+0x88, 0x12, 0x52, 0x08, 0xe0, 0xfa, 0x88, 0xec, 0x8b, 0xdf, 0xbb, 0xd6, 0x21, 0xd4, 0x31, 0xd8,
+0x3f, 0xe2, 0x48, 0xf0, 0xe2, 0xff, 0x2a, 0x0f, 0xf1, 0x1c, 0x0d, 0x28, 0xfd, 0x2f, 0x99, 0x33,
+0xc3, 0x31, 0xf5, 0x29, 0x51, 0x1c, 0xca, 0x09, 0xdc, 0xf4, 0xdd, 0xdf, 0x03, 0xce, 0x37, 0xc2,
+0x6b, 0xbe, 0xb5, 0xc3, 0x77, 0xd1, 0xba, 0xe5, 0x90, 0xfd, 0x14, 0x16, 0xef, 0x2b, 0x01, 0x3d,
+0x19, 0x47, 0x13, 0x49, 0x9f, 0x42, 0x5d, 0x34, 0xc5, 0x1f, 0x0a, 0x07, 0x90, 0xec, 0x33, 0xd3,
+0x11, 0xbe, 0x47, 0xb0, 0x6f, 0xac, 0xed, 0xb3, 0x8f, 0xc6, 0xe1, 0xe1, 0x26, 0x02, 0x19, 0x22,
+0x6d, 0x3d, 0x69, 0x50, 0x50, 0x59, 0x82, 0x57, 0xd5, 0x4b, 0x37, 0x38, 0xc5, 0x1e, 0xe8, 0x01,
+0xad, 0xe3, 0x27, 0xc7, 0x91, 0xaf, 0xdc, 0xa0, 0xfe, 0x9d, 0x04, 0xa9, 0x91, 0xc1, 0x4c, 0xe4,
+0x6a, 0x0b, 0x51, 0x30, 0x8b, 0x4d, 0xc2, 0x5f, 0xd0, 0x65, 0xf6, 0x5f, 0x35, 0x50, 0xb3, 0x38,
+0xe8, 0x1b, 0x8c, 0xfb, 0x53, 0xda, 0x2d, 0xbb, 0x8c, 0xa2, 0x8e, 0x94, 0xc8, 0x94, 0x1e, 0xa5,
+0x09, 0xc4, 0xaa, 0xec, 0x86, 0x17, 0xa7, 0x3d, 0x92, 0x59, 0x1e, 0x69, 0xb0, 0x6b, 0x7e, 0x62,
+0xad, 0x4f, 0x83, 0x35, 0xe4, 0x15, 0x06, 0xf3, 0xa3, 0xcf, 0xc3, 0xaf, 0x5e, 0x98, 0xc0, 0x8d,
+0x1a, 0x93, 0x08, 0xa9, 0x97, 0xcc, 0x64, 0xf7, 0x2d, 0x22, 0xe9, 0x45, 0xf4, 0x5e, 0x76, 0x6b,
+0x6a, 0x6b, 0xfe, 0x5f, 0x27, 0x4b, 0xef, 0x2e, 0x52, 0x0d, 0x04, 0xe9, 0x5b, 0xc5, 0x98, 0xa7,
+0x0c, 0x94, 0x9c, 0x8e, 0xf4, 0x98, 0x59, 0xb2, 0xe5, 0xd6, 0x58, 0x00, 0xf3, 0x27, 0x57, 0x48,
+0x78, 0x5e, 0x90, 0x68, 0xa2, 0x66, 0x70, 0x59, 0xe5, 0x42, 0x2b, 0x25, 0xba, 0x02, 0x11, 0xdf,
+0x85, 0xbe, 0x96, 0xa5, 0xea, 0x97, 0xb2, 0x97, 0x2c, 0xa5, 0x0d, 0xbf, 0x65, 0xe1, 0xf2, 0x06,
+0x59, 0x2a, 0xf7, 0x46, 0xce, 0x59, 0x54, 0x61, 0xdc, 0x5c, 0x97, 0x4d, 0x9b, 0x35, 0x82, 0x17,
+0xda, 0xf6, 0x75, 0xd7, 0x25, 0xbd, 0x3c, 0xab, 0xbc, 0xa3, 0xd4, 0xa6, 0xe7, 0xb4, 0x0f, 0xcc,
+0xc2, 0xe9, 0xfe, 0x09, 0x2d, 0x28, 0x4b, 0x40, 0x89, 0x4f, 0xf9, 0x53, 0x33, 0x4d, 0x1b, 0x3d,
+0x91, 0x25, 0x8e, 0x0a, 0x50, 0xef, 0x35, 0xd7, 0xd7, 0xc4, 0xc5, 0xb9, 0x09, 0xb6, 0x13, 0xba,
+0x99, 0xc5, 0xff, 0xd7, 0xce, 0xef, 0xba, 0x09, 0x39, 0x22, 0x8b, 0x35, 0xe5, 0x40, 0x93, 0x42,
+0xf5, 0x3a, 0x97, 0x2b, 0xb4, 0x17, 0x6a, 0x02, 0xc0, 0xee, 0xd1, 0xde, 0x75, 0xd3, 0xf9, 0xcc,
+0xfb, 0xca, 0x85, 0xcd, 0x25, 0xd5, 0xdf, 0xe1, 0x08, 0xf3, 0x58, 0x06, 0xac, 0x18, 0xa7, 0x26,
+0xf7, 0x2d, 0x9f, 0x2d, 0x45, 0x26, 0x7e, 0x1a, 0xa8, 0x0c, 0xaa, 0xff, 0xfc, 0xf4, 0x1c, 0xed,
+0xc0, 0xe7, 0x2e, 0xe4, 0x01, 0xe2, 0x7f, 0xe1, 0x04, 0xe4, 0xe8, 0xe9, 0x70, 0xf3, 0xfe, 0xfe,
+0x0c, 0x0a, 0x94, 0x12, 0xac, 0x16, 0x24, 0x16, 0x1a, 0x12, 0x70, 0x0c, 0xe8, 0x06, 0xde, 0x02,
+0x54, 0x00, 0xbc, 0xfe, 0x3a, 0xfd, 0xda, 0xfa, 0x48, 0xf7, 0x32, 0xf3, 0xba, 0xef, 0x2e, 0xee,
+0x32, 0xef, 0x6e, 0xf2, 0xce, 0xf6, 0x1e, 0xfb, 0x94, 0xfe, 0xce, 0x00, 0xb4, 0x02, 0xe6, 0x04,
+0xe8, 0x07, 0xd4, 0x0b, 0xbc, 0x0f, 0xaa, 0x12, 0x9a, 0x13, 0x5c, 0x11, 0xa6, 0x0b, 0xe6, 0x02,
+0x74, 0xf8, 0x26, 0xee, 0x0c, 0xe6, 0x11, 0xe1, 0xd1, 0xdf, 0x09, 0xe2, 0xf8, 0xe6, 0x38, 0xee,
+0xfe, 0xf6, 0x06, 0x01, 0x84, 0x0b, 0x26, 0x16, 0x91, 0x1f, 0x9d, 0x26, 0x95, 0x29, 0xe7, 0x26,
+0x05, 0x1e, 0x46, 0x0f, 0x8c, 0xfc, 0xd4, 0xe8, 0xbb, 0xd7, 0x13, 0xcc, 0x99, 0xc7, 0x45, 0xca,
+0xdb, 0xd2, 0xf1, 0xdf, 0xde, 0xef, 0x30, 0x01, 0xd6, 0x12, 0x67, 0x23, 0xaf, 0x31, 0x97, 0x3b,
+0x21, 0x3f, 0x03, 0x3a, 0xb5, 0x2b, 0x14, 0x15, 0x3e, 0xf9, 0xf7, 0xdc, 0x41, 0xc5, 0x53, 0xb6,
+0xd3, 0xb1, 0x77, 0xb7, 0xd5, 0xc4, 0xd5, 0xd7, 0xf0, 0xed, 0x6c, 0x05, 0x99, 0x1c, 0x05, 0x32,
+0x7b, 0x43, 0x9d, 0x4e, 0x85, 0x50, 0x03, 0x47, 0x1b, 0x32, 0xb8, 0x13, 0x86, 0xf0, 0x6f, 0xce,
+0x99, 0xb3, 0xf2, 0xa3, 0x2a, 0xa1, 0xc0, 0xa9, 0x39, 0xbb, 0x19, 0xd3, 0xbe, 0xee, 0x02, 0x0c,
+0xa3, 0x28, 0x07, 0x42, 0x4c, 0x55, 0x4c, 0x5f, 0x0e, 0x5d, 0x51, 0x4d, 0x75, 0x31, 0xe4, 0x0c,
+0x4a, 0xe5, 0x43, 0xc1, 0x3e, 0xa6, 0x2c, 0x98, 0x9a, 0x97, 0x22, 0xa3, 0x43, 0xb8, 0x73, 0xd4,
+0x7e, 0xf4, 0xbe, 0x15, 0x49, 0x35, 0xdf, 0x4f, 0x62, 0x62, 0xfa, 0x68, 0xa4, 0x61, 0x79, 0x4c,
+0x19, 0x2c, 0x90, 0x04, 0xc3, 0xdb, 0x6b, 0xb7, 0x18, 0x9d, 0x40, 0x90, 0x30, 0x91, 0x14, 0x9f,
+0x7f, 0xb7, 0xb5, 0xd7, 0x06, 0xfc, 0xf1, 0x20, 0x39, 0x42, 0x4a, 0x5c, 0x74, 0x6b, 0xdc, 0x6c,
+0x34, 0x60, 0xcf, 0x46, 0x33, 0x24, 0x68, 0xfc, 0x7b, 0xd4, 0xe1, 0xb1, 0x80, 0x99, 0x6c, 0x8e,
+0x9a, 0x91, 0x2a, 0xa2, 0xe9, 0xbd, 0x91, 0xe1, 0x8a, 0x08, 0xd3, 0x2d, 0x25, 0x4d, 0x6e, 0x62,
+0x80, 0x6b, 0x5a, 0x67, 0xbc, 0x56, 0x4b, 0x3c, 0xa2, 0x1a, 0x36, 0xf5, 0x29, 0xd0, 0x5b, 0xb0,
+0x3c, 0x9a, 0x76, 0x91, 0xf4, 0x96, 0x36, 0xaa, 0xf1, 0xc8, 0x24, 0xee, 0x8a, 0x14, 0xed, 0x36,
+0xeb, 0x50, 0x4e, 0x60, 0x22, 0x64, 0x7a, 0x5c, 0x45, 0x4b, 0x75, 0x32, 0xb8, 0x13, 0xbc, 0xf1,
+0x07, 0xd0, 0xff, 0xb2, 0xb6, 0x9f, 0x66, 0x99, 0x6c, 0xa1, 0x13, 0xb7, 0x79, 0xd6, 0x48, 0xfa,
+0xc9, 0x1c, 0x0d, 0x39, 0x8d, 0x4c, 0x3e, 0x56, 0x52, 0x56, 0xb9, 0x4d, 0x11, 0x3e, 0x0f, 0x28,
+0x46, 0x0d, 0x60, 0xef, 0xb9, 0xd1, 0x09, 0xb9, 0xc4, 0xa9, 0x24, 0xa7, 0xbb, 0xb1, 0xd7, 0xc7,
+0xe8, 0xe4, 0xa4, 0x03, 0xd9, 0x1e, 0xa9, 0x33, 0xa9, 0x40, 0xff, 0x45, 0x59, 0x44, 0x9f, 0x3c,
+0x8d, 0x2f, 0xe3, 0x1d, 0xf0, 0x07, 0x90, 0xef, 0xf1, 0xd7, 0x1d, 0xc5, 0xe9, 0xba, 0x51, 0xbb,
+0x5b, 0xc6, 0x4b, 0xd9, 0x62, 0xf0, 0xc8, 0x06, 0xd2, 0x19, 0x57, 0x27, 0x4d, 0x2f, 0x0d, 0x32,
+0x2d, 0x30, 0x65, 0x2a, 0x1f, 0x21, 0x88, 0x14, 0xe8, 0x04, 0xe8, 0xf3, 0x75, 0xe3, 0xd5, 0xd6,
+0x71, 0xd0, 0x81, 0xd1, 0x7f, 0xd9, 0xa0, 0xe6, 0x9a, 0xf5, 0xde, 0x03, 0x52, 0x0f, 0x20, 0x17,
+0x6c, 0x1b, 0xb3, 0x1c, 0x82, 0x1b, 0x60, 0x18, 0xc6, 0x13, 0x9e, 0x0d, 0x1e, 0x06, 0x72, 0xfd,
+0xca, 0xf4, 0x88, 0xed, 0xec, 0xe8, 0xe2, 0xe7, 0x86, 0xea, 0xdc, 0xef, 0x6a, 0xf6, 0xa0, 0xfc,
+0x58, 0x01, 0x30, 0x04, 0x7a, 0x05, 0xb8, 0x05, 0xd2, 0x05, 0xcc, 0x06, 0xd2, 0x08, 0x64, 0x0b,
+0x78, 0x0d, 0xda, 0x0d, 0xa2, 0x0b, 0x1e, 0x07, 0x6e, 0x01, 0xcc, 0xfb, 0x64, 0xf7, 0x6a, 0xf4,
+0x94, 0xf2, 0x4e, 0xf1, 0xf2, 0xef, 0x8a, 0xee, 0xd6, 0xed, 0xca, 0xee, 0x6c, 0xf2, 0xb6, 0xf9,
+0x36, 0x04, 0x66, 0x10, 0x88, 0x1b, 0x99, 0x22, 0xe3, 0x23, 0x73, 0x1f, 0x78, 0x16, 0x20, 0x0b,
+0x92, 0xff, 0xe6, 0xf4, 0x84, 0xeb, 0x61, 0xe3, 0xaf, 0xdc, 0x13, 0xd8, 0xc3, 0xd6, 0x25, 0xda,
+0x7d, 0xe3, 0xf2, 0xf2, 0xac, 0x06, 0x80, 0x1b, 0x47, 0x2d, 0x8f, 0x38, 0x11, 0x3b, 0xeb, 0x34,
+0xfd, 0x27, 0x04, 0x17, 0x96, 0x04, 0x68, 0xf2, 0xc1, 0xe1, 0x53, 0xd3, 0x3f, 0xc8, 0xd9, 0xc1,
+0x09, 0xc2, 0x2f, 0xca, 0xe5, 0xda, 0x9e, 0xf2, 0x36, 0x0e, 0x43, 0x29, 0x37, 0x3f, 0x17, 0x4c,
+0x3b, 0x4e, 0xe7, 0x45, 0xdf, 0x34, 0x7b, 0x1e, 0x7e, 0x05, 0x50, 0xec, 0xbf, 0xd4, 0x17, 0xc1,
+0x41, 0xb3, 0xcd, 0xad, 0x2d, 0xb2, 0x07, 0xc1, 0x65, 0xd9, 0x34, 0xf8, 0x1e, 0x19, 0x7d, 0x37,
+0xf1, 0x4e, 0x0e, 0x5c, 0x26, 0x5d, 0x1f, 0x52, 0x31, 0x3d, 0x7b, 0x21, 0x40, 0x02, 0x59, 0xe2,
+0x67, 0xc5, 0xa7, 0xae, 0x8a, 0xa1, 0xb4, 0x9f, 0xcc, 0xa9, 0x07, 0xbf, 0xeb, 0xdc, 0xb0, 0xff,
+0xdf, 0x22, 0x81, 0x42, 0x5c, 0x5a, 0x6c, 0x67, 0x36, 0x67, 0xb6, 0x59, 0xc5, 0x40, 0xb9, 0x1f,
+0x72, 0xfa, 0x6b, 0xd5, 0xa1, 0xb5, 0x8a, 0x9f, 0xc4, 0x95, 0x06, 0x99, 0x88, 0xa8, 0x39, 0xc2,
+0x1d, 0xe3, 0x7e, 0x07, 0x6d, 0x2b, 0x01, 0x4b, 0xd6, 0x62, 0x1a, 0x6f, 0x2c, 0x6d, 0x52, 0x5c,
+0xa9, 0x3e, 0x4a, 0x18, 0x78, 0xee, 0x41, 0xc7, 0x44, 0xa8, 0xc8, 0x95, 0x1c, 0x91, 0x84, 0x99,
+0xe9, 0xac, 0x0f, 0xc9, 0x02, 0xeb, 0x38, 0x0f, 0x65, 0x32, 0x2d, 0x51, 0xa2, 0x67, 0xbe, 0x71,
+0x92, 0x6c, 0xbc, 0x57, 0xfd, 0x35, 0x84, 0x0c, 0xd9, 0xe1, 0x97, 0xbc, 0x06, 0xa2, 0xc8, 0x94,
+0xe8, 0x94, 0x90, 0xa0, 0xad, 0xb5, 0xf5, 0xd1, 0xc6, 0xf2, 0x8e, 0x15, 0x27, 0x37, 0xfb, 0x53,
+0xea, 0x67, 0xde, 0x6e, 0xf4, 0x65, 0xb3, 0x4d, 0xff, 0x29, 0xc4, 0x00, 0xf1, 0xd8, 0x7d, 0xb8,
+0x56, 0xa3, 0xd6, 0x9a, 0x42, 0x9e, 0x8b, 0xab, 0xb9, 0xc0, 0xeb, 0xdb, 0xea, 0xfa, 0x24, 0x1b,
+0xa1, 0x39, 0xdb, 0x52, 0x78, 0x62, 0xca, 0x64, 0x7c, 0x58, 0x39, 0x3f, 0x1d, 0x1d, 0x26, 0xf8,
+0x3d, 0xd6, 0x19, 0xbc, 0x7b, 0xac, 0xd4, 0xa7, 0xff, 0xac, 0x53, 0xba, 0x4d, 0xce, 0xf8, 0xe6,
+0x70, 0x02, 0x6d, 0x1e, 0x05, 0x38, 0x77, 0x4b, 0xb4, 0x55, 0x9b, 0x54, 0xa3, 0x47, 0xab, 0x30,
+0xa4, 0x13, 0x48, 0xf5, 0x15, 0xda, 0xc7, 0xc5, 0x13, 0xba, 0x79, 0xb7, 0x25, 0xbd, 0xb9, 0xc9,
+0x81, 0xdb, 0xf4, 0xf0, 0xba, 0x07, 0x87, 0x1d, 0x05, 0x30, 0xe3, 0x3c, 0x63, 0x42, 0x8f, 0x3f,
+0xbf, 0x34, 0x21, 0x23, 0x86, 0x0d, 0x3a, 0xf7, 0x95, 0xe3, 0xf3, 0xd4, 0x1d, 0xcd, 0x25, 0xcc,
+0x95, 0xd1, 0x21, 0xdc, 0x0e, 0xea, 0x68, 0xf9, 0x92, 0x08, 0x4e, 0x16, 0x61, 0x21, 0x05, 0x29,
+0x8f, 0x2c, 0x99, 0x2b, 0x81, 0x25, 0xaa, 0x1a, 0x56, 0x0c, 0x10, 0xfd, 0x76, 0xef, 0xce, 0xe5,
+0x2f, 0xe1, 0xb7, 0xe1, 0x80, 0xe6, 0xb2, 0xed, 0x98, 0xf5, 0xe6, 0xfc, 0xe2, 0x02, 0x82, 0x07,
+0x92, 0x0b, 0x96, 0x0f, 0x8e, 0x13, 0x78, 0x16, 0x16, 0x17, 0x86, 0x14, 0xe6, 0x0e, 0xac, 0x07,
+0xac, 0x00, 0x90, 0xfb, 0x2e, 0xf9, 0x2c, 0xf9, 0x2a, 0xfa, 0xfa, 0xfa, 0x82, 0xfa, 0x5e, 0xf8,
+0x70, 0xf5, 0x64, 0xf3, 0xc8, 0xf3, 0x5c, 0xf7, 0x00, 0xfe, 0x0a, 0x06, 0x62, 0x0d, 0x64, 0x12,
+0x9a, 0x14, 0x7c, 0x14, 0x4a, 0x13, 0xea, 0x11, 0x72, 0x10, 0x40, 0x0e, 0x28, 0x0a, 0x42, 0x03,
+0xc8, 0xf9, 0x44, 0xef, 0x78, 0xe5, 0xa7, 0xde, 0xe7, 0xdc, 0x19, 0xe1, 0x8a, 0xea, 0x78, 0xf7,
+0x78, 0x05, 0x50, 0x12, 0xb9, 0x1c, 0x1f, 0x24, 0x67, 0x28, 0x79, 0x29, 0x17, 0x27, 0x53, 0x20,
+0xd0, 0x14, 0x50, 0x05, 0x92, 0xf3, 0xeb, 0xe1, 0xff, 0xd2, 0x63, 0xc9, 0xf9, 0xc6, 0xd1, 0xcc,
+0x41, 0xda, 0x6a, 0xed, 0x3e, 0x03, 0xd2, 0x18, 0x3d, 0x2b, 0xaf, 0x38, 0xe1, 0x3f, 0x27, 0x40,
+0x2f, 0x39, 0x71, 0x2b, 0x18, 0x18, 0x0a, 0x01, 0x16, 0xe9, 0xff, 0xd2, 0x7d, 0xc1, 0x99, 0xb6,
+0xab, 0xb4, 0xc1, 0xbc, 0xb3, 0xce, 0x2c, 0xe8, 0xbe, 0x05, 0xe9, 0x22, 0x9d, 0x3b, 0x9f, 0x4c,
+0xe1, 0x53, 0xf7, 0x50, 0x9d, 0x44, 0xad, 0x30, 0x46, 0x17, 0x62, 0xfb, 0x95, 0xdf, 0x91, 0xc6,
+0xe1, 0xb2, 0x64, 0xa7, 0x4a, 0xa6, 0x3f, 0xb1, 0x2f, 0xc8, 0x82, 0xe8, 0x40, 0x0d, 0x8f, 0x30,
+0x01, 0x4d, 0x98, 0x5e, 0xa2, 0x63, 0x3c, 0x5c, 0x7f, 0x4a, 0x5b, 0x31, 0xf4, 0x13, 0x7e, 0xf4,
+0xa3, 0xd5, 0x51, 0xba, 0xa2, 0xa5, 0x86, 0x9a, 0xe0, 0x9b, 0x73, 0xab, 0x6f, 0xc8, 0x3e, 0xef,
+0x62, 0x19, 0xb1, 0x3f, 0x36, 0x5c, 0x7c, 0x6b, 0x5e, 0x6c, 0x5c, 0x60, 0xa3, 0x4a, 0x61, 0x2e,
+0x4a, 0x0e, 0xb2, 0xec, 0x31, 0xcc, 0xe1, 0xaf, 0xb0, 0x9b, 0x10, 0x93, 0x8e, 0x98, 0x49, 0xad,
+0xb1, 0xcf, 0x80, 0xfa, 0x31, 0x26, 0x77, 0x4b, 0xfc, 0x64, 0x5c, 0x70, 0xb8, 0x6d, 0xe2, 0x5e,
+0xcf, 0x46, 0xcb, 0x28, 0x46, 0x07, 0x5e, 0xe4, 0x21, 0xc3, 0xba, 0xa7, 0x08, 0x96, 0x64, 0x91,
+0xde, 0x9b, 0x57, 0xb5, 0x9d, 0xda, 0xaa, 0x05, 0x1f, 0x2f, 0x8d, 0x50, 0x36, 0x66, 0x62, 0x6e,
+0x54, 0x69, 0xdc, 0x58, 0xd3, 0x3f, 0xd1, 0x20, 0x70, 0xfe, 0xbd, 0xdb, 0x3b, 0xbc, 0x1a, 0xa4,
+0x14, 0x97, 0xaa, 0x97, 0x58, 0xa6, 0xcb, 0xc1, 0x34, 0xe6, 0xc8, 0x0d, 0x8f, 0x32, 0x89, 0x4f,
+0x7c, 0x61, 0xe2, 0x66, 0x1e, 0x60, 0x9f, 0x4e, 0xe5, 0x34, 0xde, 0x15, 0x94, 0xf4, 0x73, 0xd4,
+0x6f, 0xb9, 0x2e, 0xa7, 0xfe, 0x9f, 0xde, 0xa4, 0x65, 0xb5, 0x77, 0xcf, 0xa6, 0xef, 0x92, 0x11,
+0xa1, 0x30, 0xdd, 0x48, 0x62, 0x57, 0xa8, 0x5a, 0x85, 0x52, 0xc7, 0x40, 0xd5, 0x27, 0xc8, 0x0a,
+0x1a, 0xed, 0xa7, 0xd2, 0x73, 0xbe, 0x93, 0xb2, 0x1b, 0xb0, 0xb1, 0xb6, 0x71, 0xc5, 0xc3, 0xda,
+0x94, 0xf4, 0xda, 0x0f, 0x63, 0x29, 0x9b, 0x3d, 0x3b, 0x49, 0xb1, 0x4a, 0x31, 0x42, 0x47, 0x31,
+0x94, 0x1a, 0xd2, 0x01, 0x98, 0xea, 0x9f, 0xd7, 0xb9, 0xca, 0x61, 0xc4, 0x3f, 0xc4, 0xc5, 0xc9,
+0x75, 0xd4, 0xb9, 0xe3, 0x9a, 0xf6, 0x8c, 0x0b, 0x6b, 0x1f, 0xf9, 0x2e, 0x53, 0x37, 0x25, 0x37,
+0xbb, 0x2e, 0x2f, 0x20, 0x86, 0x0e, 0xd6, 0xfc, 0x0e, 0xee, 0x7d, 0xe3, 0x35, 0xdd, 0x71, 0xda,
+0xa1, 0xda, 0x45, 0xdd, 0x93, 0xe2, 0x12, 0xeb, 0xb0, 0xf6, 0x42, 0x04, 0xb0, 0x11, 0x1a, 0x1c,
+0x3b, 0x21, 0x3f, 0x20, 0x34, 0x1a, 0xd4, 0x10, 0xe8, 0x06, 0x98, 0xfe, 0xec, 0xf8, 0x92, 0xf5,
+0xb6, 0xf3, 0x5e, 0xf2, 0xa0, 0xf0, 0xee, 0xee, 0xf2, 0xed, 0xea, 0xee, 0x5e, 0xf2, 0x36, 0xf8,
+0xfa, 0xfe, 0xfe, 0x04, 0xf4, 0x08, 0x44, 0x0a, 0x84, 0x09, 0x26, 0x08, 0x7c, 0x07, 0xfc, 0x07,
+0x46, 0x09, 0x7a, 0x0a, 0x7a, 0x0a, 0x7c, 0x08, 0x14, 0x04, 0x6c, 0xfd, 0xc6, 0xf5, 0x9c, 0xee,
+0x78, 0xe9, 0x1a, 0xe7, 0xf2, 0xe7, 0x50, 0xeb, 0x64, 0xf0, 0x98, 0xf6, 0x78, 0xfd, 0xe6, 0x04,
+0xa8, 0x0c, 0x7e, 0x14, 0x0c, 0x1b, 0x73, 0x1f, 0xa1, 0x20, 0xbd, 0x1d, 0xfc, 0x15, 0xb8, 0x09,
+0x64, 0xfa, 0x2e, 0xea, 0x29, 0xdc, 0xb9, 0xd2, 0x8f, 0xcf, 0xaf, 0xd2, 0x69, 0xdb, 0xda, 0xe7,
+0x84, 0xf6, 0xd6, 0x05, 0xcc, 0x14, 0x2b, 0x22, 0x11, 0x2d, 0xf9, 0x33, 0x8b, 0x35, 0x79, 0x30,
+0x19, 0x24, 0xb8, 0x10, 0x80, 0xf8, 0x81, 0xdf, 0xf7, 0xc9, 0x1f, 0xbc, 0x0d, 0xb8, 0x1b, 0xbe,
+0xed, 0xcb, 0x3d, 0xdf, 0xee, 0xf4, 0xe4, 0x0a, 0x43, 0x1f, 0x09, 0x31, 0xc5, 0x3e, 0xbd, 0x46,
+0x2b, 0x47, 0x49, 0x3e, 0xc9, 0x2b, 0xc0, 0x10, 0xc8, 0xf0, 0xed, 0xd0, 0x6d, 0xb7, 0x9c, 0xa8,
+0x6e, 0xa6, 0x0b, 0xb0, 0xff, 0xc2, 0xa7, 0xdb, 0xc0, 0xf6, 0xc6, 0x11, 0xb7, 0x2a, 0xf7, 0x3f,
+0xb7, 0x4f, 0xaa, 0x57, 0x42, 0x55, 0x51, 0x47, 0xfb, 0x2d, 0xc4, 0x0b, 0x50, 0xe5, 0x57, 0xc1,
+0x1e, 0xa6, 0x1e, 0x98, 0x9c, 0x98, 0x00, 0xa6, 0x59, 0xbd, 0xd9, 0xda, 0xee, 0xfa, 0x3a, 0x1a,
+0xd3, 0x36, 0x4d, 0x4e, 0x1e, 0x5e, 0x2e, 0x63, 0xac, 0x5b, 0x3b, 0x47, 0xa9, 0x27, 0xec, 0x00,
+0x65, 0xd8, 0xad, 0xb4, 0x70, 0x9b, 0x4e, 0x90, 0x82, 0x93, 0xb6, 0xa3, 0xe1, 0xbd, 0x87, 0xde,
+0xc8, 0x01, 0x65, 0x24, 0x1d, 0x43, 0xf2, 0x5a, 0x9e, 0x68, 0x54, 0x69, 0x02, 0x5c, 0x3b, 0x42,
+0x1f, 0x1f, 0xe8, 0xf6, 0xff, 0xce, 0x0b, 0xad, 0x0a, 0x96, 0xc2, 0x8c, 0x08, 0x92, 0x56, 0xa4,
+0x2f, 0xc1, 0xdc, 0xe4, 0x18, 0x0b, 0x8b, 0x2f, 0x2f, 0x4e, 0x7a, 0x63, 0x40, 0x6c, 0x48, 0x67,
+0x32, 0x55, 0xa3, 0x38, 0x08, 0x15, 0x72, 0xee, 0x4d, 0xc9, 0x42, 0xaa, 0xdc, 0x95, 0xd6, 0x8e,
+0x30, 0x96, 0xdc, 0xaa, 0x4f, 0xca, 0x0c, 0xf0, 0x10, 0x17, 0x39, 0x3a, 0x2c, 0x55, 0xb8, 0x64,
+0x72, 0x67, 0x96, 0x5d, 0x2b, 0x49, 0xf9, 0x2c, 0xf0, 0x0b, 0xfa, 0xe8, 0xbb, 0xc7, 0x4f, 0xac,
+0xac, 0x9a, 0xf0, 0x95, 0x64, 0x9f, 0x19, 0xb6, 0xab, 0xd6, 0x18, 0xfc, 0x81, 0x20, 0xbd, 0x3e,
+0x4f, 0x53, 0x7c, 0x5c, 0x7e, 0x5a, 0xbf, 0x4e, 0x91, 0x3b, 0xcb, 0x22, 0x5e, 0x06, 0x54, 0xe8,
+0x83, 0xcb, 0xbf, 0xb3, 0x04, 0xa5, 0xae, 0xa2, 0xa3, 0xad, 0xd3, 0xc4, 0x0e, 0xe4, 0xe2, 0x05,
+0x77, 0x24, 0xd5, 0x3b, 0x93, 0x49, 0xab, 0x4d, 0x5b, 0x49, 0x63, 0x3e, 0x21, 0x2e, 0xf2, 0x19,
+0xbc, 0x02, 0xfe, 0xe9, 0x37, 0xd2, 0x05, 0xbf, 0x13, 0xb4, 0x25, 0xb4, 0xfb, 0xbf, 0x37, 0xd5,
+0xe0, 0xef, 0xbe, 0x0a, 0x9d, 0x21, 0x5b, 0x31, 0x9b, 0x39, 0xd5, 0x3a, 0x67, 0x36, 0x99, 0x2d,
+0x69, 0x21, 0x48, 0x12, 0xe4, 0x00, 0x82, 0xee, 0x01, 0xdd, 0x2f, 0xcf, 0x21, 0xc8, 0x91, 0xc9,
+0x5b, 0xd3, 0x77, 0xe3, 0x66, 0xf6, 0xa2, 0x08, 0x52, 0x17, 0x15, 0x21, 0x87, 0x25, 0xc7, 0x25,
+0xa1, 0x22, 0x0d, 0x1d, 0x90, 0x15, 0xa2, 0x0c, 0x76, 0x02, 0x9a, 0xf7, 0x24, 0xed, 0xa6, 0xe4,
+0xe1, 0xdf, 0xe1, 0xdf, 0xa0, 0xe4, 0x0e, 0xed, 0x16, 0xf7, 0xba, 0x00, 0x5c, 0x08, 0x2a, 0x0d,
+0x56, 0x0f, 0x86, 0x0f, 0x90, 0x0e, 0xfe, 0x0c, 0x9e, 0x0b, 0x4c, 0x0a, 0xc6, 0x08, 0x4c, 0x06,
+0x7e, 0x02, 0x90, 0xfd, 0x88, 0xf8, 0x60, 0xf4, 0xfc, 0xf1, 0xb2, 0xf1, 0x0a, 0xf3, 0xec, 0xf4,
+0xa4, 0xf6, 0xc0, 0xf7, 0x64, 0xf8, 0x3e, 0xf9, 0x42, 0xfb, 0x44, 0xff, 0x66, 0x05, 0x38, 0x0d,
+0xaa, 0x14, 0xa0, 0x19, 0x4a, 0x1a, 0x30, 0x16, 0x22, 0x0e, 0x2c, 0x04, 0x40, 0xfa, 0xbe, 0xf1,
+0x66, 0xeb, 0xf0, 0xe6, 0xb3, 0xe3, 0xe7, 0xe1, 0xf5, 0xe1, 0xd4, 0xe4, 0xa6, 0xeb, 0x16, 0xf7,
+0x46, 0x06, 0x16, 0x17, 0x55, 0x26, 0x33, 0x30, 0x9b, 0x32, 0xd9, 0x2c, 0x8d, 0x20, 0x38, 0x10,
+0xec, 0xfe, 0xc2, 0xee, 0x13, 0xe1, 0x49, 0xd6, 0xa5, 0xce, 0xaf, 0xca, 0xb7, 0xcb, 0xeb, 0xd2,
+0x2b, 0xe1, 0x84, 0xf5, 0xd6, 0x0d, 0x3b, 0x26, 0x47, 0x3a, 0x39, 0x46, 0xa5, 0x47, 0xfb, 0x3e,
+0xb3, 0x2d, 0x64, 0x17, 0x2c, 0xff, 0x32, 0xe8, 0xf1, 0xd3, 0x2b, 0xc4, 0xc9, 0xb9, 0x1b, 0xb6,
+0xbf, 0xba, 0x6f, 0xc8, 0x79, 0xde, 0xb8, 0xfa, 0x6a, 0x19, 0xf3, 0x35, 0x01, 0x4c, 0xee, 0x57,
+0xce, 0x57, 0xcd, 0x4b, 0x63, 0x36, 0xae, 0x1a, 0xa0, 0xfc, 0x55, 0xdf, 0xc9, 0xc5, 0x2f, 0xb2,
+0xf4, 0xa6, 0xdc, 0xa5, 0xc3, 0xaf, 0x81, 0xc4, 0x8d, 0xe1, 0x82, 0x03, 0xc1, 0x25, 0xf1, 0x43,
+0xf4, 0x59, 0xdc, 0x64, 0xa4, 0x62, 0xa5, 0x53, 0x45, 0x3a, 0xd0, 0x19, 0x22, 0xf6, 0x9b, 0xd3,
+0x4b, 0xb6, 0xa6, 0xa1, 0x96, 0x98, 0x5a, 0x9c, 0xb7, 0xac, 0x9b, 0xc7, 0x8c, 0xe9, 0xea, 0x0d,
+0xdf, 0x30, 0x8b, 0x4e, 0x86, 0x63, 0xd0, 0x6c, 0xb2, 0x68, 0xee, 0x56, 0x91, 0x39, 0x4a, 0x14,
+0xa8, 0xeb, 0x8d, 0xc5, 0x58, 0xa7, 0xfe, 0x94, 0xa4, 0x90, 0x50, 0x9a, 0xf3, 0xaf, 0x81, 0xce,
+0x0c, 0xf2, 0x92, 0x16, 0x89, 0x38, 0xf0, 0x54, 0xa8, 0x68, 0x64, 0x70, 0x02, 0x6a, 0x16, 0x55,
+0xbb, 0x33, 0x6e, 0x0a, 0x57, 0xdf, 0x1f, 0xb9, 0xd6, 0x9d, 0xa4, 0x90, 0xfc, 0x91, 0x58, 0xa0,
+0xf7, 0xb8, 0x43, 0xd8, 0xa4, 0xfa, 0x17, 0x1d, 0x97, 0x3c, 0xbe, 0x56, 0x4e, 0x68, 0xa8, 0x6d,
+0x4c, 0x64, 0x4f, 0x4c, 0x83, 0x28, 0x5a, 0xfe, 0xb9, 0xd4, 0x71, 0xb2, 0x8a, 0x9c, 0xe6, 0x94,
+0x90, 0x9a, 0x28, 0xab, 0xcb, 0xc3, 0x77, 0xe1, 0x50, 0x01, 0xd7, 0x20, 0xc1, 0x3d, 0x2a, 0x55,
+0xd0, 0x63, 0x04, 0x66, 0xe4, 0x59, 0x2b, 0x40, 0x71, 0x1c, 0xb2, 0xf4, 0x9f, 0xcf, 0x41, 0xb3,
+0xec, 0xa2, 0x8c, 0x9f, 0x76, 0xa7, 0x2d, 0xb8, 0x43, 0xcf, 0x50, 0xea, 0xf0, 0x06, 0xd3, 0x22,
+0xcb, 0x3b, 0xe5, 0x4e, 0x0c, 0x59, 0x98, 0x57, 0x97, 0x49, 0xbb, 0x30, 0xf6, 0x10, 0x6c, 0xef,
+0xb1, 0xd1, 0x17, 0xbc, 0xe3, 0xb0, 0x09, 0xb0, 0x3d, 0xb8, 0x57, 0xc7, 0x73, 0xdb, 0xa0, 0xf2,
+0xa6, 0x0a, 0x83, 0x21, 0xf9, 0x34, 0xcf, 0x42, 0x73, 0x48, 0xf5, 0x44, 0x07, 0x38, 0x8f, 0x23,
+0x7e, 0x0a, 0xec, 0xf0, 0x9d, 0xda, 0xc7, 0xca, 0x0f, 0xc3, 0x6b, 0xc3, 0xf5, 0xca, 0x07, 0xd8,
+0xa4, 0xe8, 0xb0, 0xfa, 0x38, 0x0c, 0x9a, 0x1b, 0xe3, 0x27, 0xe9, 0x2f, 0xcd, 0x32, 0xdd, 0x2f,
+0x53, 0x27, 0xa8, 0x19, 0xc2, 0x08, 0x04, 0xf7, 0x50, 0xe7, 0xfd, 0xdb, 0x8f, 0xd6, 0x45, 0xd7,
+0x2b, 0xdd, 0x08, 0xe7, 0xb6, 0xf2, 0x58, 0xfe, 0x7c, 0x08, 0x68, 0x10, 0x0a, 0x16, 0xc0, 0x19,
+0xb2, 0x1b, 0x94, 0x1b, 0xfc, 0x18, 0x5a, 0x13, 0x02, 0x0b, 0x72, 0x01, 0x64, 0xf8, 0xb2, 0xf1,
+0x6e, 0xee, 0xc6, 0xee, 0xc6, 0xf1, 0xe6, 0xf5, 0xb4, 0xf9, 0x0a, 0xfc, 0xe4, 0xfc, 0x0c, 0xfd,
+0xc0, 0xfd, 0x26, 0x00, 0xb8, 0x04, 0x9a, 0x0a, 0xee, 0x0f, 0x26, 0x13, 0x42, 0x13, 0xb6, 0x10,
+0xda, 0x0c, 0xec, 0x08, 0x18, 0x06, 0x22, 0x04, 0x2a, 0x02, 0xca, 0xfe, 0xa6, 0xf9, 0xde, 0xf2,
+0xf8, 0xeb, 0xda, 0xe6, 0x86, 0xe5, 0x28, 0xe9, 0xa6, 0xf1, 0x62, 0xfd, 0xcc, 0x09, 0x74, 0x14,
+0xfa, 0x1b, 0xff, 0x1f, 0x15, 0x21, 0x05, 0x20, 0xd7, 0x1c, 0x48, 0x17, 0x76, 0x0e, 0x82, 0x02,
+0x22, 0xf4, 0x8c, 0xe5, 0xd1, 0xd8, 0xc3, 0xd0, 0x37, 0xcf, 0x19, 0xd5, 0xf5, 0xe1, 0xa4, 0xf3,
+0x42, 0x07, 0xc2, 0x19, 0xf3, 0x28, 0x3f, 0x33, 0x23, 0x38, 0x63, 0x37, 0xe3, 0x30, 0x9d, 0x24,
+0x56, 0x13, 0x9c, 0xfe, 0xd2, 0xe8, 0xc9, 0xd4, 0x3d, 0xc5, 0x55, 0xbc, 0x03, 0xbc, 0xf7, 0xc4,
+0x65, 0xd6, 0x50, 0xee, 0x3c, 0x09, 0x6b, 0x23, 0x55, 0x39, 0x55, 0x48, 0x6b, 0x4e, 0x47, 0x4b,
+0x25, 0x3f, 0x6d, 0x2b, 0x86, 0x12, 0x42, 0xf7, 0x95, 0xdc, 0x6b, 0xc5, 0x59, 0xb4, 0x91, 0xab,
+0xc5, 0xac, 0xe7, 0xb8, 0x3d, 0xcf, 0x84, 0xed, 0xac, 0x0f, 0xad, 0x30, 0x81, 0x4b, 0x44, 0x5c,
+0xbe, 0x60, 0xa6, 0x58, 0x07, 0x46, 0xc5, 0x2b, 0x6c, 0x0d, 0x42, 0xee, 0x13, 0xd1, 0x61, 0xb8,
+0xec, 0xa6, 0x02, 0x9f, 0x6a, 0xa2, 0x55, 0xb2, 0x13, 0xce, 0x86, 0xf2, 0xa8, 0x1a, 0xe3, 0x3f,
+0x30, 0x5c, 0x4c, 0x6b, 0xae, 0x6b, 0x52, 0x5e, 0x8b, 0x46, 0x45, 0x28, 0x12, 0x07, 0xfc, 0xe5,
+0x93, 0xc7, 0x79, 0xae, 0x6c, 0x9d, 0x10, 0x97, 0x66, 0x9d, 0x81, 0xb1, 0x7b, 0xd2, 0xf6, 0xfb,
+0x6f, 0x27, 0x9d, 0x4d, 0x38, 0x68, 0x9e, 0x73, 0x78, 0x6f, 0xf6, 0x5d, 0x03, 0x43, 0xd1, 0x22,
+0x6c, 0x00, 0x5d, 0xde, 0x7d, 0xbf, 0xba, 0xa6, 0x4a, 0x97, 0xe6, 0x93, 0x94, 0x9e, 0x93, 0xb7,
+0xad, 0xdc, 0x56, 0x08, 0x35, 0x33, 0x5e, 0x56, 0xa6, 0x6c, 0xa6, 0x73, 0xec, 0x6b, 0x40, 0x58,
+0x51, 0x3c, 0x92, 0x1b, 0x0c, 0xf9, 0x39, 0xd7, 0x6b, 0xb9, 0x10, 0xa3, 0x2a, 0x97, 0x32, 0x98,
+0x52, 0xa7, 0xa1, 0xc3, 0x82, 0xe9, 0x30, 0x13, 0xd3, 0x39, 0xce, 0x57, 0x72, 0x69, 0xf4, 0x6c,
+0x4a, 0x63, 0xc1, 0x4e, 0xc3, 0x32, 0x54, 0x12, 0xa0, 0xf0, 0xb1, 0xd0, 0x33, 0xb6, 0x5a, 0xa4,
+0xc6, 0x9d, 0x9a, 0xa3, 0xbb, 0xb5, 0x29, 0xd2, 0xf4, 0xf4, 0x20, 0x19, 0xab, 0x39, 0x47, 0x52,
+0xf6, 0x5f, 0x86, 0x61, 0x08, 0x57, 0xf7, 0x42, 0xf5, 0x27, 0x50, 0x09, 0x40, 0xea, 0x83, 0xce,
+0x3d, 0xb9, 0x33, 0xad, 0x8f, 0xab, 0x11, 0xb4, 0xc3, 0xc5, 0x45, 0xde, 0xd0, 0xfa, 0xe8, 0x17,
+0x3f, 0x32, 0x5d, 0x46, 0x85, 0x51, 0xeb, 0x51, 0xbf, 0x47, 0xaf, 0x34, 0xe6, 0x1b, 0xc6, 0x00,
+0xda, 0xe6, 0x75, 0xd1, 0x1f, 0xc3, 0xcf, 0xbc, 0x7b, 0xbe, 0x2d, 0xc7, 0x61, 0xd5, 0x04, 0xe8,
+0x46, 0xfd, 0x56, 0x13, 0xcd, 0x27, 0xbd, 0x37, 0x43, 0x40, 0xb7, 0x3f, 0x07, 0x36, 0x1d, 0x25,
+0x3a, 0x10, 0xd0, 0xfa, 0x42, 0xe8, 0xc7, 0xda, 0x4b, 0xd3, 0x81, 0xd1, 0x13, 0xd4, 0x01, 0xda,
+0xb5, 0xe2, 0xdc, 0xed, 0x6c, 0xfb, 0x80, 0x0a, 0x36, 0x19, 0xf5, 0x24, 0x2b, 0x2b, 0x27, 0x2a,
+0x8d, 0x22, 0x44, 0x16, 0x4e, 0x08, 0xa6, 0xfb, 0x1e, 0xf2, 0x50, 0xec, 0xd8, 0xe9, 0x62, 0xe9,
+0xfa, 0xe9, 0x0c, 0xeb, 0xe4, 0xec, 0x4c, 0xf0, 0x16, 0xf6, 0xf4, 0xfd, 0xda, 0x06, 0x8e, 0x0e,
+0x18, 0x13, 0xa4, 0x13, 0x90, 0x10, 0xa4, 0x0b, 0xb8, 0x06, 0x40, 0x03, 0x90, 0x01, 0x36, 0x01,
+0xe6, 0x00, 0xee, 0xff, 0x4c, 0xfd, 0x16, 0xf9, 0x22, 0xf4, 0xe4, 0xef, 0xa4, 0xed, 0x4e, 0xee,
+0x76, 0xf1, 0x1a, 0xf6, 0x20, 0xfb, 0x8e, 0xff, 0x88, 0x03, 0x5c, 0x07, 0xaa, 0x0b, 0x32, 0x10,
+0x76, 0x14, 0x36, 0x17, 0xa6, 0x17, 0xb0, 0x14, 0x2e, 0x0e, 0x4a, 0x04, 0x10, 0xf8, 0x9c, 0xeb,
+0x19, 0xe1, 0x85, 0xda, 0xfd, 0xd8, 0xb7, 0xdc, 0x8a, 0xe4, 0x84, 0xef, 0xf8, 0xfb, 0xec, 0x08,
+0x3c, 0x15, 0xf3, 0x1f, 0x1f, 0x28, 0xb1, 0x2c, 0xab, 0x2c, 0x47, 0x27, 0x49, 0x1c, 0xc4, 0x0b,
+0x84, 0xf7, 0x37, 0xe2, 0xa7, 0xcf, 0x7f, 0xc3, 0x01, 0xc0, 0xa9, 0xc5, 0x0f, 0xd3, 0xb2, 0xe5,
+0x9e, 0xfa, 0x58, 0x0f, 0xc1, 0x21, 0xdb, 0x30, 0x79, 0x3b, 0x8f, 0x40, 0x13, 0x3f, 0x17, 0x36,
+0x45, 0x25, 0x52, 0x0d, 0x98, 0xf0, 0x71, 0xd3, 0x69, 0xbb, 0x0b, 0xad, 0x04, 0xab, 0x25, 0xb5,
+0xdd, 0xc8, 0x71, 0xe2, 0xc2, 0xfd, 0xc6, 0x17, 0x41, 0x2e, 0x09, 0x40, 0xcd, 0x4b, 0x93, 0x50,
+0x97, 0x4c, 0x25, 0x3f, 0xf5, 0x27, 0xb8, 0x08, 0x20, 0xe5, 0xf5, 0xc2, 0xac, 0xa8, 0x1a, 0x9b,
+0x44, 0x9c, 0xc4, 0xaa, 0xa1, 0xc3, 0x03, 0xe2, 0x0a, 0x02, 0x1b, 0x20, 0x43, 0x3a, 0x8f, 0x4e,
+0x62, 0x5b, 0x82, 0x5e, 0x9a, 0x56, 0x05, 0x43, 0xcb, 0x24, 0x3c, 0xff, 0x37, 0xd7, 0x77, 0xb3,
+0x30, 0x9a, 0x8c, 0x8f, 0x78, 0x94, 0x2c, 0xa7, 0xc9, 0xc3, 0xde, 0xe5, 0x00, 0x09, 0xa7, 0x29,
+0x9b, 0x45, 0x76, 0x5a, 0xcc, 0x65, 0x70, 0x65, 0x1e, 0x58, 0xb3, 0x3e, 0xa6, 0x1b, 0x26, 0xf3,
+0xe7, 0xca, 0x1e, 0xa9, 0xc2, 0x92, 0x0e, 0x8b, 0x56, 0x92, 0x0e, 0xa7, 0xe7, 0xc5, 0x6a, 0xea,
+0x14, 0x10, 0x1b, 0x33, 0x09, 0x50, 0xd6, 0x63, 0xb6, 0x6b, 0xfe, 0x65, 0x3d, 0x53, 0x9f, 0x35,
+0xae, 0x10, 0xe6, 0xe8, 0x41, 0xc3, 0xc0, 0xa4, 0xa2, 0x91, 0x50, 0x8c, 0x84, 0x95, 0x09, 0xac,
+0xa9, 0xcc, 0x00, 0xf3, 0xf8, 0x19, 0xef, 0x3c, 0xe2, 0x57, 0x72, 0x67, 0xa4, 0x69, 0x7a, 0x5e,
+0xd1, 0x47, 0x01, 0x29, 0xa2, 0x05, 0x51, 0xe1, 0x0d, 0xc0, 0xcc, 0xa5, 0xe8, 0x95, 0xe4, 0x92,
+0xaa, 0x9d, 0x57, 0xb5, 0xf1, 0xd6, 0x74, 0xfd, 0x5b, 0x23, 0x61, 0x43, 0x6c, 0x59, 0xf6, 0x62,
+0xb2, 0x5f, 0xf7, 0x50, 0xef, 0x39, 0x7d, 0x1d, 0x88, 0xfe, 0x89, 0xdf, 0x75, 0xc3, 0x2d, 0xad,
+0x18, 0xa0, 0xcc, 0x9e, 0x82, 0xaa, 0x8d, 0xc2, 0x45, 0xe3, 0x7c, 0x07, 0x05, 0x29, 0x2d, 0x43,
+0x81, 0x52, 0x5e, 0x56, 0x77, 0x4f, 0x7b, 0x40, 0xeb, 0x2b, 0x2c, 0x14, 0xf6, 0xfa, 0xe1, 0xe1,
+0xcd, 0xca, 0x87, 0xb8, 0x27, 0xae, 0x7d, 0xae, 0xdd, 0xba, 0xd3, 0xd1, 0x60, 0xef, 0x08, 0x0e,
+0x71, 0x28, 0x15, 0x3b, 0x2d, 0x44, 0x21, 0x44, 0xad, 0x3c, 0xef, 0x2f, 0xe3, 0x1f, 0xea, 0x0d,
+0xc8, 0xfa, 0x80, 0xe7, 0xcd, 0xd5, 0xe1, 0xc7, 0xc7, 0xc0, 0x79, 0xc2, 0xa7, 0xcd, 0x91, 0xe0,
+0x5c, 0xf7, 0x8c, 0x0d, 0x85, 0x1f, 0xf9, 0x2a, 0xab, 0x2f, 0x6b, 0x2e, 0xab, 0x28, 0x15, 0x20,
+0xa4, 0x15, 0xf0, 0x09, 0xa0, 0xfd, 0x20, 0xf1, 0x80, 0xe5, 0x91, 0xdc, 0xd9, 0xd7, 0xed, 0xd8,
+0xcd, 0xdf, 0x3a, 0xeb, 0xd2, 0xf8, 0xea, 0x05, 0x48, 0x10, 0xd6, 0x16, 0x8a, 0x19, 0xee, 0x18,
+0x38, 0x16, 0x06, 0x12, 0x6e, 0x0d, 0x9c, 0x08, 0xc4, 0x03, 0x96, 0xfe, 0x30, 0xf9, 0xce, 0xf3,
+0x5e, 0xef, 0xea, 0xec, 0x1a, 0xed, 0xf8, 0xef, 0x8e, 0xf4, 0xbc, 0xf9, 0x22, 0xfe, 0x20, 0x01,
+0x9e, 0x02, 0x4c, 0x03, 0xd8, 0x03, 0x14, 0x05, 0x84, 0x07, 0x00, 0x0b, 0x9e, 0x0e, 0xf0, 0x10,
+0x86, 0x10, 0xd2, 0x0c, 0x14, 0x06, 0xd6, 0xfd, 0xe0, 0xf5, 0xb4, 0xef, 0xe0, 0xeb, 0x34, 0xea,
+0xd0, 0xe9, 0x4a, 0xea, 0xd0, 0xeb, 0x90, 0xee, 0xc2, 0xf3, 0xa6, 0xfb, 0x5c, 0x06, 0xca, 0x12,
+0xa5, 0x1e, 0xf7, 0x26, 0x57, 0x29, 0x7d, 0x24, 0x2c, 0x19, 0x08, 0x0a, 0xde, 0xf9, 0x9e, 0xeb,
+0x91, 0xe0, 0xe7, 0xd8, 0xbd, 0xd4, 0xb7, 0xd3, 0x2f, 0xd6, 0xef, 0xdc, 0x86, 0xe8, 0xf2, 0xf8,
+0xdc, 0x0c, 0x8d, 0x21, 0x6f, 0x33, 0xb5, 0x3e, 0x57, 0x40, 0xff, 0x37, 0xe7, 0x26, 0xca, 0x10,
+0x86, 0xf9, 0x26, 0xe4, 0xe7, 0xd2, 0xc1, 0xc6, 0x19, 0xc0, 0x5d, 0xbf, 0xe5, 0xc4, 0x33, 0xd1,
+0x8c, 0xe4, 0x26, 0xfd, 0x4c, 0x18, 0x39, 0x32, 0x77, 0x46, 0x89, 0x51, 0x01, 0x51, 0xe3, 0x44,
+0x85, 0x2f, 0x56, 0x14, 0x64, 0xf7, 0x33, 0xdc, 0xa1, 0xc5, 0xb3, 0xb5, 0xb1, 0xad, 0x51, 0xae,
+0x3f, 0xb8, 0x6f, 0xcb, 0x4a, 0xe6, 0xdc, 0x05, 0xdf, 0x25, 0x63, 0x42, 0x08, 0x57, 0xcc, 0x60,
+0xdc, 0x5d, 0x65, 0x4e, 0xd5, 0x34, 0x88, 0x14, 0xd8, 0xf1, 0xfb, 0xd0, 0xfb, 0xb5, 0xd8, 0xa3,
+0xc0, 0x9c, 0x56, 0xa1, 0xc1, 0xb1, 0x5b, 0xcc, 0x96, 0xed, 0x64, 0x11, 0x1b, 0x33, 0x2f, 0x4f,
+0x4e, 0x62, 0xd8, 0x69, 0x58, 0x64, 0x13, 0x52, 0xef, 0x34, 0x8c, 0x10, 0x6e, 0xe9, 0xbb, 0xc4,
+0xea, 0xa7, 0x90, 0x96, 0xe2, 0x92, 0x14, 0x9d, 0x8b, 0xb3, 0x49, 0xd3, 0xba, 0xf7, 0x49, 0x1c,
+0x5d, 0x3d, 0xd0, 0x57, 0xfa, 0x68, 0x78, 0x6e, 0x7c, 0x66, 0x27, 0x51, 0x6f, 0x30, 0x00, 0x08,
+0x9f, 0xdd, 0x97, 0xb7, 0xf2, 0x9b, 0xb2, 0x8e, 0xa2, 0x90, 0xae, 0xa0, 0xbf, 0xbb, 0x7f, 0xdd,
+0x9a, 0x01, 0x4b, 0x24, 0xc1, 0x42, 0xb8, 0x5a, 0x8e, 0x69, 0x8e, 0x6c, 0x2e, 0x62, 0x25, 0x4a,
+0xf9, 0x26, 0x0c, 0xfd, 0xbf, 0xd2, 0x1f, 0xaf, 0xe4, 0x97, 0xda, 0x8f, 0xae, 0x96, 0x06, 0xaa,
+0x0b, 0xc6, 0xb6, 0xe6, 0x46, 0x08, 0xff, 0x27, 0x91, 0x43, 0xda, 0x58, 0x32, 0x65, 0xda, 0x65,
+0x52, 0x59, 0xb1, 0x3f, 0xea, 0x1b, 0x0a, 0xf3, 0xe3, 0xcb, 0x59, 0xad, 0xec, 0x9b, 0xda, 0x98,
+0xe4, 0xa2, 0xe1, 0xb6, 0x55, 0xd1, 0x2c, 0xef, 0x3a, 0x0d, 0x5f, 0x29, 0x81, 0x41, 0x31, 0x53,
+0x1a, 0x5c, 0xc8, 0x59, 0x11, 0x4b, 0x33, 0x31, 0x48, 0x0f, 0xc8, 0xea, 0x05, 0xca, 0x17, 0xb2,
+0x4e, 0xa6, 0x04, 0xa7, 0x39, 0xb2, 0x77, 0xc5, 0x81, 0xdd, 0x8c, 0xf7, 0x76, 0x11, 0xc7, 0x28,
+0xd5, 0x3b, 0xa9, 0x48, 0x1f, 0x4d, 0x29, 0x48, 0x61, 0x39, 0x41, 0x22, 0x4c, 0x06, 0x9c, 0xe9,
+0xc5, 0xd0, 0xb5, 0xbf, 0xef, 0xb7, 0xd5, 0xb9, 0xf3, 0xc3, 0xd9, 0xd3, 0x86, 0xe7, 0x66, 0xfc,
+0x72, 0x10, 0x13, 0x22, 0x7b, 0x2f, 0x83, 0x37, 0x5b, 0x39, 0x27, 0x34, 0x87, 0x28, 0xd2, 0x17,
+0xfe, 0x03, 0x30, 0xf0, 0x0d, 0xdf, 0xf1, 0xd2, 0x7b, 0xcd, 0xcf, 0xce, 0x45, 0xd6, 0x37, 0xe2,
+0x8a, 0xf0, 0x2e, 0xff, 0x70, 0x0c, 0xfc, 0x16, 0x67, 0x1e, 0x79, 0x22, 0x43, 0x23, 0xef, 0x20,
+0x74, 0x1b, 0xf8, 0x12, 0xf2, 0x07, 0xc0, 0xfb, 0x40, 0xf0, 0x94, 0xe7, 0x75, 0xe3, 0x22, 0xe4,
+0xf0, 0xe8, 0x20, 0xf0, 0xd0, 0xf7, 0x6c, 0xfe, 0x1a, 0x03, 0xe4, 0x05, 0xb6, 0x07, 0x86, 0x09,
+0x02, 0x0c, 0x16, 0x0f, 0x72, 0x11, 0x10, 0x12, 0xe0, 0x0f, 0xe6, 0x0a, 0xa6, 0x04, 0xc0, 0xfe,
+0xc0, 0xfa, 0x18, 0xf9, 0xe0, 0xf8, 0xf4, 0xf8, 0x28, 0xf8, 0xc4, 0xf5, 0x82, 0xf2, 0x98, 0xef,
+0xd6, 0xee, 0xee, 0xf1, 0xc2, 0xf8, 0x68, 0x02, 0xda, 0x0c, 0x7c, 0x15, 0xe2, 0x1a, 0x55, 0x1c,
+0x84, 0x1a, 0xe0, 0x16, 0x42, 0x12, 0xd4, 0x0c, 0x44, 0x06, 0xc6, 0xfd, 0x9e, 0xf3, 0xcc, 0xe8,
+0xdb, 0xde, 0x85, 0xd8, 0x97, 0xd7, 0x13, 0xdd, 0xd6, 0xe8, 0xf4, 0xf8, 0x92, 0x0a, 0xe8, 0x1a,
+0x45, 0x27, 0x7f, 0x2e, 0x95, 0x30, 0xcb, 0x2d, 0xcb, 0x26, 0xc8, 0x1b, 0x18, 0x0d, 0xbe, 0xfb,
+0x42, 0xe9, 0x07, 0xd8, 0x9d, 0xca, 0x6b, 0xc3, 0xeb, 0xc3, 0xcb, 0xcc, 0x55, 0xdd, 0x98, 0xf3,
+0x30, 0x0c, 0x83, 0x23, 0x6b, 0x36, 0x75, 0x42, 0xa9, 0x46, 0x7b, 0x42, 0x7d, 0x36, 0xf9, 0x23,
+0xec, 0x0c, 0xd8, 0xf3, 0xa1, 0xdb, 0x19, 0xc7, 0xa9, 0xb8, 0x4d, 0xb2, 0xf3, 0xb4, 0x39, 0xc1,
+0x59, 0xd6, 0x2e, 0xf2, 0x3c, 0x11, 0xe1, 0x2e, 0x13, 0x47, 0x1a, 0x56, 0xfc, 0x59, 0x0b, 0x52,
+0x9b, 0x3f, 0xc1, 0x25, 0xe8, 0x07, 0xd2, 0xe9, 0x55, 0xce, 0x6b, 0xb8, 0x00, 0xaa, 0xde, 0xa4,
+0xc4, 0xa9, 0x6f, 0xb9, 0x7d, 0xd3, 0x58, 0xf5, 0xf0, 0x1a, 0x33, 0x3e, 0x90, 0x59, 0xa0, 0x68,
+0xcc, 0x68, 0xd0, 0x5a, 0xc9, 0x41, 0x0b, 0x22, 0x06, 0x00, 0x3f, 0xdf, 0x8f, 0xc2, 0x87, 0xac,
+0x10, 0x9f, 0x76, 0x9b, 0x7a, 0xa3, 0x77, 0xb7, 0xd7, 0xd6, 0x32, 0xfe, 0xdb, 0x27, 0x4b, 0x4d,
+0x18, 0x68, 0xc8, 0x73, 0x18, 0x6f, 0x08, 0x5c, 0xad, 0x3e, 0x2e, 0x1c, 0x66, 0xf8, 0xf7, 0xd6,
+0x5d, 0xba, 0xfc, 0xa4, 0xf0, 0x98, 0xce, 0x97, 0x32, 0xa3, 0x9f, 0xbb, 0x75, 0xdf, 0x08, 0x0a,
+0x01, 0x35, 0xe8, 0x58, 0x1e, 0x70, 0x38, 0x77, 0xfa, 0x6d, 0x9e, 0x57, 0x7f, 0x38, 0x20, 0x15,
+0x54, 0xf1, 0x17, 0xd0, 0x43, 0xb4, 0x9a, 0xa0, 0x10, 0x97, 0x7c, 0x99, 0x36, 0xa9, 0x91, 0xc5,
+0xc2, 0xeb, 0x3a, 0x16, 0x2d, 0x3e, 0x72, 0x5d, 0x78, 0x6f, 0x0c, 0x72, 0x28, 0x66, 0xef, 0x4e,
+0x23, 0x30, 0xd4, 0x0d, 0x12, 0xeb, 0x0d, 0xcb, 0x2b, 0xb1, 0x32, 0xa0, 0x68, 0x9a, 0x5c, 0xa1,
+0x01, 0xb5, 0x53, 0xd3, 0x7a, 0xf8, 0xd5, 0x1e, 0xfb, 0x40, 0x8a, 0x5a, 0xc2, 0x67, 0x9e, 0x67,
+0xc6, 0x5a, 0xdb, 0x43, 0x65, 0x26, 0xbc, 0x05, 0x26, 0xe5, 0x51, 0xc8, 0xbd, 0xb2, 0xda, 0xa6,
+0x66, 0xa6, 0x1d, 0xb1, 0xdb, 0xc5, 0xa1, 0xe1, 0xfe, 0x00, 0x27, 0x20, 0x81, 0x3b, 0xab, 0x4f,
+0xba, 0x59, 0x7c, 0x58, 0x6d, 0x4c, 0x71, 0x37, 0x42, 0x1c, 0x8c, 0xfe, 0xed, 0xe1, 0x4b, 0xca,
+0xab, 0xba, 0x63, 0xb4, 0xd7, 0xb7, 0xcf, 0xc3, 0xe1, 0xd5, 0x40, 0xec, 0x60, 0x04, 0x32, 0x1c,
+0x4d, 0x31, 0x01, 0x41, 0x99, 0x48, 0xf3, 0x46, 0xdd, 0x3b, 0xeb, 0x28, 0xa4, 0x11, 0xf0, 0xf8,
+0xfd, 0xe2, 0xbb, 0xd2, 0xcf, 0xc9, 0x5f, 0xc8, 0x5d, 0xcd, 0xf5, 0xd6, 0xad, 0xe3, 0xa4, 0xf2,
+0x96, 0x02, 0x16, 0x13, 0x91, 0x22, 0x5d, 0x2e, 0x5b, 0x34, 0xc5, 0x32, 0xaf, 0x29, 0x08, 0x1b,
+0x82, 0x09, 0x6a, 0xf8, 0xd4, 0xea, 0x25, 0xe2, 0x71, 0xde, 0x05, 0xdf, 0x6d, 0xe2, 0x50, 0xe7,
+0x54, 0xed, 0x06, 0xf4, 0x5a, 0xfc, 0xfe, 0x05, 0xec, 0x0f, 0x7c, 0x18, 0x75, 0x1d, 0x9d, 0x1d,
+0xbe, 0x18, 0x78, 0x10, 0x34, 0x07, 0x52, 0xff, 0xfe, 0xf9, 0x60, 0xf7, 0xd6, 0xf6, 0x18, 0xf7,
+0x02, 0xf7, 0xd6, 0xf5, 0xe8, 0xf3, 0x98, 0xf2, 0xb4, 0xf2, 0x76, 0xf5, 0x3e, 0xfa, 0x0a, 0x00,
+0x70, 0x05, 0xda, 0x08, 0xaa, 0x0a, 0x14, 0x0b, 0x6c, 0x0b, 0x04, 0x0c, 0x4e, 0x0d, 0x2a, 0x0e,
+0x0c, 0x0e, 0xe6, 0x0b, 0xf4, 0x06, 0xbc, 0xff, 0x94, 0xf6, 0x70, 0xed, 0x4e, 0xe6, 0x79, 0xe2,
+0xef, 0xe2, 0x66, 0xe7, 0x14, 0xef, 0x76, 0xf8, 0x86, 0x02, 0x32, 0x0c, 0xee, 0x14, 0x5f, 0x1c,
+0x55, 0x21, 0xdb, 0x23, 0xcd, 0x22, 0xd1, 0x1d, 0x4c, 0x14, 0xd8, 0x06, 0x70, 0xf6, 0x4e, 0xe5,
+0x63, 0xd6, 0x63, 0xcc, 0xf1, 0xc9, 0x75, 0xcf, 0xb9, 0xdb, 0xd0, 0xec, 0xb2, 0xff, 0x00, 0x12,
+0xc9, 0x21, 0xef, 0x2d, 0xd5, 0x35, 0xc7, 0x38, 0x3d, 0x36, 0x69, 0x2d, 0xab, 0x1e, 0xf6, 0x09,
+0x6c, 0xf1, 0xf7, 0xd7, 0x4f, 0xc2, 0xd1, 0xb4, 0x6d, 0xb2, 0xe3, 0xbb, 0xe3, 0xce, 0xf0, 0xe7,
+0x9c, 0x02, 0x62, 0x1b, 0xf3, 0x2f, 0x0b, 0x3f, 0xc3, 0x47, 0xf3, 0x49, 0x99, 0x44, 0x71, 0x37,
+0x5d, 0x22, 0x98, 0x06, 0x96, 0xe6, 0x65, 0xc7, 0x35, 0xae, 0xbc, 0xa0, 0xa2, 0xa1, 0x15, 0xb0,
+0x5f, 0xc9, 0x70, 0xe8, 0x82, 0x08, 0x73, 0x25, 0xe1, 0x3c, 0x91, 0x4d, 0xec, 0x56, 0xae, 0x57,
+0xe5, 0x4e, 0x91, 0x3c, 0x11, 0x21, 0x86, 0xfe, 0xff, 0xd8, 0x43, 0xb6, 0x14, 0x9d, 0x0c, 0x92,
+0xf0, 0x96, 0x54, 0xaa, 0x5b, 0xc8, 0xc2, 0xeb, 0x40, 0x0f, 0x17, 0x2f, 0x93, 0x48, 0x6a, 0x5a,
+0xe4, 0x62, 0xa6, 0x60, 0x07, 0x53, 0x55, 0x3a, 0xb4, 0x18, 0x7c, 0xf1, 0x25, 0xca, 0x8e, 0xa8,
+0x6e, 0x92, 0x7a, 0x8b, 0x58, 0x94, 0x2c, 0xab, 0xe3, 0xcb, 0x7a, 0xf1, 0xd2, 0x16, 0x25, 0x38,
+0x63, 0x52, 0x98, 0x63, 0xd0, 0x69, 0x52, 0x63, 0x37, 0x50, 0x85, 0x32, 0x40, 0x0d, 0x36, 0xe5,
+0x55, 0xbf, 0xf6, 0xa0, 0xde, 0x8e, 0x46, 0x8b, 0x8c, 0x96, 0xfd, 0xae, 0x19, 0xd1, 0xaa, 0xf7,
+0x3d, 0x1e, 0xe7, 0x3f, 0xaa, 0x59, 0x6e, 0x68, 0x14, 0x6a, 0x44, 0x5e, 0xbd, 0x46, 0x5d, 0x26,
+0x40, 0x01, 0xbd, 0xdb, 0x01, 0xba, 0x7e, 0xa0, 0x26, 0x92, 0x22, 0x91, 0xe0, 0x9d, 0x2f, 0xb7,
+0xa3, 0xd9, 0xb0, 0x00, 0xa5, 0x26, 0xb5, 0x46, 0xde, 0x5c, 0x82, 0x66, 0xb0, 0x62, 0x6d, 0x52,
+0xaf, 0x38, 0x30, 0x19, 0x9a, 0xf7, 0x39, 0xd7, 0x13, 0xbb, 0x1e, 0xa6, 0x08, 0x9b, 0x96, 0x9b,
+0xf4, 0xa8, 0x31, 0xc2, 0x22, 0xe4, 0x7a, 0x09, 0x83, 0x2c, 0x0b, 0x48, 0xb8, 0x58, 0xea, 0x5c,
+0xcc, 0x54, 0x35, 0x43, 0x01, 0x2b, 0x78, 0x0f, 0x6e, 0xf3, 0xd7, 0xd8, 0x11, 0xc2, 0x25, 0xb1,
+0x6a, 0xa8, 0x08, 0xaa, 0x63, 0xb7, 0x37, 0xcf, 0x46, 0xee, 0x76, 0x0f, 0xc3, 0x2c, 0x09, 0x42,
+0xb1, 0x4c, 0x83, 0x4c, 0x33, 0x43, 0x17, 0x33, 0xcb, 0x1e, 0x04, 0x09, 0x48, 0xf3, 0xe9, 0xde,
+0x41, 0xcd, 0x4b, 0xc0, 0x09, 0xba, 0xdb, 0xbc, 0x15, 0xc9, 0xd9, 0xdd, 0xa0, 0xf7, 0x96, 0x11,
+0x13, 0x27, 0x0f, 0x35, 0x8b, 0x3a, 0x01, 0x38, 0x9f, 0x2f, 0x0b, 0x23, 0x9e, 0x14, 0x6e, 0x05,
+0x76, 0xf6, 0x96, 0xe8, 0x75, 0xdc, 0x89, 0xd3, 0x75, 0xcf, 0xd1, 0xd1, 0x03, 0xdb, 0xa2, 0xe9,
+0x40, 0xfb, 0x62, 0x0c, 0x0c, 0x1a, 0x27, 0x22, 0x67, 0x24, 0x2f, 0x22, 0x87, 0x1c, 0x4c, 0x15,
+0x12, 0x0d, 0x2e, 0x05, 0xc4, 0xfd, 0x82, 0xf6, 0xdc, 0xef, 0x4a, 0xea, 0xf2, 0xe6, 0x8a, 0xe6,
+0x64, 0xe9, 0x56, 0xef, 0x74, 0xf7, 0xc4, 0xff, 0x98, 0x06, 0x10, 0x0b, 0xf0, 0x0c, 0xea, 0x0c,
+0xca, 0x0b, 0x46, 0x0a, 0x46, 0x09, 0xcc, 0x08, 0xa4, 0x08, 0x24, 0x08, 0x70, 0x06, 0xda, 0x02,
+0xda, 0xfd, 0x0c, 0xf8, 0xca, 0xf2, 0x78, 0xef, 0x20, 0xee, 0x0c, 0xef, 0x1c, 0xf1, 0x46, 0xf3,
+0xda, 0xf5, 0xa4, 0xf8, 0x70, 0xfc, 0x82, 0x01, 0x22, 0x08, 0x0a, 0x10, 0x02, 0x18, 0xd3, 0x1d,
+0x2f, 0x1f, 0x66, 0x1b, 0x1c, 0x12, 0x16, 0x05, 0x12, 0xf7, 0x6c, 0xea, 0x77, 0xe1, 0x59, 0xdc,
+0xa7, 0xda, 0x17, 0xdc, 0x25, 0xe0, 0xe0, 0xe6, 0x98, 0xf0, 0x68, 0xfd, 0xda, 0x0c, 0x2d, 0x1d,
+0xa9, 0x2b, 0x1f, 0x35, 0xe9, 0x36, 0xb1, 0x2f, 0x51, 0x20, 0x92, 0x0b, 0x88, 0xf5, 0xc7, 0xe1,
+0xd5, 0xd2, 0xa3, 0xc9, 0x17, 0xc6, 0xab, 0xc7, 0x53, 0xce, 0x1b, 0xda, 0xca, 0xea, 0xe2, 0xff,
+0x4a, 0x17, 0x01, 0x2e, 0x79, 0x40, 0x67, 0x4a, 0xcf, 0x49, 0x11, 0x3e, 0xd7, 0x28, 0xf2, 0x0d,
+0xa6, 0xf1, 0x2d, 0xd8, 0x85, 0xc4, 0x01, 0xb8, 0xf5, 0xb2, 0xbb, 0xb5, 0x3d, 0xc0, 0x3b, 0xd2,
+0xd0, 0xea, 0xbc, 0x07, 0x6b, 0x25, 0x13, 0x40, 0xf5, 0x52, 0x4a, 0x5b, 0x4c, 0x57, 0x2f, 0x47,
+0x63, 0x2d, 0x96, 0x0d, 0x4e, 0xec, 0x11, 0xce, 0x59, 0xb6, 0x62, 0xa7, 0x80, 0xa2, 0x0c, 0xa8,
+0x0d, 0xb8, 0x53, 0xd1, 0x54, 0xf1, 0xd2, 0x13, 0xad, 0x34, 0x8f, 0x4f, 0xf8, 0x60, 0x7c, 0x66,
+0x00, 0x5f, 0x5f, 0x4b, 0xe7, 0x2d, 0x20, 0x0a, 0x9c, 0xe4, 0x7f, 0xc2, 0x36, 0xa8, 0xec, 0x98,
+0x4e, 0x96, 0xf2, 0xa0, 0x75, 0xb7, 0x67, 0xd7, 0x18, 0xfc, 0xc9, 0x20, 0x61, 0x41, 0x2c, 0x5a,
+0xe6, 0x68, 0x84, 0x6b, 0x4a, 0x61, 0xdb, 0x4a, 0x4d, 0x2a, 0x1e, 0x03, 0x67, 0xda, 0x1b, 0xb6,
+0xa8, 0x9b, 0xfe, 0x8e, 0x80, 0x91, 0x5a, 0xa2, 0xc5, 0xbe, 0x69, 0xe2, 0x16, 0x08, 0x6f, 0x2b,
+0xe7, 0x48, 0x94, 0x5e, 0x74, 0x6a, 0xb8, 0x6a, 0x80, 0x5e, 0x11, 0x46, 0x81, 0x23, 0x5e, 0xfa,
+0x5f, 0xd0, 0x87, 0xac, 0xfe, 0x94, 0xee, 0x8c, 0xe6, 0x94, 0x68, 0xaa, 0x91, 0xc9, 0x3e, 0xed,
+0xb0, 0x10, 0x77, 0x30, 0x6f, 0x4a, 0xdc, 0x5c, 0xea, 0x65, 0x1e, 0x64, 0x1e, 0x56, 0x6d, 0x3c,
+0xe6, 0x18, 0xf0, 0xef, 0x05, 0xc8, 0x32, 0xa8, 0xd8, 0x95, 0x64, 0x93, 0x7a, 0x9f, 0xf1, 0xb6,
+0x69, 0xd5, 0x3c, 0xf6, 0xf4, 0x15, 0xad, 0x31, 0xe1, 0x47, 0x32, 0x57, 0xea, 0x5d, 0xfa, 0x59,
+0xc5, 0x4a, 0x91, 0x30, 0x02, 0x0e, 0x0a, 0xe8, 0xd9, 0xc4, 0xf8, 0xaa, 0x76, 0x9e, 0xcc, 0x9f,
+0x5d, 0xad, 0x07, 0xc4, 0x6b, 0xdf, 0x46, 0xfc, 0x6c, 0x17, 0x15, 0x2f, 0xa1, 0x41, 0x65, 0x4d,
+0xe1, 0x50, 0xfb, 0x4a, 0x07, 0x3b, 0x11, 0x22, 0x8c, 0x03, 0xd8, 0xe3, 0x85, 0xc8, 0xf3, 0xb5,
+0x89, 0xae, 0x6f, 0xb2, 0xa5, 0xbf, 0xeb, 0xd2, 0xac, 0xe9, 0xc4, 0x00, 0x36, 0x16, 0x7f, 0x28,
+0xdf, 0x35, 0x81, 0x3d, 0x43, 0x3e, 0xc1, 0x37, 0x15, 0x2a, 0x90, 0x16, 0xa4, 0xff, 0xd2, 0xe8,
+0x51, 0xd5, 0x45, 0xc8, 0x6f, 0xc3, 0xdd, 0xc6, 0x23, 0xd1, 0x3b, 0xe0, 0x84, 0xf1, 0xa4, 0x02,
+0xf0, 0x11, 0xbd, 0x1d, 0xe1, 0x25, 0x87, 0x29, 0xd3, 0x28, 0x3b, 0x24, 0xde, 0x1b, 0x3c, 0x10,
+0x6e, 0x02, 0x14, 0xf4, 0x3c, 0xe7, 0xc7, 0xdd, 0x79, 0xd9, 0x13, 0xdb, 0xa1, 0xe1, 0x84, 0xeb,
+0x62, 0xf6, 0xc8, 0x00, 0x26, 0x09, 0xc8, 0x0e, 0xcc, 0x11, 0xe2, 0x12, 0xf2, 0x12, 0x44, 0x12,
+0xec, 0x10, 0x3c, 0x0e, 0x7a, 0x09, 0xea, 0x02, 0x80, 0xfb, 0x02, 0xf5, 0x1a, 0xf1, 0x20, 0xf0,
+0x02, 0xf2, 0x2e, 0xf5, 0x38, 0xf8, 0x14, 0xfa, 0x5e, 0xfa, 0xea, 0xf9, 0xac, 0xf9, 0x28, 0xfb,
+0x3e, 0xff, 0xa0, 0x05, 0xd6, 0x0c, 0xd0, 0x12, 0xe2, 0x15, 0x68, 0x15, 0xcc, 0x11, 0x9c, 0x0c,
+0x52, 0x07, 0xd0, 0x02, 0xb4, 0xfe, 0x30, 0xfa, 0xc4, 0xf4, 0x44, 0xee, 0xc8, 0xe7, 0xc5, 0xe2,
+0x79, 0xe1, 0x6a, 0xe5, 0xae, 0xee, 0x20, 0xfc, 0x56, 0x0b, 0x44, 0x19, 0x73, 0x23, 0x5d, 0x28,
+0x1d, 0x28, 0xfb, 0x23, 0xb7, 0x1c, 0x02, 0x13, 0x1a, 0x07, 0x60, 0xf9, 0xd2, 0xea, 0xdb, 0xdc,
+0x8d, 0xd1, 0x5b, 0xcb, 0x0d, 0xcc, 0x53, 0xd4, 0xab, 0xe3, 0xee, 0xf7, 0x1c, 0x0e, 0xe9, 0x22,
+0xfb, 0x32, 0x7d, 0x3c, 0xa3, 0x3e, 0x75, 0x39, 0x0f, 0x2e, 0x49, 0x1d, 0x8e, 0x08, 0x36, 0xf2,
+0x6d, 0xdc, 0xef, 0xc9, 0x2b, 0xbd, 0xe1, 0xb7, 0x7b, 0xbb, 0x0f, 0xc8, 0x75, 0xdc, 0x78, 0xf6,
+0xfc, 0x12, 0xd9, 0x2d, 0x81, 0x43, 0x95, 0x50, 0x3f, 0x53, 0x75, 0x4b, 0xff, 0x39, 0x2f, 0x21,
+0x58, 0x04, 0xd2, 0xe6, 0x75, 0xcc, 0x21, 0xb8, 0xb3, 0xab, 0xc2, 0xa8, 0xa7, 0xaf, 0x57, 0xc0,
+0xcb, 0xd9, 0x74, 0xf9, 0xa2, 0x1b, 0xe1, 0x3b, 0x1a, 0x55, 0x48, 0x63, 0xa8, 0x63, 0x4e, 0x56,
+0x9d, 0x3d, 0xc7, 0x1d, 0x16, 0xfb, 0xff, 0xd9, 0x7d, 0xbe, 0xb0, 0xaa, 0x76, 0xa0, 0xda, 0x9f,
+0xa2, 0xa9, 0x05, 0xbe, 0xb3, 0xdb, 0x3a, 0x00, 0x05, 0x27, 0x8f, 0x4a, 0xc8, 0x64, 0xda, 0x70,
+0x7a, 0x6c, 0xe4, 0x58, 0x4f, 0x3a, 0xc6, 0x15, 0xb2, 0xf0, 0x45, 0xcf, 0x9d, 0xb4, 0xc4, 0xa2,
+0x72, 0x9a, 0x42, 0x9c, 0xf8, 0xa8, 0xf1, 0xc0, 0xe7, 0xe2, 0x62, 0x0b, 0xbb, 0x34, 0x70, 0x58,
+0x3c, 0x70, 0x8a, 0x77, 0x84, 0x6d, 0xb3, 0x54, 0x97, 0x32, 0xd0, 0x0c, 0xfc, 0xe7, 0xc7, 0xc7,
+0xb9, 0xae, 0xb8, 0x9e, 0x76, 0x98, 0x0e, 0x9d, 0x0d, 0xad, 0xd5, 0xc8, 0xfc, 0xed, 0xd2, 0x17,
+0x57, 0x40, 0xc0, 0x60, 0x94, 0x73, 0xb8, 0x75, 0xc2, 0x67, 0x25, 0x4d, 0x07, 0x2b, 0x22, 0x06,
+0xad, 0xe2, 0xf5, 0xc3, 0x95, 0xac, 0x64, 0x9e, 0xfe, 0x9a, 0x18, 0xa3, 0x0d, 0xb7, 0x91, 0xd5,
+0x30, 0xfb, 0xe1, 0x22, 0x87, 0x46, 0xf8, 0x60, 0x1a, 0x6e, 0x70, 0x6c, 0x00, 0x5d, 0x01, 0x43,
+0xbb, 0x22, 0x44, 0x00, 0x1b, 0xdf, 0xdb, 0xc2, 0x35, 0xae, 0x68, 0xa3, 0xd8, 0xa3, 0x81, 0xaf,
+0xb1, 0xc5, 0xaf, 0xe3, 0xd0, 0x05, 0x79, 0x27, 0x61, 0x44, 0xac, 0x58, 0xb4, 0x61, 0x52, 0x5e,
+0x71, 0x4f, 0xa5, 0x37, 0x30, 0x1a, 0xb8, 0xfa, 0x05, 0xdd, 0xd3, 0xc4, 0xd3, 0xb4, 0xd9, 0xae,
+0x2f, 0xb3, 0x39, 0xc1, 0x8f, 0xd6, 0x28, 0xf0, 0x30, 0x0b, 0xb5, 0x24, 0x41, 0x3a, 0x7d, 0x49,
+0xd9, 0x4f, 0xad, 0x4c, 0xcd, 0x3f, 0x03, 0x2b, 0x82, 0x11, 0x96, 0xf6, 0x4b, 0xde, 0xe3, 0xcb,
+0xd7, 0xc1, 0x83, 0xc0, 0xa1, 0xc7, 0xa9, 0xd4, 0x82, 0xe5, 0xde, 0xf7, 0x30, 0x0a, 0xbe, 0x1b,
+0x0f, 0x2b, 0x79, 0x36, 0xbb, 0x3b, 0x91, 0x39, 0x79, 0x2f, 0xe7, 0x1e, 0x96, 0x0a, 0xe2, 0xf5,
+0x8c, 0xe4, 0xf1, 0xd8, 0x4d, 0xd4, 0x03, 0xd6, 0x43, 0xdc, 0x4e, 0xe5, 0x1a, 0xef, 0x3c, 0xf9,
+0x6c, 0x03, 0x08, 0x0e, 0x72, 0x18, 0x2f, 0x21, 0x1d, 0x26, 0xab, 0x25, 0x69, 0x1f, 0x84, 0x14,
+0xb4, 0x07, 0x6c, 0xfb, 0x5a, 0xf2, 0x3c, 0xed, 0x18, 0xec, 0xb6, 0xed, 0x40, 0xf0, 0xba, 0xf2,
+0x92, 0xf4, 0x30, 0xf6, 0xd4, 0xf8, 0x02, 0xfd, 0xee, 0x02, 0x6c, 0x09, 0xbc, 0x0e, 0x5e, 0x11,
+0xfa, 0x10, 0x32, 0x0e, 0x84, 0x0a, 0x78, 0x07, 0x8e, 0x05, 0xf0, 0x04, 0x9e, 0x04, 0x86, 0x03,
+0xc8, 0x00, 0x48, 0xfc, 0x32, 0xf6, 0x20, 0xf0, 0x90, 0xeb, 0xe0, 0xe9, 0xe8, 0xeb, 0xfe, 0xf0,
+0x40, 0xf8, 0x4e, 0x00, 0xce, 0x07, 0x7e, 0x0e, 0x2a, 0x14, 0x98, 0x18, 0x8e, 0x1b, 0x3e, 0x1c,
+0x62, 0x1a, 0x54, 0x15, 0xf6, 0x0c, 0xc8, 0x01, 0x9a, 0xf4, 0x48, 0xe7, 0xd3, 0xdb, 0xcd, 0xd4,
+0xd9, 0xd3, 0x6b, 0xd9, 0xd0, 0xe4, 0x18, 0xf4, 0xc6, 0x04, 0xb6, 0x14, 0x2b, 0x22, 0xe5, 0x2b,
+0x45, 0x31, 0x99, 0x31, 0x43, 0x2d, 0x19, 0x24, 0x72, 0x16, 0xa6, 0x04, 0x32, 0xf0, 0x57, 0xdb,
+0x81, 0xc9, 0x55, 0xbe, 0x83, 0xbc, 0x11, 0xc5, 0x99, 0xd6, 0xf2, 0xed, 0x14, 0x07, 0x69, 0x1e,
+0x05, 0x31, 0xe9, 0x3d, 0xf7, 0x43, 0x97, 0x43, 0xb1, 0x3c, 0x65, 0x2f, 0x0e, 0x1c, 0x6e, 0x03,
+0x7e, 0xe7, 0x09, 0xcc, 0xaf, 0xb5, 0x38, 0xa9, 0xae, 0xa9, 0x41, 0xb7, 0xd9, 0xcf, 0x96, 0xee,
+0x46, 0x0e, 0x13, 0x2a, 0x8f, 0x3f, 0x3b, 0x4d, 0x29, 0x53, 0xcf, 0x50, 0x9d, 0x46, 0x7d, 0x34,
+0x16, 0x1b, 0xee, 0xfb, 0xf7, 0xd9, 0x83, 0xba, 0xd8, 0xa2, 0x3e, 0x98, 0xae, 0x9c, 0xf9, 0xaf,
+0x51, 0xce, 0x24, 0xf2, 0x84, 0x15, 0x05, 0x34, 0x59, 0x4b, 0x22, 0x5a, 0xb8, 0x5f, 0x78, 0x5b,
+0x55, 0x4d, 0xb3, 0x35, 0xe8, 0x15, 0xc0, 0xf0, 0xe5, 0xca, 0x44, 0xaa, 0x8a, 0x94, 0xda, 0x8d,
+0x4c, 0x97, 0x3b, 0xaf, 0xab, 0xd1, 0x36, 0xf8, 0x9f, 0x1d, 0x61, 0x3d, 0x2c, 0x55, 0xa4, 0x63,
+0x18, 0x67, 0x3a, 0x5f, 0x0b, 0x4c, 0xfd, 0x2e, 0xa4, 0x0a, 0x0b, 0xe3, 0x6b, 0xbd, 0xa8, 0x9f,
+0x52, 0x8e, 0xe8, 0x8b, 0xec, 0x98, 0x29, 0xb3, 0xc1, 0xd6, 0x0e, 0xfe, 0xd9, 0x23, 0xfd, 0x43,
+0xbe, 0x5b, 0x90, 0x68, 0x08, 0x69, 0xd4, 0x5c, 0xed, 0x44, 0x41, 0x24, 0x4e, 0xfe, 0xc5, 0xd7,
+0xb9, 0xb5, 0x90, 0x9c, 0xaa, 0x8f, 0xb4, 0x90, 0x5e, 0x9f, 0x51, 0xba, 0xcf, 0xdd, 0xec, 0x04,
+0x7d, 0x2a, 0xd7, 0x49, 0x96, 0x5f, 0xe6, 0x68, 0xa2, 0x64, 0x65, 0x53, 0xfd, 0x37, 0x4a, 0x16,
+0x72, 0xf2, 0x9b, 0xd0, 0x69, 0xb4, 0xda, 0xa0, 0xf4, 0x97, 0xcc, 0x9a, 0xc8, 0xa9, 0x17, 0xc4,
+0x80, 0xe6, 0x30, 0x0c, 0x9d, 0x2f, 0xf3, 0x4b, 0x66, 0x5d, 0xb2, 0x61, 0xc2, 0x58, 0xd1, 0x44,
+0x99, 0x29, 0xee, 0x0a, 0x6a, 0xec, 0xe1, 0xd0, 0x8b, 0xba, 0x3e, 0xab, 0x9e, 0xa4, 0xe2, 0xa7,
+0x57, 0xb6, 0x15, 0xcf, 0x44, 0xef, 0xf6, 0x11, 0x53, 0x31, 0xa5, 0x48, 0xa7, 0x54, 0x1d, 0x54,
+0x9d, 0x48, 0x15, 0x35, 0x11, 0x1d, 0x1a, 0x04, 0x1a, 0xec, 0x01, 0xd7, 0xdf, 0xc5, 0x15, 0xba,
+0xef, 0xb4, 0x75, 0xb8, 0x69, 0xc5, 0x87, 0xdb, 0x84, 0xf7, 0x72, 0x14, 0x51, 0x2d, 0xdf, 0x3d,
+0x57, 0x44, 0xc1, 0x40, 0x87, 0x35, 0x3b, 0x25, 0x08, 0x13, 0xbe, 0x00, 0xbc, 0xef, 0xfd, 0xe0,
+0xd5, 0xd4, 0x61, 0xcc, 0xeb, 0xc8, 0xdf, 0xcb, 0x5d, 0xd6, 0x68, 0xe7, 0x54, 0xfc, 0x32, 0x11,
+0x07, 0x22, 0x39, 0x2c, 0x01, 0x2f, 0x27, 0x2b, 0xc3, 0x22, 0xea, 0x17, 0x40, 0x0c, 0x34, 0x01,
+0x08, 0xf7, 0x78, 0xee, 0x44, 0xe7, 0xef, 0xe1, 0x4f, 0xdf, 0x3b, 0xe0, 0xb6, 0xe5, 0x00, 0xef,
+0xbe, 0xfa, 0x74, 0x06, 0xec, 0x0f, 0x9c, 0x15, 0x2e, 0x17, 0x7a, 0x15, 0x90, 0x11, 0xf6, 0x0c,
+0x6e, 0x08, 0xb8, 0x04, 0xf2, 0x01, 0xae, 0xff, 0x28, 0xfd, 0x12, 0xfa, 0x46, 0xf6, 0x96, 0xf2,
+0x30, 0xf0, 0x88, 0xef, 0x86, 0xf1, 0xfe, 0xf4, 0x18, 0xf9, 0xc8, 0xfc, 0x6a, 0xff, 0x52, 0x01,
+0x1e, 0x03, 0x48, 0x05, 0x74, 0x08, 0x9e, 0x0c, 0x02, 0x11, 0x82, 0x14, 0x52, 0x15, 0x42, 0x12,
+0xf6, 0x0a, 0x7e, 0x00, 0xf6, 0xf4, 0x02, 0xeb, 0x60, 0xe4, 0xb3, 0xe1, 0x6d, 0xe2, 0x8e, 0xe5,
+0x30, 0xea, 0x62, 0xf0, 0xe8, 0xf7, 0x62, 0x01, 0x6e, 0x0c, 0x60, 0x18, 0x7f, 0x23, 0x3f, 0x2b,
+0x19, 0x2d, 0x59, 0x27, 0x3c, 0x1a, 0xbc, 0x07, 0xb6, 0xf3, 0xd7, 0xe1, 0xeb, 0xd4, 0x0d, 0xce,
+0xeb, 0xcc, 0x65, 0xd0, 0xd1, 0xd7, 0xd1, 0xe2, 0x4c, 0xf1, 0xbe, 0x02, 0xfa, 0x15, 0xb5, 0x28,
+0x8b, 0x38, 0x83, 0x41, 0x5b, 0x41, 0xe1, 0x36, 0x33, 0x23, 0xe0, 0x09, 0x08, 0xef, 0x2d, 0xd7,
+0x93, 0xc5, 0xc7, 0xbb, 0x7d, 0xb9, 0x67, 0xbe, 0x6b, 0xc9, 0x55, 0xda, 0x5a, 0xf0, 0xb4, 0x09,
+0xf1, 0x23, 0xc1, 0x3b, 0x07, 0x4d, 0xab, 0x54, 0x61, 0x50, 0x57, 0x40, 0xd3, 0x26, 0xa6, 0x07,
+0x74, 0xe7, 0x0b, 0xcb, 0xe1, 0xb5, 0xf8, 0xa9, 0x1e, 0xa8, 0x57, 0xaf, 0xcf, 0xbf, 0xfb, 0xd7,
+0xd4, 0xf5, 0x1c, 0x16, 0xd3, 0x34, 0xe5, 0x4d, 0xce, 0x5d, 0xf6, 0x61, 0x5c, 0x59, 0x11, 0x45,
+0x6f, 0x27, 0x62, 0x04, 0x45, 0xe0, 0xf7, 0xbf, 0x0a, 0xa8, 0x38, 0x9b, 0x9c, 0x9a, 0x52, 0xa6,
+0xfb, 0xbc, 0x57, 0xdc, 0x60, 0x00, 0x65, 0x24, 0xe9, 0x43, 0x64, 0x5b, 0x00, 0x68, 0x3e, 0x68,
+0x1a, 0x5c, 0x97, 0x44, 0x23, 0x24, 0x20, 0xfe, 0x2d, 0xd7, 0xab, 0xb4, 0xcc, 0x9b, 0x4c, 0x90,
+0x6e, 0x93, 0xa6, 0xa4, 0x8b, 0xc1, 0xf8, 0xe5, 0xac, 0x0c, 0xa9, 0x30, 0x03, 0x4e, 0x0a, 0x62,
+0x3a, 0x6b, 0x84, 0x68, 0xf6, 0x59, 0x8f, 0x40, 0x45, 0x1e, 0x54, 0xf6, 0xcb, 0xcd, 0xec, 0xaa,
+0xc0, 0x93, 0xd0, 0x8b, 0x14, 0x94, 0xb2, 0xaa, 0xbf, 0xcb, 0xe8, 0xf1, 0x8e, 0x17, 0x5f, 0x38,
+0x9b, 0x51, 0xf4, 0x61, 0x04, 0x68, 0x54, 0x63, 0x7d, 0x53, 0x3f, 0x39, 0x56, 0x16, 0x26, 0xee,
+0x59, 0xc6, 0xba, 0xa5, 0x58, 0x92, 0x14, 0x8f, 0xdc, 0x9b, 0x87, 0xb5, 0x47, 0xd7, 0x98, 0xfb,
+0x8d, 0x1d, 0x13, 0x3a, 0x73, 0x4f, 0x8e, 0x5c, 0x74, 0x60, 0x32, 0x5a, 0x7d, 0x49, 0xcf, 0x2e,
+0x40, 0x0c, 0xc2, 0xe5, 0x7f, 0xc1, 0x12, 0xa6, 0x5c, 0x98, 0x24, 0x9a, 0x98, 0xa9, 0x63, 0xc3,
+0x8b, 0xe2, 0x54, 0x02, 0x4d, 0x1f, 0x45, 0x37, 0x01, 0x49, 0x69, 0x53, 0x40, 0x55, 0x8f, 0x4d,
+0x7d, 0x3c, 0xa1, 0x22, 0x88, 0x02, 0xbb, 0xe0, 0x95, 0xc2, 0xb1, 0xad, 0x4a, 0xa5, 0xe4, 0xa9,
+0xaf, 0xb9, 0xfd, 0xd0, 0xe2, 0xeb, 0xa8, 0x06, 0x61, 0x1e, 0x6d, 0x31, 0xf5, 0x3e, 0x81, 0x45,
+0x71, 0x44, 0x85, 0x3b, 0x0f, 0x2b, 0xd0, 0x14, 0x06, 0xfb, 0x59, 0xe1, 0xe7, 0xcb, 0xfb, 0xbd,
+0x75, 0xb9, 0xa3, 0xbe, 0xab, 0xcb, 0x0b, 0xde, 0xa4, 0xf2, 0xb6, 0x06, 0x42, 0x18, 0xe9, 0x25,
+0x95, 0x2e, 0xe5, 0x31, 0x7f, 0x2f, 0xe7, 0x27, 0x1a, 0x1c, 0xee, 0x0c, 0xfe, 0xfb, 0x3e, 0xeb,
+0x2d, 0xdd, 0x89, 0xd3, 0xeb, 0xcf, 0xc1, 0xd2, 0x97, 0xdb, 0x42, 0xe8, 0x9e, 0xf6, 0x4c, 0x04,
+0x88, 0x0f, 0x56, 0x17, 0x36, 0x1b, 0x88, 0x1b, 0x5e, 0x19, 0xa4, 0x15, 0xc4, 0x10, 0xda, 0x0a,
+0x8c, 0x03, 0x22, 0xfb, 0x80, 0xf2, 0x6c, 0xeb, 0x6a, 0xe7, 0x82, 0xe7, 0x46, 0xeb, 0x7c, 0xf1,
+0x2a, 0xf8, 0xdc, 0xfd, 0x78, 0x01, 0xd6, 0x02, 0xce, 0x02, 0xd4, 0x02, 0x32, 0x04, 0x60, 0x07,
+0x8a, 0x0b, 0x18, 0x0f, 0x3e, 0x10, 0x32, 0x0e, 0x5c, 0x09, 0x1a, 0x03, 0x72, 0xfd, 0x70, 0xf9,
+0x46, 0xf7, 0x04, 0xf6, 0xb6, 0xf4, 0x6a, 0xf2, 0x76, 0xef, 0x84, 0xec, 0x5a, 0xeb, 0xbc, 0xed,
+0x44, 0xf4, 0x98, 0xfe, 0xd4, 0x0a, 0x2c, 0x16, 0x57, 0x1e, 0xa9, 0x21, 0x09, 0x20, 0x9c, 0x1a,
+0xec, 0x12, 0x2e, 0x0a, 0xe0, 0x00, 0xd2, 0xf6, 0x32, 0xec, 0x03, 0xe2, 0x45, 0xd9, 0x63, 0xd4,
+0xb9, 0xd4, 0x83, 0xdb, 0xc0, 0xe8, 0xac, 0xfa, 0x88, 0x0e, 0x0b, 0x21, 0x07, 0x2f, 0x67, 0x36,
+0x9d, 0x36, 0x15, 0x30, 0x7f, 0x24, 0x3e, 0x15, 0x64, 0x03, 0x5e, 0xf0, 0x9d, 0xdd, 0x95, 0xcd,
+0xbf, 0xc2, 0xab, 0xbe, 0xcf, 0xc2, 0x21, 0xcf, 0x9d, 0xe2, 0x1a, 0xfb, 0x6e, 0x15, 0xb9, 0x2d,
+0xa9, 0x40, 0x21, 0x4b, 0xc1, 0x4b, 0xc9, 0x42, 0x6d, 0x31, 0x1e, 0x1a, 0x7e, 0xff, 0x68, 0xe4,
+0x4b, 0xcc, 0xfb, 0xb9, 0xb5, 0xaf, 0xbb, 0xae, 0xf1, 0xb6, 0x0b, 0xc8, 0x8f, 0xe0, 0x36, 0xfe,
+0x8b, 0x1d, 0xaf, 0x3a, 0x09, 0x51, 0x3c, 0x5d, 0xac, 0x5c, 0x59, 0x4f, 0x73, 0x37, 0x86, 0x18,
+0xe6, 0xf6, 0xfb, 0xd6, 0x9f, 0xbc, 0xb0, 0xaa, 0x94, 0xa2, 0x7c, 0xa4, 0x3d, 0xb0, 0x19, 0xc5,
+0xe1, 0xe1, 0xe0, 0x03, 0xa1, 0x27, 0x47, 0x48, 0xd2, 0x60, 0x4c, 0x6c, 0x54, 0x68, 0x3c, 0x55,
+0x95, 0x36, 0x8e, 0x11, 0xac, 0xeb, 0xfb, 0xc9, 0xf7, 0xaf, 0xee, 0x9f, 0x5a, 0x9a, 0x2e, 0x9f,
+0x15, 0xae, 0x87, 0xc6, 0x0c, 0xe7, 0xda, 0x0c, 0x85, 0x33, 0xa8, 0x55, 0x4e, 0x6d, 0x94, 0x75,
+0x74, 0x6c, 0xbf, 0x53, 0x67, 0x30, 0xaa, 0x08, 0x01, 0xe2, 0xe7, 0xc0, 0xae, 0xa8, 0xb4, 0x9a,
+0x7e, 0x97, 0xee, 0x9e, 0xe1, 0xb0, 0xe7, 0xcc, 0xd4, 0xf0, 0xd8, 0x18, 0xf7, 0x3f, 0x32, 0x60,
+0xbc, 0x73, 0xac, 0x76, 0x4a, 0x68, 0x09, 0x4c, 0x5d, 0x27, 0xe8, 0xff, 0xdb, 0xda, 0x0f, 0xbc,
+0x18, 0xa6, 0x80, 0x9a, 0xb0, 0x99, 0xec, 0xa3, 0x19, 0xb9, 0xbf, 0xd7, 0xf6, 0xfc, 0x45, 0x24,
+0x25, 0x48, 0x62, 0x63, 0x62, 0x71, 0x8a, 0x6f, 0xa8, 0x5e, 0xfb, 0x41, 0xbb, 0x1e, 0xe0, 0xf9,
+0x97, 0xd7, 0x7b, 0xbb, 0x50, 0xa8, 0x70, 0x9f, 0xa6, 0xa1, 0xe3, 0xae, 0x27, 0xc6, 0x66, 0xe5,
+0xa6, 0x08, 0x49, 0x2b, 0x3b, 0x49, 0xfe, 0x5d, 0xde, 0x66, 0x62, 0x62, 0x6f, 0x51, 0x13, 0x37,
+0x20, 0x17, 0xc0, 0xf5, 0xf1, 0xd6, 0x6d, 0xbe, 0x6d, 0xae, 0x20, 0xa9, 0x79, 0xae, 0xed, 0xbd,
+0x8b, 0xd5, 0xec, 0xf1, 0xce, 0x0f, 0x91, 0x2b, 0x3d, 0x42, 0x5d, 0x51, 0x1a, 0x57, 0x5f, 0x52,
+0x97, 0x43, 0xa5, 0x2c, 0xa0, 0x10, 0x9c, 0xf3, 0x57, 0xd9, 0x51, 0xc5, 0x31, 0xba, 0xc7, 0xb8,
+0xcf, 0xc0, 0x47, 0xd0, 0xba, 0xe4, 0x48, 0xfb, 0x42, 0x11, 0xe3, 0x24, 0xcb, 0x34, 0xa5, 0x3f,
+0xb9, 0x43, 0xff, 0x3f, 0x13, 0x34, 0x55, 0x21, 0x56, 0x0a, 0xe6, 0xf2, 0xdd, 0xde, 0x25, 0xd1,
+0x3b, 0xcb, 0x2b, 0xcd, 0x9d, 0xd5, 0x39, 0xe2, 0xa2, 0xf0, 0xe8, 0xfe, 0x62, 0x0c, 0x7e, 0x18,
+0xed, 0x22, 0xa3, 0x2a, 0x5b, 0x2e, 0x9f, 0x2c, 0x83, 0x24, 0x24, 0x17, 0xce, 0x06, 0xfe, 0xf6,
+0x74, 0xea, 0x29, 0xe3, 0x87, 0xe1, 0x7e, 0xe4, 0x40, 0xea, 0xba, 0xf0, 0xde, 0xf6, 0x30, 0xfc,
+0x46, 0x01, 0xd8, 0x06, 0xf2, 0x0c, 0x2c, 0x13, 0xb2, 0x17, 0x32, 0x19, 0xb2, 0x16, 0xb0, 0x10,
+0xf0, 0x08, 0x8e, 0x01, 0x74, 0xfc, 0x14, 0xfa, 0x0e, 0xfa, 0xd2, 0xfa, 0x2e, 0xfb, 0x1e, 0xfa,
+0xb6, 0xf7, 0xc8, 0xf4, 0x9e, 0xf2, 0xc2, 0xf2, 0xa8, 0xf5, 0xe2, 0xfa, 0x68, 0x01, 0xb2, 0x07,
+0xaa, 0x0c, 0xd2, 0x0f, 0x76, 0x11, 0x40, 0x12, 0x96, 0x12, 0x1e, 0x12, 0xac, 0x10, 0x56, 0x0d,
+0x96, 0x07, 0x86, 0xff, 0xb4, 0xf5, 0xa8, 0xeb, 0x3b, 0xe3, 0x4f, 0xde, 0x31, 0xde, 0x93, 0xe3,
+0x5c, 0xed, 0x2c, 0xfa, 0xe8, 0x07, 0x8e, 0x14, 0xe5, 0x1e, 0xc7, 0x25, 0x23, 0x29, 0xbf, 0x28,
+0x79, 0x24, 0x49, 0x1c, 0x60, 0x10, 0x6c, 0x01, 0x6c, 0xf0, 0x61, 0xdf, 0xcf, 0xd0, 0xcd, 0xc7,
+0x7d, 0xc6, 0xf7, 0xcd, 0x99, 0xdd, 0xc4, 0xf2, 0xe6, 0x09, 0x57, 0x1f, 0x25, 0x30, 0xf3, 0x3a,
+0x01, 0x3f, 0xa9, 0x3c, 0x5f, 0x34, 0xeb, 0x26, 0xcc, 0x14, 0x02, 0xff, 0x34, 0xe7, 0xf9, 0xcf,
+0xd3, 0xbc, 0xa5, 0xb1, 0xa1, 0xb1, 0xd5, 0xbd, 0xcb, 0xd4, 0x5e, 0xf2, 0x6e, 0x11, 0xd9, 0x2c,
+0x4b, 0x41, 0xf5, 0x4c, 0x11, 0x50, 0x05, 0x4b, 0x05, 0x3f, 0xab, 0x2c, 0x00, 0x15, 0x28, 0xf9,
+0x6b, 0xdb, 0x6f, 0xbf, 0xf0, 0xa9, 0xd6, 0x9f, 0xa6, 0xa3, 0xe9, 0xb5, 0xad, 0xd3, 0x98, 0xf7,
+0x48, 0x1b, 0x73, 0x39, 0xf3, 0x4e, 0x94, 0x5a, 0x84, 0x5c, 0x32, 0x55, 0x95, 0x45, 0xab, 0x2e,
+0x5c, 0x11, 0xa6, 0xef, 0xef, 0xcc, 0x61, 0xae, 0x80, 0x99, 0x84, 0x92, 0x7a, 0x9b, 0x6b, 0xb3,
+0x4b, 0xd6, 0xf8, 0xfd, 0x09, 0x24, 0x71, 0x43, 0x72, 0x59, 0xe0, 0x64, 0x5c, 0x65, 0x24, 0x5b,
+0x05, 0x47, 0x67, 0x2a, 0x72, 0x07, 0x7d, 0xe1, 0x3d, 0xbd, 0x62, 0xa0, 0xca, 0x8f, 0x4c, 0x8e,
+0x50, 0x9c, 0xd3, 0xb7, 0xd9, 0xdc, 0x4e, 0x05, 0x5d, 0x2b, 0x69, 0x4a, 0xfa, 0x5f, 0x56, 0x6a,
+0x86, 0x68, 0x8e, 0x5a, 0xe1, 0x41, 0x07, 0x21, 0x20, 0xfb, 0x9b, 0xd4, 0x9d, 0xb2, 0x4a, 0x9a,
+0xd6, 0x8e, 0x9a, 0x91, 0x46, 0xa2, 0xe5, 0xbe, 0xbd, 0xe3, 0x50, 0x0b, 0x71, 0x30, 0xc7, 0x4e,
+0x2a, 0x63, 0x4c, 0x6b, 0xe8, 0x65, 0xe5, 0x53, 0x69, 0x37, 0x3c, 0x14, 0x8e, 0xee, 0x25, 0xcb,
+0x55, 0xae, 0x8e, 0x9b, 0x7e, 0x94, 0xd4, 0x99, 0x2a, 0xab, 0x1d, 0xc7, 0x6c, 0xea, 0x88, 0x10,
+0x27, 0x34, 0x9b, 0x50, 0x30, 0x62, 0x80, 0x66, 0x0c, 0x5d, 0x8b, 0x47, 0x8b, 0x29, 0xa4, 0x07,
+0x12, 0xe6, 0x8f, 0xc8, 0x2f, 0xb2, 0x70, 0xa4, 0x6c, 0xa0, 0x82, 0xa6, 0x3d, 0xb7, 0x4b, 0xd1,
+0x4e, 0xf2, 0x68, 0x15, 0xa3, 0x35, 0x0d, 0x4e, 0xdc, 0x5a, 0x74, 0x5a, 0x9f, 0x4d, 0x61, 0x37,
+0x7a, 0x1b, 0x50, 0xfe, 0x1f, 0xe3, 0xbb, 0xcc, 0x4b, 0xbc, 0x73, 0xb2, 0x23, 0xb0, 0x25, 0xb6,
+0x2d, 0xc5, 0x5d, 0xdc, 0x50, 0xf9, 0xa8, 0x17, 0x71, 0x32, 0x0b, 0x45, 0x79, 0x4c, 0x8d, 0x48,
+0x05, 0x3b, 0xfd, 0x26, 0x64, 0x10, 0x2e, 0xfa, 0xa4, 0xe6, 0xe3, 0xd6, 0x71, 0xcb, 0xb3, 0xc4,
+0x65, 0xc3, 0x81, 0xc8, 0xa3, 0xd4, 0x62, 0xe7, 0x38, 0xfe, 0x8a, 0x15, 0xdd, 0x28, 0xfd, 0x34,
+0x1f, 0x38, 0x05, 0x33, 0xbb, 0x27, 0x30, 0x19, 0xd4, 0x09, 0x7a, 0xfb, 0x44, 0xef, 0x6e, 0xe5,
+0x43, 0xde, 0xa7, 0xd9, 0x9f, 0xd8, 0xa7, 0xdb, 0x4b, 0xe3, 0x04, 0xef, 0x8a, 0xfd, 0x30, 0x0c,
+0x18, 0x18, 0x4b, 0x1f, 0xe3, 0x20, 0xcf, 0x1d, 0x6e, 0x17, 0x7e, 0x0f, 0xa0, 0x07, 0xce, 0x00,
+0x28, 0xfb, 0x96, 0xf6, 0x10, 0xf3, 0x44, 0xf0, 0x5c, 0xee, 0x94, 0xed, 0x54, 0xee, 0x6c, 0xf1,
+0x5c, 0xf6, 0x4a, 0xfc, 0x20, 0x02, 0xc6, 0x06, 0x92, 0x09, 0x90, 0x0a, 0x3a, 0x0a, 0x6c, 0x09,
+0x24, 0x09, 0x7c, 0x09, 0x5a, 0x0a, 0x24, 0x0b, 0xda, 0x0a, 0x58, 0x08, 0x2a, 0x03, 0xb6, 0xfb,
+0x84, 0xf3, 0xaa, 0xec, 0x76, 0xe8, 0xc8, 0xe7, 0x10, 0xea, 0x5e, 0xee, 0x9e, 0xf3, 0x46, 0xf9,
+0x22, 0xff, 0xac, 0x05, 0x2e, 0x0d, 0x06, 0x15, 0x7f, 0x1c, 0xad, 0x21, 0xc1, 0x22, 0x33, 0x1e,
+0xb4, 0x13, 0x5a, 0x04, 0x0a, 0xf3, 0x57, 0xe3, 0xf3, 0xd7, 0x8f, 0xd2, 0x19, 0xd3, 0x77, 0xd8,
+0x2d, 0xe1, 0x10, 0xec, 0xae, 0xf8, 0xa8, 0x06, 0xc2, 0x15, 0x8b, 0x24, 0x07, 0x31, 0x8d, 0x38,
+0x91, 0x38, 0x59, 0x2f, 0xb5, 0x1d, 0x36, 0x06, 0x02, 0xed, 0x7f, 0xd6, 0x55, 0xc6, 0x61, 0xbe,
+0xbb, 0xbe, 0xe1, 0xc5, 0x2b, 0xd2, 0xc5, 0xe2, 0x54, 0xf6, 0x1a, 0x0c, 0x4f, 0x22, 0xd3, 0x36,
+0x1b, 0x46, 0x21, 0x4d, 0x39, 0x49, 0x49, 0x3a, 0x23, 0x22, 0x0c, 0x04, 0xe0, 0xe4, 0x99, 0xc9,
+0xfd, 0xb5, 0x5d, 0xac, 0xe1, 0xac, 0x4f, 0xb6, 0x5d, 0xc7, 0x77, 0xde, 0xb8, 0xf9, 0xe0, 0x16,
+0xf9, 0x32, 0x35, 0x4a, 0x28, 0x59, 0xb8, 0x5c, 0x99, 0x53, 0xeb, 0x3e, 0x53, 0x21, 0xca, 0xfe,
+0xef, 0xdb, 0x97, 0xbd, 0xea, 0xa7, 0x9c, 0x9d, 0x3a, 0x9f, 0xef, 0xab, 0xa3, 0xc2, 0xb3, 0xe0,
+0xce, 0x02, 0x31, 0x25, 0x9b, 0x43, 0x44, 0x5a, 0x06, 0x66, 0x02, 0x65, 0x42, 0x57, 0xad, 0x3e,
+0xef, 0x1d, 0x8e, 0xf8, 0x03, 0xd3, 0x87, 0xb2, 0xd6, 0x9b, 0xec, 0x91, 0x16, 0x96, 0xc0, 0xa7,
+0x9b, 0xc4, 0x04, 0xe9, 0xe4, 0x0f, 0xfd, 0x33, 0x45, 0x51, 0x76, 0x64, 0xba, 0x6b, 0x9c, 0x66,
+0xba, 0x55, 0xdb, 0x3a, 0x7a, 0x18, 0xb4, 0xf1, 0xe1, 0xca, 0xd2, 0xa9, 0x98, 0x93, 0x04, 0x8c,
+0x7c, 0x94, 0x5f, 0xab, 0x69, 0xcd, 0xea, 0xf4, 0x34, 0x1c, 0x23, 0x3e, 0x98, 0x57, 0x78, 0x66,
+0x06, 0x6a, 0x70, 0x62, 0x11, 0x50, 0xb5, 0x34, 0xc6, 0x11, 0x60, 0xea, 0xb1, 0xc3, 0xb8, 0xa3,
+0x04, 0x90, 0x72, 0x8c, 0x9c, 0x99, 0xc5, 0xb4, 0x3d, 0xd9, 0x68, 0x00, 0xbd, 0x24, 0xab, 0x42,
+0x66, 0x57, 0x54, 0x62, 0x20, 0x63, 0xd4, 0x59, 0x15, 0x47, 0xb7, 0x2b, 0xde, 0x08, 0xa3, 0xe2,
+0x4f, 0xbe, 0x06, 0xa2, 0x4e, 0x93, 0x0c, 0x95, 0xf8, 0xa5, 0xbf, 0xc2, 0xb8, 0xe5, 0xe6, 0x08,
+0x57, 0x28, 0xc5, 0x40, 0x3b, 0x51, 0xfc, 0x58, 0x08, 0x58, 0x17, 0x4e, 0x9f, 0x3b, 0xff, 0x20,
+0x66, 0x00, 0xb3, 0xdd, 0x25, 0xbe, 0x8c, 0xa7, 0x12, 0x9e, 0x2e, 0xa3, 0x2f, 0xb5, 0x27, 0xd0,
+0xf0, 0xee, 0xdc, 0x0c, 0x85, 0x26, 0x53, 0x3a, 0xff, 0x46, 0x05, 0x4c, 0x33, 0x49, 0xa1, 0x3e,
+0x53, 0x2c, 0x16, 0x14, 0x34, 0xf8, 0xf5, 0xdb, 0x3b, 0xc4, 0xe5, 0xb4, 0x5d, 0xb0, 0x67, 0xb7,
+0xcb, 0xc7, 0x0d, 0xde, 0xa2, 0xf6, 0xbe, 0x0d, 0x05, 0x21, 0x69, 0x2f, 0xcd, 0x37, 0x05, 0x3a,
+0x2d, 0x36, 0x33, 0x2c, 0x23, 0x1d, 0xdc, 0x0a, 0xb0, 0xf6, 0x41, 0xe3, 0x55, 0xd3, 0x11, 0xc9,
+0x57, 0xc6, 0xa7, 0xcb, 0x7f, 0xd7, 0xce, 0xe7, 0x8c, 0xf9, 0x2a, 0x0a, 0x8e, 0x17, 0x3f, 0x20,
+0x65, 0x24, 0x51, 0x24, 0x5f, 0x20, 0xa0, 0x19, 0x06, 0x11, 0x48, 0x07, 0xf0, 0xfc, 0x6e, 0xf2,
+0x9a, 0xe8, 0x41, 0xe1, 0xe3, 0xdd, 0x7b, 0xdf, 0x6c, 0xe5, 0x64, 0xee, 0x8e, 0xf8, 0xfa, 0x01,
+0x38, 0x09, 0x76, 0x0d, 0x7a, 0x0e, 0x6e, 0x0d, 0x96, 0x0b, 0x02, 0x0a, 0x4c, 0x09, 0xf2, 0x08,
+0xd6, 0x07, 0xa0, 0x04, 0x9c, 0xff, 0xea, 0xf9, 0xd0, 0xf5, 0x8a, 0xf3, 0x98, 0xf4, 0x5a, 0xf6,
+0xdc, 0xf6, 0x64, 0xf6, 0xca, 0xf5, 0x5a, 0xf7, 0x5c, 0xfb, 0x6a, 0x02, 0x22, 0x0b, 0xbc, 0x13,
+0x5a, 0x19, 0x96, 0x1a, 0x18, 0x17, 0xfc, 0x0f, 0xc2, 0x07, 0xb6, 0xff, 0x90, 0xf8, 0x50, 0xf2,
+0x58, 0xec, 0x60, 0xe6, 0x53, 0xe1, 0x4f, 0xde, 0x49, 0xdf, 0x5e, 0xe5, 0x9c, 0xf0, 0xbc, 0xff,
+0x90, 0x10, 0xef, 0x1f, 0xdb, 0x2a, 0x93, 0x2f, 0x33, 0x2d, 0x25, 0x25, 0xfa, 0x18, 0x6c, 0x0a,
+0x00, 0xfb, 0x98, 0xeb, 0xff, 0xdc, 0xe1, 0xd0, 0x09, 0xc9, 0x1b, 0xc7, 0x7b, 0xcc, 0x13, 0xd9,
+0xea, 0xeb, 0xa8, 0x02, 0x34, 0x1a, 0x09, 0x2f, 0xff, 0x3d, 0xb5, 0x44, 0x4d, 0x42, 0x5d, 0x37,
+0x9f, 0x25, 0x74, 0x0f, 0x24, 0xf7, 0x45, 0xdf, 0x7b, 0xca, 0x4b, 0xbb, 0x03, 0xb4, 0xb1, 0xb5,
+0x5b, 0xc0, 0x19, 0xd3, 0xf2, 0xeb, 0x0e, 0x08, 0x49, 0x24, 0x13, 0x3d, 0xdd, 0x4e, 0xfa, 0x56,
+0x6f, 0x53, 0x8b, 0x44, 0x3f, 0x2c, 0xe2, 0x0d, 0x80, 0xed, 0x7b, 0xcf, 0x87, 0xb7, 0x7a, 0xa8,
+0x10, 0xa4, 0xe0, 0xa9, 0x5b, 0xb9, 0xfb, 0xd0, 0x5a, 0xee, 0xb4, 0x0e, 0xc5, 0x2e, 0x8f, 0x4a,
+0x4e, 0x5e, 0x56, 0x66, 0xf2, 0x5f, 0xad, 0x4b, 0x75, 0x2c, 0x1c, 0x07, 0x7b, 0xe1, 0xdb, 0xc0,
+0x26, 0xa9, 0xa4, 0x9c, 0x66, 0x9b, 0x9c, 0xa4, 0x6b, 0xb7, 0x23, 0xd2, 0xc4, 0xf2, 0x7a, 0x16,
+0x9d, 0x39, 0x98, 0x57, 0x8a, 0x6b, 0xe0, 0x70, 0xa2, 0x65, 0x3b, 0x4b, 0x19, 0x26, 0xd6, 0xfc,
+0x83, 0xd5, 0x89, 0xb5, 0xe4, 0x9f, 0x22, 0x96, 0xcc, 0x97, 0x1a, 0xa4, 0xdf, 0xb9, 0xb3, 0xd7,
+0x56, 0xfb, 0x6b, 0x21, 0xdd, 0x45, 0x02, 0x63, 0xda, 0x73, 0x2a, 0x74, 0x40, 0x63, 0x0d, 0x44,
+0x30, 0x1c, 0x34, 0xf2, 0x4f, 0xcc, 0x05, 0xaf, 0xac, 0x9c, 0x16, 0x96, 0x9e, 0x9a, 0x78, 0xa9,
+0xb3, 0xc1, 0x99, 0xe1, 0x70, 0x06, 0x6d, 0x2c, 0xcb, 0x4e, 0x0a, 0x68, 0x96, 0x73, 0xc8, 0x6e,
+0x14, 0x5a, 0x4f, 0x39, 0x58, 0x12, 0xce, 0xea, 0x59, 0xc8, 0x57, 0xae, 0xe0, 0x9e, 0xc6, 0x9a,
+0xa0, 0xa1, 0x8f, 0xb2, 0xa7, 0xcc, 0x84, 0xed, 0x96, 0x11, 0xe5, 0x34, 0x31, 0x52, 0x7c, 0x65,
+0x76, 0x6b, 0x00, 0x63, 0x8f, 0x4d, 0xc9, 0x2e, 0x44, 0x0b, 0xf4, 0xe7, 0x6f, 0xc9, 0xe7, 0xb2,
+0x62, 0xa6, 0x98, 0xa4, 0x2d, 0xad, 0x9d, 0xbf, 0xd1, 0xd9, 0xf0, 0xf8, 0x10, 0x19, 0x5f, 0x36,
+0x05, 0x4d, 0x44, 0x5a, 0x9a, 0x5c, 0x81, 0x53, 0x8b, 0x40, 0x8d, 0x25, 0xa6, 0x06, 0xda, 0xe7,
+0xa1, 0xcd, 0xd7, 0xba, 0xd1, 0xb1, 0xcd, 0xb2, 0xa9, 0xbd, 0x8f, 0xd0, 0x7c, 0xe8, 0xa8, 0x02,
+0x6a, 0x1b, 0x83, 0x30, 0x15, 0x40, 0xdb, 0x48, 0xa3, 0x49, 0x4f, 0x42, 0x95, 0x32, 0x8b, 0x1c,
+0x14, 0x03, 0xec, 0xe9, 0x3d, 0xd5, 0xa9, 0xc7, 0x63, 0xc2, 0xf9, 0xc5, 0xfd, 0xd0, 0x3d, 0xe1,
+0x14, 0xf4, 0x72, 0x06, 0xe2, 0x16, 0x5f, 0x24, 0x33, 0x2e, 0x15, 0x34, 0x49, 0x35, 0x97, 0x30,
+0xe9, 0x25, 0xb0, 0x15, 0x80, 0x02, 0xf6, 0xef, 0x2b, 0xe1, 0x97, 0xd8, 0x47, 0xd7, 0x09, 0xdc,
+0x3a, 0xe5, 0x10, 0xf0, 0x92, 0xfa, 0xd4, 0x03, 0x80, 0x0b, 0x0e, 0x12, 0xd0, 0x17, 0xb5, 0x1c,
+0x69, 0x1f, 0xdf, 0x1e, 0xb2, 0x19, 0xa2, 0x10, 0x46, 0x05, 0x72, 0xfa, 0xac, 0xf2, 0x34, 0xef,
+0xd4, 0xef, 0xcc, 0xf2, 0x56, 0xf6, 0xe6, 0xf8, 0x16, 0xfa, 0x5e, 0xfa, 0xd2, 0xfa, 0x68, 0xfc,
+0xce, 0xff, 0xba, 0x04, 0x50, 0x0a, 0xea, 0x0e, 0x42, 0x11, 0xba, 0x10, 0x8c, 0x0e, 0xb6, 0x0b,
+0x9a, 0x09, 0x3c, 0x08, 0x00, 0x07, 0x16, 0x05, 0x40, 0x01, 0x96, 0xfb, 0xae, 0xf4, 0x0a, 0xee,
+0xec, 0xe8, 0xda, 0xe6, 0xa2, 0xe8, 0xa6, 0xee, 0x14, 0xf8, 0xf0, 0x02, 0xb6, 0x0d, 0x9a, 0x16,
+0x11, 0x1d, 0xab, 0x20, 0x73, 0x21, 0x91, 0x1f, 0xae, 0x1a, 0xe8, 0x12, 0x32, 0x08, 0x6c, 0xfb,
+0xb2, 0xed, 0xad, 0xe0, 0x6d, 0xd6, 0x09, 0xd1, 0x1f, 0xd2, 0x39, 0xda, 0xea, 0xe8, 0xae, 0xfb,
+0xa2, 0x0f, 0x93, 0x21, 0xfd, 0x2e, 0xfd, 0x36, 0x97, 0x38, 0x45, 0x34, 0xbf, 0x2a, 0xd3, 0x1c,
+0x96, 0x0b, 0x0e, 0xf8, 0xc6, 0xe3, 0x15, 0xd1, 0xb1, 0xc2, 0x07, 0xbb, 0x21, 0xbd, 0x8f, 0xc9,
+0x3d, 0xdf, 0xf8, 0xfa, 0x86, 0x17, 0xa1, 0x30, 0x97, 0x42, 0x91, 0x4b, 0x93, 0x4b, 0xb9, 0x43,
+0x07, 0x35, 0x77, 0x21, 0x1a, 0x0a, 0x5c, 0xf0, 0xb1, 0xd6, 0x89, 0xbf, 0xc1, 0xae, 0x0c, 0xa8,
+0xab, 0xad, 0x77, 0xc0, 0x15, 0xde, 0x80, 0x01, 0x5b, 0x24, 0x07, 0x41, 0xc5, 0x53, 0x9a, 0x5b,
+0xfe, 0x58, 0x2f, 0x4d, 0x6b, 0x3a, 0xe3, 0x21, 0x58, 0x05, 0x4e, 0xe6, 0xe7, 0xc7, 0x23, 0xae,
+0x7e, 0x9d, 0xb6, 0x99, 0xac, 0xa4, 0x0b, 0xbe, 0xab, 0xe1, 0x92, 0x09, 0xed, 0x2e, 0x7f, 0x4c,
+0x42, 0x5f, 0x4e, 0x66, 0xf8, 0x61, 0xb1, 0x53, 0x23, 0x3d, 0xd1, 0x1f, 0x1e, 0xfe, 0xaf, 0xda,
+0x95, 0xb9, 0x04, 0xa0, 0x16, 0x92, 0x16, 0x93, 0xac, 0xa3, 0xb9, 0xc1, 0xea, 0xe8, 0xb0, 0x12,
+0x61, 0x38, 0x58, 0x55, 0xe6, 0x66, 0xfc, 0x6b, 0x38, 0x65, 0x6d, 0x53, 0xc7, 0x38, 0x96, 0x17,
+0x54, 0xf2, 0x4d, 0xcd, 0x47, 0xad, 0x38, 0x97, 0x84, 0x8e, 0xae, 0x94, 0x20, 0xa9, 0x81, 0xc9,
+0xd2, 0xf0, 0x62, 0x19, 0xb5, 0x3d, 0x58, 0x59, 0xac, 0x69, 0x10, 0x6d, 0x9e, 0x63, 0xa3, 0x4e,
+0x5f, 0x30, 0xfe, 0x0b, 0xc8, 0xe5, 0x7d, 0xc2, 0xea, 0xa6, 0x7e, 0x96, 0xf2, 0x92, 0xa8, 0x9c,
+0x67, 0xb2, 0xe3, 0xd1, 0x6e, 0xf7, 0x05, 0x1e, 0x9b, 0x40, 0x9c, 0x5a, 0xae, 0x68, 0x36, 0x69,
+0x4a, 0x5c, 0xc1, 0x43, 0x43, 0x23, 0xf8, 0xfe, 0x95, 0xdb, 0xbd, 0xbd, 0x6e, 0xa8, 0xb6, 0x9d,
+0xe4, 0x9d, 0xbe, 0xa8, 0xb7, 0xbd, 0x0f, 0xdb, 0x80, 0xfd, 0xe3, 0x20, 0x1f, 0x40, 0x8c, 0x56,
+0x16, 0x61, 0xf0, 0x5d, 0x21, 0x4e, 0x8b, 0x34, 0x02, 0x15, 0x96, 0xf4, 0x4f, 0xd7, 0x53, 0xc0,
+0x51, 0xb1, 0xe6, 0xaa, 0xf1, 0xac, 0xab, 0xb7, 0x99, 0xca, 0x6e, 0xe4, 0xec, 0x02, 0xa9, 0x21,
+0x39, 0x3c, 0xff, 0x4d, 0x1d, 0x54, 0xcf, 0x4d, 0xe1, 0x3c, 0xc5, 0x24, 0xe8, 0x09, 0x68, 0xf0,
+0xe1, 0xda, 0xfb, 0xca, 0x15, 0xc1, 0x1b, 0xbd, 0x4f, 0xbf, 0xdb, 0xc7, 0xeb, 0xd6, 0xe8, 0xeb,
+0x9e, 0x04, 0x65, 0x1d, 0x0b, 0x32, 0xab, 0x3e, 0x03, 0x41, 0xab, 0x39, 0x9f, 0x2a, 0xba, 0x17,
+0x56, 0x04, 0xea, 0xf2, 0x02, 0xe5, 0xed, 0xda, 0x75, 0xd4, 0x99, 0xd1, 0xdd, 0xd2, 0x61, 0xd8,
+0xe3, 0xe2, 0x84, 0xf1, 0xea, 0x02, 0x50, 0x14, 0x35, 0x22, 0x05, 0x2a, 0xb1, 0x2a, 0xf5, 0x24,
+0xe0, 0x1a, 0x0e, 0x0f, 0x96, 0x03, 0xee, 0xf9, 0x82, 0xf2, 0x00, 0xed, 0x58, 0xe9, 0x28, 0xe7,
+0xc2, 0xe6, 0x54, 0xe8, 0x76, 0xec, 0x22, 0xf3, 0xbc, 0xfb, 0xdc, 0x04, 0xa0, 0x0c, 0xa4, 0x11,
+0x42, 0x13, 0xe6, 0x11, 0x9c, 0x0e, 0xb6, 0x0a, 0x18, 0x07, 0x84, 0x04, 0xee, 0x02, 0xce, 0x01,
+0x74, 0x00, 0x34, 0xfe, 0xc0, 0xfa, 0x98, 0xf6, 0x40, 0xf2, 0x36, 0xef, 0x5a, 0xee, 0x0a, 0xf0,
+0xb2, 0xf3, 0x74, 0xf8, 0x52, 0xfd, 0xde, 0x01, 0xf4, 0x05, 0xb4, 0x09, 0xbe, 0x0d, 0xb4, 0x11,
+0x78, 0x15, 0xcc, 0x17, 0x7e, 0x17, 0x3e, 0x13, 0xb0, 0x0a, 0x7a, 0xfe, 0xd4, 0xf0, 0x64, 0xe4,
+0xcd, 0xdb, 0xad, 0xd8, 0x17, 0xdb, 0xeb, 0xe1, 0x56, 0xeb, 0x10, 0xf6, 0x1e, 0x01, 0x54, 0x0c,
+0x60, 0x17, 0xd7, 0x21, 0x63, 0x2a, 0x21, 0x2f, 0xd7, 0x2d, 0x3f, 0x25, 0x8a, 0x15, 0x76, 0x00,
+0xce, 0xe9, 0xa5, 0xd5, 0xc5, 0xc7, 0x69, 0xc2, 0x41, 0xc5, 0xff, 0xce, 0x39, 0xdd, 0x12, 0xee,
+0x1a, 0x00, 0xb8, 0x12, 0x9f, 0x24, 0x95, 0x34, 0xfd, 0x3f, 0x23, 0x44, 0x4b, 0x3f, 0x3f, 0x30,
+0xe6, 0x18, 0x38, 0xfc, 0x09, 0xdf, 0x15, 0xc6, 0x91, 0xb5, 0x45, 0xaf, 0x8b, 0xb3, 0x4b, 0xc0,
+0x41, 0xd3, 0x66, 0xea, 0xc8, 0x03, 0x6b, 0x1d, 0x71, 0x35, 0x9d, 0x48, 0x41, 0x54, 0x4e, 0x55,
+0x8b, 0x4a, 0xdb, 0x34, 0xd0, 0x16, 0x98, 0xf4, 0xff, 0xd2, 0x77, 0xb7, 0xa4, 0xa5, 0x12, 0xa0,
+0xfc, 0xa5, 0x5b, 0xb6, 0x9b, 0xce, 0x3e, 0xec, 0x6e, 0x0c, 0xed, 0x2b, 0x51, 0x47, 0xc0, 0x5a,
+0x46, 0x63, 0x0a, 0x5f, 0x93, 0x4e, 0xb5, 0x33, 0xb0, 0x11, 0x84, 0xec, 0xfd, 0xc8, 0x19, 0xac,
+0xd8, 0x99, 0xb6, 0x94, 0x10, 0x9d, 0x85, 0xb1, 0x95, 0xcf, 0x80, 0xf3, 0xf4, 0x18, 0x61, 0x3b,
+0x68, 0x56, 0xc6, 0x66, 0x7e, 0x6a, 0x5c, 0x61, 0xb5, 0x4c, 0x1d, 0x2f, 0x5a, 0x0b, 0x30, 0xe5,
+0xeb, 0xc0, 0xac, 0xa3, 0xf0, 0x91, 0x88, 0x8e, 0x10, 0x9a, 0x47, 0xb3, 0x97, 0xd6, 0xc2, 0xfe,
+0x29, 0x26, 0xa9, 0x47, 0x8e, 0x5f, 0x66, 0x6b, 0xa0, 0x6a, 0xf2, 0x5d, 0x53, 0x47, 0xe5, 0x28,
+0xe6, 0x04, 0x97, 0xde, 0x8b, 0xba, 0x0a, 0x9e, 0xec, 0x8d, 0x84, 0x8d, 0x66, 0x9d, 0x35, 0xbb,
+0xf9, 0xe1, 0x42, 0x0b, 0xf9, 0x30, 0x8f, 0x4e, 0x5c, 0x61, 0x66, 0x68, 0x2e, 0x64, 0x0c, 0x56,
+0x4b, 0x3f, 0x69, 0x21, 0x3e, 0xfe, 0xb7, 0xd8, 0x15, 0xb6, 0x1a, 0x9c, 0xba, 0x8f, 0xd8, 0x93,
+0xf8, 0xa7, 0x37, 0xc8, 0xcc, 0xee, 0x06, 0x15, 0xb7, 0x35, 0xc3, 0x4d, 0x82, 0x5b, 0xfe, 0x5e,
+0x08, 0x59, 0x63, 0x4a, 0x43, 0x34, 0x88, 0x17, 0x0e, 0xf6, 0x9f, 0xd3, 0x4d, 0xb5, 0x96, 0xa0,
+0xc4, 0x99, 0x14, 0xa2, 0xe3, 0xb7, 0x01, 0xd7, 0x7a, 0xf9, 0xec, 0x19, 0x67, 0x34, 0xbb, 0x46,
+0x73, 0x50, 0xa1, 0x51, 0xd1, 0x4a, 0xf3, 0x3c, 0x51, 0x28, 0x44, 0x0e, 0x0a, 0xf1, 0xff, 0xd3,
+0xc9, 0xbb, 0xcf, 0xac, 0xda, 0xa9, 0x7d, 0xb3, 0xc9, 0xc7, 0x7f, 0xe2, 0xf6, 0xfe, 0xcc, 0x18,
+0x31, 0x2d, 0xb1, 0x3a, 0xdd, 0x40, 0xff, 0x3f, 0xc5, 0x38, 0xcf, 0x2b, 0x4e, 0x1a, 0x80, 0x05,
+0x48, 0xef, 0x73, 0xda, 0xd9, 0xc9, 0x3b, 0xc0, 0x5b, 0xbf, 0x75, 0xc7, 0xa1, 0xd6, 0x60, 0xea,
+0x2a, 0xff, 0x1e, 0x12, 0xdd, 0x20, 0x49, 0x2a, 0x07, 0x2e, 0x95, 0x2c, 0x7f, 0x26, 0xa3, 0x1c,
+0x36, 0x10, 0x5a, 0x02, 0x58, 0xf4, 0x78, 0xe7, 0x47, 0xdd, 0xcd, 0xd6, 0x55, 0xd5, 0x65, 0xd9,
+0x73, 0xe2, 0xc6, 0xee, 0x4e, 0xfc, 0xd2, 0x08, 0x0a, 0x12, 0x6e, 0x17, 0xb0, 0x18, 0xdc, 0x16,
+0xce, 0x12, 0x1c, 0x0e, 0x72, 0x09, 0x1c, 0x05, 0x98, 0x00, 0x30, 0xfb, 0x3e, 0xf5, 0x5c, 0xef,
+0x7a, 0xeb, 0x7c, 0xea, 0xe4, 0xec, 0xc4, 0xf1, 0xc6, 0xf7, 0x0e, 0xfd, 0x62, 0x00, 0x6e, 0x01,
+0x1a, 0x01, 0x98, 0x00, 0x7e, 0x01, 0x40, 0x04, 0x00, 0x09, 0xdc, 0x0d, 0x36, 0x11, 0x26, 0x11,
+0x60, 0x0d, 0xd8, 0x06, 0x32, 0xff, 0x84, 0xf8, 0x86, 0xf3, 0x6e, 0xf0, 0x30, 0xee, 0x2e, 0xec,
+0x0a, 0xea, 0xc2, 0xe8, 0x9a, 0xe9, 0xc0, 0xed, 0xf0, 0xf5, 0x68, 0x01, 0xb6, 0x0e, 0x46, 0x1b,
+0x1f, 0x24, 0x5d, 0x27, 0x51, 0x24, 0xde, 0x1b, 0xfc, 0x0f, 0xec, 0x02, 0xfe, 0xf5, 0x34, 0xea,
+0xb9, 0xdf, 0x29, 0xd7, 0xbd, 0xd1, 0xd5, 0xd0, 0x9f, 0xd5, 0x7b, 0xe0, 0x9a, 0xf0, 0x50, 0x04,
+0xe6, 0x18, 0x09, 0x2b, 0xe7, 0x37, 0x15, 0x3d, 0xcb, 0x39, 0xb9, 0x2e, 0xbb, 0x1d, 0x56, 0x09,
+0xec, 0xf3, 0x57, 0xdf, 0x9d, 0xcd, 0xd5, 0xc0, 0xab, 0xba, 0xc5, 0xbc, 0x2b, 0xc7, 0x33, 0xd9,
+0xd4, 0xf0, 0x3e, 0x0b, 0xd7, 0x24, 0xc3, 0x3a, 0xab, 0x49, 0x8f, 0x4f, 0xf1, 0x4a, 0x4b, 0x3c,
+0x51, 0x25, 0x42, 0x09, 0x80, 0xeb, 0xe9, 0xcf, 0x2b, 0xba, 0xbd, 0xac, 0x94, 0xa9, 0x61, 0xb0,
+0xaf, 0xc0, 0x43, 0xd8, 0xe0, 0xf4, 0x48, 0x13, 0x5d, 0x30, 0xd3, 0x48, 0x6a, 0x59, 0x50, 0x5f,
+0x46, 0x58, 0xcd, 0x44, 0x0d, 0x27, 0x56, 0x03, 0x3d, 0xdf, 0xa7, 0xbf, 0x00, 0xa9, 0xa4, 0x9d,
+0xfa, 0x9d, 0x36, 0xa9, 0xd7, 0xbd, 0x8b, 0xd9, 0xce, 0xf9, 0x8a, 0x1b, 0x69, 0x3b, 0x16, 0x56,
+0x58, 0x67, 0x76, 0x6b, 0x5c, 0x60, 0xbb, 0x46, 0x73, 0x22, 0x22, 0xf9, 0x59, 0xd1, 0xff, 0xb0,
+0x38, 0x9c, 0x6e, 0x94, 0x20, 0x99, 0x5e, 0xa8, 0x45, 0xc0, 0xaf, 0xde, 0xda, 0x00, 0x3f, 0x24,
+0x59, 0x45, 0x56, 0x60, 0x1a, 0x70, 0xc6, 0x70, 0x7c, 0x60, 0x69, 0x41, 0xb2, 0x18, 0x08, 0xed,
+0x7b, 0xc5, 0x9a, 0xa7, 0x60, 0x96, 0x22, 0x92, 0xb4, 0x99, 0x3c, 0xab, 0x45, 0xc5, 0xa4, 0xe5,
+0xc0, 0x09, 0x25, 0x2e, 0x19, 0x4f, 0xac, 0x67, 0x54, 0x73, 0xac, 0x6e, 0xb6, 0x59, 0xa9, 0x37,
+0x34, 0x0e, 0x1a, 0xe4, 0x8b, 0xbf, 0x68, 0xa5, 0xc4, 0x97, 0x78, 0x96, 0x48, 0xa0, 0x9d, 0xb3,
+0xf1, 0xce, 0xec, 0xef, 0x6e, 0x13, 0xe3, 0x35, 0xf9, 0x52, 0x8c, 0x66, 0x9c, 0x6c, 0xa4, 0x63,
+0x9f, 0x4c, 0x61, 0x2b, 0x06, 0x05, 0x63, 0xdf, 0xc7, 0xbf, 0xca, 0xa9, 0x4c, 0x9f, 0x04, 0xa0,
+0x0a, 0xab, 0x51, 0xbf, 0xcb, 0xda, 0xf6, 0xfa, 0xfa, 0x1b, 0x3b, 0x3a, 0xa7, 0x51, 0x14, 0x5f,
+0x70, 0x60, 0x1a, 0x55, 0x2b, 0x3f, 0x43, 0x21, 0xf8, 0xff, 0x9f, 0xdf, 0xd3, 0xc4, 0xa1, 0xb2,
+0xca, 0xaa, 0x43, 0xad, 0x63, 0xb9, 0xd5, 0xcd, 0xf4, 0xe7, 0xae, 0x04, 0x3b, 0x20, 0x4f, 0x37,
+0xbd, 0x47, 0x83, 0x4f, 0x3d, 0x4e, 0x2f, 0x44, 0xf9, 0x31, 0xe8, 0x19, 0x92, 0xfe, 0xd8, 0xe3,
+0x9f, 0xcd, 0x09, 0xbf, 0x7f, 0xb9, 0xc5, 0xbd, 0x93, 0xca, 0xad, 0xdd, 0x48, 0xf4, 0xa4, 0x0a,
+0x43, 0x1e, 0x57, 0x2d, 0x17, 0x37, 0x5d, 0x3b, 0x25, 0x3a, 0x17, 0x33, 0x55, 0x26, 0x86, 0x14,
+0xb8, 0xff, 0x10, 0xeb, 0x11, 0xda, 0xa3, 0xcf, 0x25, 0xcd, 0x73, 0xd2, 0xd7, 0xdd, 0x98, 0xec,
+0xca, 0xfb, 0x50, 0x09, 0x2c, 0x14, 0x1a, 0x1c, 0xa1, 0x21, 0xeb, 0x24, 0xb9, 0x25, 0x09, 0x23,
+0x2e, 0x1c, 0xf8, 0x10, 0x26, 0x03, 0x78, 0xf5, 0x8a, 0xea, 0xc8, 0xe4, 0x98, 0xe4, 0xde, 0xe8,
+0xbc, 0xef, 0xe2, 0xf6, 0xa2, 0xfc, 0xe0, 0x00, 0xbe, 0x03, 0x48, 0x06, 0x68, 0x09, 0x58, 0x0d,
+0x5e, 0x11, 0x14, 0x14, 0x38, 0x14, 0x38, 0x11, 0xe4, 0x0b, 0xc2, 0x05, 0xc2, 0x00, 0xba, 0xfd,
+0xd2, 0xfc, 0xd4, 0xfc, 0x74, 0xfc, 0x96, 0xfa, 0x36, 0xf7, 0x32, 0xf3, 0x16, 0xf0, 0x26, 0xef,
+0x6c, 0xf1, 0x1c, 0xf7, 0x54, 0xff, 0x58, 0x08, 0x44, 0x10, 0x38, 0x16, 0x2e, 0x19, 0x02, 0x1a,
+0xe6, 0x18, 0x4c, 0x16, 0x12, 0x12, 0xcc, 0x0b, 0x4e, 0x03, 0xf8, 0xf8, 0x1a, 0xee, 0x0a, 0xe4,
+0xb5, 0xdc, 0x8d, 0xd9, 0xa3, 0xdb, 0xa1, 0xe3, 0x86, 0xf0, 0xb4, 0x00, 0x64, 0x11, 0x49, 0x20,
+0x2b, 0x2b, 0xd7, 0x30, 0x23, 0x31, 0xfd, 0x2b, 0x47, 0x22, 0xec, 0x14, 0xe6, 0x04, 0xac, 0xf3,
+0x7d, 0xe2, 0x81, 0xd3, 0x81, 0xc8, 0x85, 0xc3, 0x83, 0xc6, 0xff, 0xd1, 0x8e, 0xe5, 0x4a, 0xfe,
+0x92, 0x18, 0x91, 0x2f, 0x33, 0x40, 0xb9, 0x47, 0x59, 0x46, 0x17, 0x3d, 0x75, 0x2d, 0xfc, 0x19,
+0xde, 0x03, 0x06, 0xed, 0xf7, 0xd6, 0xe3, 0xc3, 0x55, 0xb6, 0x17, 0xb1, 0x49, 0xb6, 0x37, 0xc7,
+0x15, 0xe2, 0x4e, 0x03, 0xb5, 0x24, 0xc3, 0x40, 0xfb, 0x52, 0xb2, 0x59, 0x1c, 0x55, 0x63, 0x47,
+0xef, 0x32, 0x34, 0x1a, 0x5e, 0xff, 0xa3, 0xe3, 0xaf, 0xc9, 0xaf, 0xb3, 0x92, 0xa5, 0x5e, 0xa2,
+0x63, 0xac, 0x0d, 0xc4, 0x30, 0xe6, 0x5c, 0x0d, 0xb7, 0x32, 0xfb, 0x4f, 0x76, 0x61, 0x1e, 0x66,
+0x84, 0x5e, 0x6f, 0x4d, 0x4d, 0x35, 0x7e, 0x18, 0x1e, 0xf9, 0x15, 0xd9, 0x7b, 0xbb, 0x72, 0xa4,
+0xc4, 0x97, 0xd6, 0x98, 0xe2, 0xa8, 0x93, 0xc6, 0xd2, 0xed, 0xc0, 0x17, 0xcd, 0x3d, 0x36, 0x5a,
+0x1e, 0x6a, 0xae, 0x6c, 0xe6, 0x62, 0xe1, 0x4e, 0x39, 0x33, 0x5a, 0x12, 0xc4, 0xee, 0xc1, 0xcb,
+0x8f, 0xad, 0xd8, 0x98, 0xe4, 0x90, 0xec, 0x97, 0x5d, 0xad, 0xd3, 0xce, 0x76, 0xf7, 0xb9, 0x20,
+0xe7, 0x44, 0x62, 0x5f, 0x66, 0x6d, 0x30, 0x6e, 0x58, 0x62, 0x9f, 0x4b, 0xf7, 0x2c, 0xe4, 0x08,
+0x43, 0xe3, 0x69, 0xc0, 0x0c, 0xa5, 0x28, 0x95, 0xc6, 0x92, 0x4a, 0x9e, 0x51, 0xb6, 0xff, 0xd7,
+0xcc, 0xfe, 0x8f, 0x25, 0x29, 0x47, 0xbe, 0x5f, 0x00, 0x6c, 0xe6, 0x6a, 0xaa, 0x5c, 0x57, 0x43,
+0x3b, 0x22, 0xec, 0xfc, 0x51, 0xd8, 0x1d, 0xb9, 0x60, 0xa3, 0x78, 0x99, 0xd6, 0x9b, 0xa0, 0xa9,
+0xab, 0xc1, 0xfd, 0xe0, 0x8e, 0x04, 0xfb, 0x27, 0xa7, 0x46, 0x9a, 0x5c, 0x96, 0x66, 0xaa, 0x62,
+0xf5, 0x51, 0xaf, 0x36, 0xe4, 0x14, 0x98, 0xf1, 0x35, 0xd1, 0x57, 0xb8, 0x20, 0xa9, 0x76, 0xa4,
+0x82, 0xa9, 0x91, 0xb7, 0x45, 0xcd, 0x02, 0xe9, 0x20, 0x08, 0x33, 0x27, 0x01, 0x42, 0x35, 0x54,
+0xd0, 0x5a, 0x4d, 0x54, 0x05, 0x42, 0x5b, 0x27, 0xbe, 0x08, 0xf4, 0xea, 0xff, 0xd1, 0x65, 0xc0,
+0x25, 0xb7, 0x9f, 0xb5, 0x79, 0xbb, 0x81, 0xc7, 0x65, 0xd9, 0x20, 0xf0, 0xaa, 0x09, 0x47, 0x23,
+0xf9, 0x38, 0xa7, 0x46, 0x87, 0x49, 0x7d, 0x41, 0xf7, 0x2f, 0x0a, 0x19, 0xd2, 0x00, 0x18, 0xeb,
+0x5b, 0xda, 0x5d, 0xcf, 0x2f, 0xca, 0x1b, 0xca, 0x8f, 0xce, 0x31, 0xd7, 0xfe, 0xe3, 0x96, 0xf4,
+0xa2, 0x07, 0x82, 0x1a, 0x0d, 0x2a, 0xeb, 0x32, 0x8d, 0x33, 0x11, 0x2c, 0xe1, 0x1e, 0xfe, 0x0e,
+0x6c, 0xff, 0x54, 0xf2, 0xc2, 0xe8, 0xe5, 0xe2, 0x23, 0xe0, 0xf9, 0xdf, 0x19, 0xe2, 0x72, 0xe6,
+0xe4, 0xec, 0xea, 0xf5, 0xde, 0x00, 0x2e, 0x0c, 0xa6, 0x15, 0x6a, 0x1b, 0x43, 0x1c, 0xe6, 0x18,
+0x76, 0x12, 0xca, 0x0a, 0xb4, 0x03, 0x1a, 0xfe, 0x4e, 0xfa, 0xfc, 0xf7, 0xd4, 0xf6, 0xf8, 0xf5,
+0xf0, 0xf4, 0xc4, 0xf3, 0xd2, 0xf2, 0xf6, 0xf2, 0xee, 0xf4, 0xac, 0xf8, 0x78, 0xfd, 0x3a, 0x02,
+0x3c, 0x06, 0xd6, 0x08, 0x50, 0x0a, 0x06, 0x0b, 0x96, 0x0b, 0x60, 0x0c, 0x66, 0x0d, 0x02, 0x0e,
+0x42, 0x0d, 0x7c, 0x0a, 0xda, 0x04, 0x8c, 0xfc, 0xc8, 0xf2, 0x8a, 0xe9, 0x49, 0xe3, 0x65, 0xe1,
+0x14, 0xe4, 0xa2, 0xea, 0x74, 0xf3, 0x10, 0xfd, 0x52, 0x06, 0xc4, 0x0e, 0x64, 0x16, 0x25, 0x1d,
+0x2b, 0x22, 0xa3, 0x24, 0x3f, 0x23, 0xc1, 0x1c, 0x80, 0x10, 0x72, 0xff, 0x12, 0xec, 0x39, 0xda,
+0x83, 0xcd, 0xb5, 0xc8, 0x2b, 0xcc, 0x65, 0xd6, 0xfe, 0xe4, 0x5c, 0xf5, 0xe6, 0x05, 0x92, 0x15,
+0xa3, 0x23, 0x89, 0x2f, 0xdf, 0x37, 0xe1, 0x3a, 0x8f, 0x36, 0x01, 0x2a, 0xca, 0x15, 0xd6, 0xfb,
+0x55, 0xe0, 0x83, 0xc8, 0xd9, 0xb8, 0xb7, 0xb3, 0x73, 0xb9, 0x81, 0xc7, 0x59, 0xdb, 0xf2, 0xf1,
+0xf2, 0x08, 0x1d, 0x1f, 0x01, 0x33, 0xe5, 0x42, 0x5f, 0x4c, 0xef, 0x4c, 0x75, 0x43, 0xb9, 0x2f,
+0x9c, 0x13, 0x08, 0xf3, 0x97, 0xd2, 0xe1, 0xb7, 0x56, 0xa7, 0x34, 0xa3, 0x18, 0xab, 0x17, 0xbd,
+0xd7, 0xd5, 0x9a, 0xf2, 0x4c, 0x10, 0x85, 0x2c, 0xa9, 0x44, 0xe6, 0x55, 0x96, 0x5d, 0x54, 0x59,
+0x31, 0x49, 0xd1, 0x2e, 0x54, 0x0d, 0xe6, 0xe8, 0x61, 0xc6, 0x02, 0xab, 0xea, 0x9a, 0xbe, 0x97,
+0xa6, 0xa1, 0xd7, 0xb6, 0x81, 0xd4, 0x32, 0xf7, 0xae, 0x1a, 0x35, 0x3b, 0x1e, 0x55, 0x04, 0x65,
+0x4e, 0x68, 0x60, 0x5e, 0xa9, 0x48, 0xff, 0x29, 0xb8, 0x05, 0x15, 0xe0, 0x6b, 0xbd, 0x3e, 0xa2,
+0xa4, 0x92, 0xd4, 0x90, 0x4a, 0x9d, 0xb3, 0xb6, 0xb7, 0xd9, 0x70, 0x01, 0x85, 0x28, 0xfb, 0x49,
+0xb6, 0x61, 0xd6, 0x6c, 0x90, 0x6a, 0x8c, 0x5b, 0x5d, 0x42, 0x53, 0x22, 0x06, 0xfe, 0xe3, 0xd8,
+0xe1, 0xb6, 0x96, 0x9c, 0x5a, 0x8e, 0xde, 0x8e, 0xfc, 0x9e, 0xd5, 0xbc, 0x02, 0xe4, 0x28, 0x0e,
+0x25, 0x35, 0x99, 0x53, 0x92, 0x66, 0x60, 0x6c, 0x58, 0x65, 0x9d, 0x53, 0xbb, 0x39, 0x34, 0x1a,
+0x42, 0xf7, 0xa5, 0xd3, 0x5d, 0xb3, 0x0a, 0x9b, 0x5a, 0x8f, 0x50, 0x93, 0x18, 0xa7, 0x35, 0xc8,
+0x9a, 0xf0, 0xac, 0x19, 0xf3, 0x3c, 0x58, 0x56, 0xaa, 0x63, 0xd4, 0x64, 0x50, 0x5b, 0x29, 0x49,
+0x4d, 0x30, 0x90, 0x12, 0xcc, 0xf1, 0x5f, 0xd0, 0xe9, 0xb2, 0x16, 0x9e, 0x62, 0x96, 0x2a, 0x9e,
+0xa9, 0xb4, 0x0b, 0xd6, 0x12, 0xfc, 0x0d, 0x20, 0x05, 0x3d, 0x4f, 0x50, 0x18, 0x59, 0xb4, 0x57,
+0x91, 0x4d, 0x8f, 0x3c, 0xdf, 0x25, 0xc4, 0x0a, 0x0a, 0xed, 0xcb, 0xcf, 0x37, 0xb7, 0x48, 0xa7,
+0xd6, 0xa3, 0x11, 0xae, 0x71, 0xc4, 0x79, 0xe2, 0xd2, 0x02, 0xef, 0x1f, 0xb5, 0x36, 0xf1, 0x44,
+0x7f, 0x4a, 0xd7, 0x47, 0x19, 0x3e, 0x95, 0x2e, 0x74, 0x1a, 0x4a, 0x03, 0x0c, 0xeb, 0x73, 0xd4,
+0x93, 0xc2, 0xcd, 0xb8, 0xa7, 0xb8, 0x0d, 0xc3, 0xa7, 0xd5, 0x1e, 0xed, 0x48, 0x05, 0x96, 0x1a,
+0x83, 0x2a, 0x03, 0x34, 0xdf, 0x36, 0xa3, 0x33, 0x2b, 0x2b, 0xcd, 0x1e, 0xc0, 0x0f, 0xfa, 0xfe,
+0x84, 0xee, 0xd3, 0xdf, 0x95, 0xd4, 0x59, 0xce, 0x93, 0xce, 0x69, 0xd5, 0xd3, 0xe1, 0x92, 0xf1,
+0x0c, 0x02, 0xca, 0x10, 0x98, 0x1b, 0x33, 0x21, 0xf1, 0x21, 0xc3, 0x1e, 0xa0, 0x18, 0xca, 0x10,
+0x5c, 0x08, 0x58, 0x00, 0x1a, 0xf9, 0x56, 0xf2, 0x6e, 0xec, 0xe4, 0xe7, 0xa4, 0xe5, 0xb0, 0xe6,
+0x1e, 0xeb, 0x16, 0xf2, 0x68, 0xfa, 0x34, 0x02, 0xfa, 0x07, 0xfc, 0x0a, 0x50, 0x0b, 0xe6, 0x09,
+0xfe, 0x07, 0xd2, 0x06, 0x08, 0x07, 0x26, 0x08, 0x08, 0x09, 0x5c, 0x08, 0x00, 0x05, 0x5a, 0xff,
+0xe6, 0xf8, 0x28, 0xf3, 0x92, 0xef, 0x60, 0xee, 0x0c, 0xef, 0x8e, 0xf0, 0xf2, 0xf1, 0xe6, 0xf2,
+0x0a, 0xf4, 0xb4, 0xf6, 0xd6, 0xfb, 0x62, 0x03, 0xda, 0x0c, 0x7a, 0x16, 0x7b, 0x1d, 0xc1, 0x1f,
+0x3c, 0x1c, 0xd6, 0x13, 0x6e, 0x08, 0x56, 0xfc, 0x7a, 0xf1, 0xd4, 0xe8, 0x99, 0xe2, 0x67, 0xde,
+0xf5, 0xdb, 0x2b, 0xdc, 0xfd, 0xdf, 0x30, 0xe8, 0xfa, 0xf4, 0x4a, 0x05, 0xf8, 0x16, 0xc3, 0x26,
+0xa9, 0x31, 0x75, 0x35, 0x4f, 0x31, 0x11, 0x26, 0xcc, 0x15, 0x04, 0x03, 0x36, 0xf0, 0x45, 0xdf,
+0x87, 0xd1, 0x1d, 0xc8, 0x0f, 0xc4, 0x6b, 0xc6, 0x97, 0xcf, 0x79, 0xdf, 0x9c, 0xf4, 0x6a, 0x0c,
+0xef, 0x23, 0xe1, 0x37, 0xe5, 0x44, 0xe7, 0x48, 0x37, 0x43, 0x67, 0x34, 0x75, 0x1e, 0x2c, 0x04,
+0x38, 0xe9, 0xa1, 0xd0, 0x8f, 0xbd, 0x07, 0xb2, 0xa5, 0xaf, 0xb7, 0xb6, 0xcb, 0xc6, 0xb9, 0xdd,
+0x3e, 0xf9, 0x30, 0x16, 0x1b, 0x31, 0xf1, 0x46, 0xc4, 0x54, 0x7e, 0x58, 0x8d, 0x50, 0x77, 0x3d,
+0x55, 0x21, 0xf6, 0xff, 0xbf, 0xdd, 0xdf, 0xbf, 0x46, 0xaa, 0xfc, 0x9f, 0x8c, 0xa1, 0x3d, 0xae,
+0x11, 0xc4, 0x6d, 0xe0, 0x20, 0x00, 0xd1, 0x1f, 0xad, 0x3c, 0xdd, 0x53, 0x34, 0x62, 0x8c, 0x64,
+0x8a, 0x59, 0x2d, 0x41, 0x77, 0x1e, 0x38, 0xf6, 0xf7, 0xce, 0xdb, 0xae, 0x6a, 0x9a, 0xc4, 0x93,
+0x5c, 0x9a, 0x47, 0xac, 0x8d, 0xc6, 0x08, 0xe6, 0xb2, 0x07, 0xed, 0x28, 0xb3, 0x46, 0x04, 0x5e,
+0x46, 0x6b, 0x18, 0x6b, 0xa6, 0x5b, 0xe9, 0x3d, 0x14, 0x16, 0x52, 0xea, 0xe1, 0xc1, 0x4a, 0xa3,
+0x68, 0x92, 0xf8, 0x8f, 0x98, 0x9a, 0x59, 0xaf, 0xbf, 0xcb, 0xb4, 0xec, 0x84, 0x0f, 0x3b, 0x31,
+0x01, 0x4f, 0x3a, 0x65, 0xb2, 0x6f, 0x30, 0x6b, 0xd2, 0x56, 0x19, 0x35, 0xdc, 0x0a, 0x4d, 0xdf,
+0x47, 0xb9, 0x9e, 0x9e, 0xe0, 0x91, 0xf2, 0x92, 0xe6, 0x9f, 0x3b, 0xb6, 0x8b, 0xd3, 0xe2, 0xf4,
+0xa8, 0x17, 0xe1, 0x38, 0xce, 0x54, 0x88, 0x67, 0x4e, 0x6d, 0x1c, 0x64, 0x5d, 0x4c, 0x3d, 0x29,
+0x5a, 0x00, 0x25, 0xd8, 0xb7, 0xb6, 0x70, 0xa0, 0x36, 0x97, 0x76, 0x9a, 0xd6, 0xa8, 0xdd, 0xbf,
+0x49, 0xdd, 0x5c, 0xfe, 0xab, 0x1f, 0xf7, 0x3d, 0x6e, 0x55, 0xd0, 0x62, 0x84, 0x63, 0xf2, 0x56,
+0xb5, 0x3e, 0x05, 0x1e, 0xa0, 0xf9, 0xc3, 0xd6, 0x91, 0xba, 0x64, 0xa8, 0xe8, 0xa1, 0xc0, 0xa6,
+0x95, 0xb5, 0x81, 0xcc, 0xd6, 0xe8, 0x5e, 0x07, 0x81, 0x24, 0x25, 0x3d, 0x2d, 0x4e, 0xa0, 0x55,
+0xc7, 0x52, 0xef, 0x45, 0xc9, 0x30, 0x7e, 0x15, 0xa4, 0xf7, 0x31, 0xdb, 0x43, 0xc4, 0xd3, 0xb5,
+0x7d, 0xb1, 0x4f, 0xb7, 0x2f, 0xc6, 0xb3, 0xdb, 0xa2, 0xf4, 0xde, 0x0d, 0x09, 0x24, 0xd7, 0x34,
+0xf1, 0x3e, 0x03, 0x42, 0x4b, 0x3e, 0x41, 0x34, 0x6f, 0x24, 0xfa, 0x0f, 0x0a, 0xf9, 0x0f, 0xe3,
+0x63, 0xd1, 0xd7, 0xc6, 0xcf, 0xc4, 0x5f, 0xcb, 0xbb, 0xd8, 0x6c, 0xea, 0x34, 0xfd, 0x5a, 0x0e,
+0x00, 0x1c, 0x51, 0x25, 0x65, 0x2a, 0xb5, 0x2b, 0xcf, 0x29, 0x57, 0x24, 0xe6, 0x1a, 0xac, 0x0d,
+0x26, 0xfe, 0xd0, 0xee, 0x81, 0xe2, 0x91, 0xdb, 0x13, 0xdb, 0x8f, 0xe0, 0x14, 0xea, 0x2e, 0xf5,
+0x66, 0xff, 0x70, 0x07, 0xee, 0x0c, 0x4a, 0x10, 0x96, 0x12, 0xa8, 0x14, 0x4a, 0x16, 0x8c, 0x16,
+0x5e, 0x14, 0x22, 0x0f, 0x6c, 0x07, 0xe6, 0xfe, 0xdc, 0xf7, 0xa6, 0xf3, 0xfe, 0xf2, 0xe6, 0xf4,
+0xba, 0xf7, 0xf8, 0xf9, 0xe2, 0xfa, 0x54, 0xfa, 0x3a, 0xf9, 0xec, 0xf8, 0x80, 0xfa, 0x8e, 0xfe,
+0xa8, 0x04, 0x6c, 0x0b, 0x0e, 0x11, 0x44, 0x14, 0xb4, 0x14, 0xba, 0x12, 0x94, 0x0f, 0x3e, 0x0c,
+0xb2, 0x08, 0x8c, 0x04, 0x1a, 0xff, 0x88, 0xf8, 0x14, 0xf1, 0x00, 0xea, 0x94, 0xe4, 0x55, 0xe2,
+0x88, 0xe4, 0x84, 0xeb, 0xa4, 0xf6, 0x20, 0x04, 0x1a, 0x12, 0xe1, 0x1d, 0xd9, 0x25, 0x1f, 0x29,
+0xdd, 0x27, 0x97, 0x22, 0xbc, 0x19, 0x22, 0x0e, 0x7e, 0x00, 0x2a, 0xf2, 0x5c, 0xe4, 0x51, 0xd8,
+0xfb, 0xcf, 0xdf, 0xcc, 0x73, 0xd0, 0xff, 0xda, 0x2a, 0xec, 0xa6, 0x01, 0x58, 0x18, 0x71, 0x2c,
+0x75, 0x3a, 0x9f, 0x40, 0x73, 0x3e, 0x21, 0x35, 0xf7, 0x25, 0x3a, 0x13, 0x9a, 0xfe, 0xd6, 0xe9,
+0xc5, 0xd6, 0xf1, 0xc6, 0x73, 0xbc, 0x33, 0xb9, 0xfd, 0xbe, 0x81, 0xce, 0xc0, 0xe6, 0xc8, 0x04,
+0xa3, 0x23, 0x1d, 0x3e, 0x61, 0x4f, 0x68, 0x55, 0x2d, 0x50, 0xb3, 0x41, 0xa9, 0x2c, 0xe4, 0x13,
+0xba, 0xf9, 0xff, 0xdf, 0xeb, 0xc8, 0x87, 0xb6, 0x4d, 0xab, 0x90, 0xa9, 0x35, 0xb3, 0xf5, 0xc8,
+0xc0, 0xe8, 0x18, 0x0e, 0x71, 0x32, 0x95, 0x4f, 0xd6, 0x60, 0x66, 0x64, 0x2c, 0x5b, 0xf1, 0x47,
+0x43, 0x2e, 0xf8, 0x10, 0x8a, 0xf2, 0x1b, 0xd5, 0x49, 0xbb, 0xdc, 0xa7, 0x9a, 0x9d, 0x32, 0x9f,
+0x47, 0xae, 0x65, 0xca, 0x0a, 0xf0, 0x66, 0x19, 0x6d, 0x3f, 0x2a, 0x5c, 0xd2, 0x6b, 0x0c, 0x6d,
+0x12, 0x61, 0xdd, 0x4a, 0xd9, 0x2d, 0xee, 0x0c, 0xb4, 0xea, 0x23, 0xca, 0xa9, 0xae, 0xd2, 0x9b,
+0xa4, 0x94, 0x56, 0x9b, 0x7b, 0xb0, 0xeb, 0xd1, 0xf2, 0xfa, 0x1d, 0x25, 0x29, 0x4a, 0xca, 0x64,
+0xd8, 0x71, 0x3e, 0x70, 0x7a, 0x61, 0x67, 0x48, 0x5d, 0x28, 0x76, 0x04, 0xc3, 0xdf, 0x41, 0xbe,
+0x2c, 0xa4, 0x04, 0x95, 0x4e, 0x93, 0xbc, 0x9f, 0x67, 0xb9, 0xe9, 0xdc, 0x4e, 0x05, 0xe3, 0x2c,
+0x81, 0x4e, 0x0a, 0x66, 0x86, 0x70, 0xf0, 0x6c, 0x4a, 0x5c, 0x69, 0x41, 0x87, 0x1f, 0x14, 0xfa,
+0x2f, 0xd5, 0x99, 0xb5, 0xbe, 0x9f, 0x34, 0x96, 0x18, 0x9a, 0x94, 0xaa, 0x7b, 0xc5, 0x74, 0xe7,
+0x26, 0x0c, 0x8b, 0x2f, 0x5b, 0x4d, 0x14, 0x62, 0x8e, 0x6a, 0x62, 0x65, 0x45, 0x53, 0xe7, 0x36,
+0x26, 0x14, 0x4a, 0xef, 0x69, 0xcd, 0x07, 0xb3, 0x8a, 0xa3, 0xf0, 0x9f, 0xa2, 0xa7, 0xe1, 0xb8,
+0x97, 0xd1, 0x46, 0xef, 0x08, 0x0f, 0xe5, 0x2d, 0x31, 0x48, 0x14, 0x5a, 0x4c, 0x60, 0x2c, 0x59,
+0xcd, 0x45, 0x37, 0x29, 0x06, 0x08, 0x48, 0xe7, 0x97, 0xcb, 0x6b, 0xb8, 0x3b, 0xaf, 0xd7, 0xaf,
+0x99, 0xb8, 0x13, 0xc8, 0x97, 0xdc, 0x04, 0xf5, 0x88, 0x0f, 0x93, 0x29, 0x9d, 0x3f, 0xcd, 0x4d,
+0xfd, 0x50, 0x0d, 0x48, 0xa9, 0x34, 0x74, 0x1a, 0x3c, 0xfe, 0x9a, 0xe4, 0xe1, 0xd0, 0xeb, 0xc4,
+0xad, 0xc0, 0x17, 0xc3, 0xe1, 0xca, 0xd9, 0xd6, 0x52, 0xe6, 0xe0, 0xf8, 0x50, 0x0d, 0x6b, 0x21,
+0x1b, 0x32, 0xf5, 0x3b, 0xcf, 0x3c, 0x37, 0x34, 0x07, 0x24, 0xe8, 0x0f, 0xa4, 0xfb, 0x9a, 0xea,
+0x95, 0xde, 0x2b, 0xd8, 0x65, 0xd6, 0x6d, 0xd8, 0x4f, 0xdd, 0x82, 0xe4, 0x02, 0xee, 0xac, 0xf9,
+0xfe, 0x06, 0x46, 0x14, 0x2f, 0x1f, 0x5b, 0x25, 0xa3, 0x25, 0xe5, 0x1f, 0xdc, 0x15, 0x00, 0x0a,
+0xea, 0xfe, 0x3c, 0xf6, 0xd0, 0xf0, 0x12, 0xee, 0x66, 0xed, 0xce, 0xed, 0xf4, 0xee, 0xba, 0xf0,
+0x16, 0xf3, 0xbe, 0xf6, 0xba, 0xfb, 0xc8, 0x01, 0xa8, 0x07, 0x72, 0x0c, 0x2a, 0x0f, 0x6e, 0x0f,
+0xa8, 0x0d, 0xbe, 0x0a, 0x08, 0x08, 0x12, 0x06, 0xfc, 0x04, 0x60, 0x04, 0x9c, 0x03, 0xe0, 0x01,
+0xbc, 0xfe, 0xe6, 0xf9, 0xfa, 0xf3, 0x48, 0xee, 0xc2, 0xea, 0x6e, 0xea, 0xd4, 0xed, 0x1e, 0xf4,
+0x08, 0xfc, 0xf8, 0x03, 0xb6, 0x0a, 0x48, 0x10, 0x9c, 0x14, 0x06, 0x18, 0x2c, 0x1a, 0xc0, 0x1a,
+0xd8, 0x18, 0xaa, 0x13, 0x6e, 0x0a, 0x78, 0xfd, 0x46, 0xee, 0xc1, 0xdf, 0x45, 0xd5, 0x77, 0xd1,
+0x05, 0xd5, 0xe7, 0xde, 0xf6, 0xec, 0x4a, 0xfc, 0xf0, 0x0a, 0xc6, 0x17, 0x4f, 0x22, 0x61, 0x2a,
+0x71, 0x2f, 0xa3, 0x30, 0x89, 0x2c, 0x43, 0x22, 0x66, 0x11, 0x6a, 0xfb, 0x7d, 0xe3, 0xcb, 0xcd,
+0x3b, 0xbf, 0x6f, 0xba, 0x21, 0xc0, 0x7b, 0xce, 0x7d, 0xe2, 0xa8, 0xf8, 0x1a, 0x0e, 0x69, 0x21,
+0x75, 0x31, 0x7f, 0x3d, 0x33, 0x44, 0xdf, 0x43, 0x45, 0x3b, 0xb7, 0x29, 0x9e, 0x10, 0x96, 0xf2,
+0x4b, 0xd4, 0x0b, 0xbb, 0x3e, 0xab, 0xda, 0xa7, 0x7b, 0xb0, 0x67, 0xc3, 0xe1, 0xdc, 0x3c, 0xf9,
+0x0c, 0x15, 0x25, 0x2e, 0xdb, 0x42, 0xf9, 0x50, 0xba, 0x56, 0x2f, 0x52, 0xdb, 0x42, 0xc9, 0x29,
+0x7e, 0x09, 0x22, 0xe6, 0xdf, 0xc4, 0xba, 0xaa, 0xec, 0x9b, 0x7c, 0x9a, 0x3a, 0xa6, 0x01, 0xbd,
+0x83, 0xdb, 0x64, 0xfd, 0xcd, 0x1e, 0xa3, 0x3c, 0xbf, 0x53, 0x8c, 0x61, 0x92, 0x63, 0x30, 0x59,
+0x4d, 0x43, 0x7f, 0x24, 0x62, 0x00, 0x3d, 0xdb, 0xdd, 0xb9, 0xac, 0xa0, 0x54, 0x93, 0xa0, 0x93,
+0xae, 0xa1, 0xe3, 0xbb, 0x97, 0xde, 0x08, 0x05, 0x77, 0x2a, 0x4f, 0x4a, 0x1a, 0x61, 0x84, 0x6b,
+0x48, 0x68, 0x1c, 0x58, 0xa7, 0x3d, 0x2e, 0x1c, 0x56, 0xf7, 0xf9, 0xd2, 0xcd, 0xb2, 0x1c, 0x9b,
+0x30, 0x8f, 0x2e, 0x91, 0xde, 0xa1, 0x8d, 0xbf, 0x30, 0xe6, 0x14, 0x10, 0xff, 0x36, 0x16, 0x56,
+0x68, 0x69, 0xc8, 0x6e, 0x4c, 0x66, 0x2d, 0x52, 0xc3, 0x35, 0x2c, 0x14, 0x6c, 0xf0, 0x71, 0xcd,
+0x15, 0xaf, 0xf0, 0x98, 0xd0, 0x8e, 0x6c, 0x93, 0x4a, 0xa7, 0x71, 0xc8, 0xb8, 0xf1, 0x3e, 0x1c,
+0x59, 0x41, 0x42, 0x5c, 0x02, 0x6a, 0xec, 0x69, 0xa0, 0x5d, 0xe3, 0x47, 0xeb, 0x2b, 0x36, 0x0c,
+0xe6, 0xea, 0xc1, 0xca, 0xfd, 0xae, 0x9a, 0x9b, 0x82, 0x94, 0x3a, 0x9c, 0xe1, 0xb2, 0xb3, 0xd5,
+0x40, 0xfe, 0x91, 0x25, 0x7d, 0x45, 0x28, 0x5a, 0x24, 0x62, 0x28, 0x5e, 0x3b, 0x50, 0x35, 0x3b,
+0x5b, 0x21, 0x8c, 0x04, 0xcc, 0xe6, 0x6f, 0xca, 0xd7, 0xb2, 0xda, 0xa3, 0xdc, 0xa0, 0x87, 0xab,
+0x45, 0xc3, 0x02, 0xe4, 0xfa, 0x07, 0x9b, 0x28, 0x4f, 0x41, 0xc3, 0x4f, 0xcf, 0x53, 0x3d, 0x4e,
+0x43, 0x41, 0xb7, 0x2e, 0x58, 0x18, 0xac, 0xff, 0x80, 0xe6, 0x39, 0xcf, 0xe7, 0xbc, 0x83, 0xb2,
+0x8f, 0xb2, 0xd7, 0xbd, 0xd5, 0xd2, 0x16, 0xee, 0x74, 0x0a, 0x41, 0x23, 0x3f, 0x35, 0x21, 0x3f,
+0xc7, 0x40, 0x4f, 0x3b, 0x19, 0x30, 0xa7, 0x20, 0xb2, 0x0e, 0xa6, 0xfb, 0x24, 0xe9, 0x3b, 0xd9,
+0x53, 0xcd, 0x53, 0xc7, 0x8d, 0xc8, 0x1f, 0xd1, 0xfd, 0xdf, 0xf2, 0xf2, 0xa8, 0x06, 0xea, 0x17,
+0x79, 0x24, 0x61, 0x2b, 0x57, 0x2c, 0x17, 0x28, 0x9d, 0x1f, 0xa6, 0x14, 0x70, 0x08, 0x5c, 0xfc,
+0x64, 0xf1, 0x38, 0xe8, 0xd3, 0xe1, 0xed, 0xdd, 0x61, 0xdd, 0xcd, 0xe0, 0x3e, 0xe8, 0xd6, 0xf2,
+0xc2, 0xfe, 0xd0, 0x09, 0xe8, 0x11, 0x1e, 0x16, 0x64, 0x16, 0x3e, 0x13, 0x94, 0x0e, 0xa0, 0x09,
+0x82, 0x05, 0x80, 0x02, 0x3a, 0x00, 0xf8, 0xfd, 0xb4, 0xfa, 0x88, 0xf6, 0x1e, 0xf2, 0xe6, 0xee,
+0x06, 0xee, 0xf2, 0xef, 0x28, 0xf4, 0xbc, 0xf8, 0x84, 0xfc, 0xd2, 0xfe, 0xa4, 0xff, 0x2c, 0x00,
+0x80, 0x01, 0xd4, 0x04, 0xd4, 0x09, 0x9c, 0x0f, 0x3a, 0x14, 0xe6, 0x15, 0x2e, 0x13, 0xfe, 0x0b,
+0x02, 0x02, 0x62, 0xf7, 0x54, 0xee, 0x72, 0xe8, 0x72, 0xe5, 0xa4, 0xe4, 0x36, 0xe5, 0x06, 0xe7,
+0x92, 0xea, 0xa2, 0xf0, 0xf4, 0xf9, 0x02, 0x06, 0xa0, 0x13, 0x1b, 0x20, 0x43, 0x29, 0x8d, 0x2c,
+0xbd, 0x28, 0x3f, 0x1e, 0xca, 0x0e, 0x74, 0xfd, 0xc4, 0xec, 0xdd, 0xde, 0xcf, 0xd4, 0xe5, 0xce,
+0x57, 0xcd, 0x97, 0xd0, 0xf9, 0xd8, 0xb6, 0xe6, 0x9a, 0xf8, 0x36, 0x0d, 0x57, 0x21, 0x73, 0x32,
+0x91, 0x3d, 0x99, 0x40, 0x9d, 0x3a, 0x11, 0x2c, 0x6a, 0x17, 0x54, 0xff, 0x3a, 0xe7, 0xe9, 0xd1,
+0xf7, 0xc1, 0xed, 0xb8, 0xd7, 0xb7, 0x09, 0xbf, 0x2d, 0xce, 0xd2, 0xe3, 0xa4, 0xfd, 0x34, 0x18,
+0xb9, 0x30, 0xef, 0x43, 0x75, 0x4f, 0x59, 0x51, 0x8b, 0x48, 0xdf, 0x35, 0x5e, 0x1b, 0x52, 0xfc,
+0xb1, 0xdc, 0x37, 0xc1, 0x91, 0xad, 0x86, 0xa4, 0xe8, 0xa6, 0x03, 0xb4, 0x37, 0xca, 0x94, 0xe6,
+0x78, 0x05, 0xa3, 0x23, 0xd7, 0x3d, 0xcd, 0x51, 0x20, 0x5d, 0xac, 0x5d, 0x1f, 0x52, 0x21, 0x3b,
+0xbe, 0x1a, 0x02, 0xf5, 0x7b, 0xcf, 0x2b, 0xb0, 0x2e, 0x9c, 0xfc, 0x95, 0x2c, 0x9d, 0x21, 0xb0,
+0xab, 0xcb, 0x16, 0xec, 0xa4, 0x0d, 0x25, 0x2d, 0x2f, 0x48, 0x5e, 0x5c, 0x20, 0x67, 0xa0, 0x65,
+0x90, 0x56, 0x65, 0x3a, 0x16, 0x14, 0x24, 0xe9, 0x89, 0xc0, 0x64, 0xa1, 0x7e, 0x90, 0xfe, 0x8e,
+0x7a, 0x9b, 0xaf, 0xb2, 0x33, 0xd1, 0x08, 0xf3, 0x22, 0x15, 0xb3, 0x34, 0x7b, 0x4f, 0x06, 0x63,
+0xca, 0x6b, 0x36, 0x67, 0xb3, 0x53, 0xd3, 0x32, 0xc4, 0x08, 0x27, 0xdc, 0xad, 0xb4, 0x02, 0x99,
+0xda, 0x8c, 0xf2, 0x8f, 0xfe, 0x9f, 0x83, 0xb9, 0x09, 0xd9, 0x3a, 0xfb, 0x09, 0x1d, 0xf7, 0x3b,
+0x86, 0x55, 0x78, 0x66, 0x7a, 0x6b, 0x34, 0x62, 0x63, 0x4a, 0xd3, 0x26, 0x90, 0xfc, 0x5f, 0xd2,
+0x55, 0xaf, 0xca, 0x98, 0xde, 0x90, 0xd8, 0x96, 0x52, 0xa8, 0x2d, 0xc2, 0x6b, 0xe1, 0xc4, 0x02,
+0x4f, 0x23, 0x5f, 0x40, 0xd0, 0x56, 0x78, 0x63, 0xd8, 0x63, 0xb4, 0x56, 0x57, 0x3d, 0xe6, 0x1a,
+0x4e, 0xf4, 0x7f, 0xcf, 0xf7, 0xb1, 0xe0, 0x9f, 0xca, 0x9a, 0x1a, 0xa2, 0x93, 0xb3, 0xe5, 0xcc,
+0xd0, 0xea, 0x3e, 0x0a, 0xf7, 0x27, 0xd9, 0x40, 0x09, 0x52, 0x4e, 0x59, 0x64, 0x55, 0xcf, 0x46,
+0x21, 0x2f, 0x34, 0x11, 0x10, 0xf1, 0xbb, 0xd2, 0xcd, 0xba, 0x8b, 0xac, 0x7c, 0xa9, 0x1f, 0xb1,
+0x2f, 0xc2, 0xed, 0xd9, 0x5a, 0xf5, 0xec, 0x10, 0x1d, 0x29, 0x6f, 0x3b, 0x1f, 0x46, 0x43, 0x48,
+0x8f, 0x42, 0x93, 0x35, 0xb7, 0x22, 0x8e, 0x0b, 0x98, 0xf2, 0xcf, 0xda, 0x05, 0xc8, 0xfd, 0xbc,
+0x55, 0xbb, 0x4d, 0xc3, 0xc1, 0xd2, 0x90, 0xe7, 0xfa, 0xfd, 0xd2, 0x12, 0x55, 0x23, 0x4f, 0x2e,
+0x3f, 0x33, 0xdf, 0x32, 0x35, 0x2e, 0x7d, 0x25, 0x52, 0x19, 0xe2, 0x09, 0x6e, 0xf8, 0x60, 0xe7,
+0x6b, 0xd9, 0x85, 0xd1, 0xed, 0xd0, 0x9d, 0xd7, 0x93, 0xe3, 0x76, 0xf2, 0x1c, 0x01, 0x4a, 0x0d,
+0xe4, 0x15, 0xb2, 0x1a, 0x97, 0x1c, 0x93, 0x1c, 0x48, 0x1b, 0x82, 0x18, 0xc0, 0x13, 0x26, 0x0c,
+0x30, 0x02, 0x88, 0xf7, 0x76, 0xee, 0x16, 0xe9, 0x62, 0xe8, 0xbe, 0xeb, 0x9e, 0xf1, 0x22, 0xf8,
+0x6a, 0xfd, 0xd8, 0x00, 0x96, 0x02, 0x84, 0x03, 0xd6, 0x04, 0x3a, 0x07, 0xce, 0x0a, 0xb4, 0x0e,
+0x8c, 0x11, 0xba, 0x11, 0x50, 0x0f, 0xb2, 0x0a, 0xb8, 0x05, 0x5e, 0x01, 0x4a, 0xfe, 0x04, 0xfc,
+0xf6, 0xf9, 0x4a, 0xf7, 0x94, 0xf3, 0xb4, 0xef, 0x7e, 0xec, 0x9c, 0xeb, 0xc2, 0xed, 0x8a, 0xf3,
+0x8a, 0xfc, 0x60, 0x07, 0x26, 0x12, 0xba, 0x1a, 0xc7, 0x1f, 0xe9, 0x20, 0x71, 0x1e, 0xe6, 0x18,
+0x0c, 0x11, 0x74, 0x07, 0x9a, 0xfc, 0x40, 0xf1, 0x5e, 0xe6, 0x4f, 0xdd, 0x93, 0xd7, 0x21, 0xd6,
+0xfd, 0xd9, 0x75, 0xe3, 0xee, 0xf1, 0xf4, 0x03, 0xf6, 0x16, 0xc1, 0x27, 0xad, 0x33, 0xbb, 0x38,
+0x23, 0x36, 0xf3, 0x2c, 0x67, 0x1e, 0xa0, 0x0c, 0xc0, 0xf9, 0x42, 0xe7, 0xfd, 0xd6, 0x85, 0xca,
+0x2b, 0xc3, 0x43, 0xc2, 0xb9, 0xc8, 0xd3, 0xd6, 0x0c, 0xec, 0x44, 0x06, 0x6b, 0x21, 0x3d, 0x39,
+0x73, 0x49, 0xed, 0x4e, 0xdb, 0x49, 0x0f, 0x3b, 0xd9, 0x25, 0x5a, 0x0d, 0x24, 0xf4, 0xa7, 0xdc,
+0xc1, 0xc8, 0xed, 0xb9, 0xc1, 0xb1, 0xf1, 0xb1, 0x8d, 0xbb, 0x47, 0xcf, 0xea, 0xeb, 0xcc, 0x0d,
+0xc1, 0x2f, 0xdb, 0x4b, 0xd0, 0x5c, 0x94, 0x60, 0xf6, 0x56, 0xc1, 0x42, 0xf5, 0x27, 0x1e, 0x0a,
+0x70, 0xec, 0x49, 0xd1, 0xc3, 0xba, 0xd8, 0xaa, 0x6c, 0xa3, 0x4c, 0xa6, 0xe7, 0xb4, 0x51, 0xcf,
+0xf6, 0xf2, 0x96, 0x1a, 0xd9, 0x3f, 0x56, 0x5c, 0x7a, 0x6b, 0xa4, 0x6b, 0xae, 0x5d, 0x6b, 0x45,
+0xb1, 0x26, 0x6c, 0x05, 0x78, 0xe4, 0xa1, 0xc6, 0xa7, 0xae, 0x98, 0x9e, 0x40, 0x99, 0x30, 0xa0,
+0x77, 0xb4, 0xe9, 0xd4, 0x0a, 0xfd, 0x15, 0x27, 0x4d, 0x4c, 0x0a, 0x67, 0x7c, 0x73, 0x70, 0x70,
+0x82, 0x5f, 0x31, 0x44, 0xc3, 0x22, 0x8a, 0xfe, 0x07, 0xdb, 0x91, 0xbb, 0x82, 0xa3, 0x00, 0x96,
+0x16, 0x95, 0xd0, 0xa1, 0xdd, 0xbb, 0x11, 0xe0, 0x60, 0x09, 0x0b, 0x32, 0x27, 0x54, 0x5c, 0x6b,
+0x70, 0x74, 0xc0, 0x6e, 0xb8, 0x5b, 0xb5, 0x3e, 0x5e, 0x1b, 0x92, 0xf5, 0x51, 0xd1, 0x91, 0xb2,
+0x6c, 0x9d, 0x9a, 0x94, 0x56, 0x99, 0x36, 0xab, 0x25, 0xc8, 0x56, 0xec, 0x0a, 0x13, 0x49, 0x37,
+0x00, 0x55, 0x7a, 0x68, 0x1e, 0x6f, 0xec, 0x67, 0xd7, 0x53, 0xf7, 0x35, 0x0e, 0x12, 0x4c, 0xec,
+0xb7, 0xc9, 0x87, 0xae, 0x84, 0x9e, 0x7a, 0x9b, 0xe8, 0xa4, 0x17, 0xb9, 0x39, 0xd5, 0xda, 0xf5,
+0x3a, 0x17, 0x65, 0x36, 0xa5, 0x4f, 0x02, 0x60, 0xe0, 0x64, 0x7a, 0x5c, 0x11, 0x48, 0x2d, 0x2a,
+0x34, 0x07, 0x52, 0xe4, 0x77, 0xc6, 0x7d, 0xb1, 0xe8, 0xa7, 0xa4, 0xa9, 0x31, 0xb5, 0x7b, 0xc8,
+0xb5, 0xe0, 0xc6, 0xfb, 0x8a, 0x17, 0x49, 0x31, 0x8b, 0x46, 0xeb, 0x53, 0xae, 0x56, 0x5b, 0x4d,
+0x1b, 0x39, 0xbd, 0x1c, 0x90, 0xfd, 0x73, 0xe0, 0x7b, 0xc9, 0xc9, 0xbb, 0x93, 0xb7, 0x2b, 0xbc,
+0x4d, 0xc7, 0x19, 0xd7, 0x14, 0xea, 0xea, 0xfe, 0x5a, 0x14, 0x91, 0x28, 0x45, 0x39, 0x31, 0x43,
+0x13, 0x44, 0xd9, 0x3a, 0xb3, 0x28, 0x3c, 0x11, 0xb6, 0xf8, 0xa9, 0xe3, 0xad, 0xd4, 0x15, 0xcd,
+0x23, 0xcc, 0xc7, 0xd0, 0x09, 0xd9, 0xea, 0xe3, 0x90, 0xf0, 0x9e, 0xfe, 0x60, 0x0d, 0x86, 0x1b,
+0x47, 0x27, 0x09, 0x2e, 0x0b, 0x2e, 0xf7, 0x26, 0x02, 0x1a, 0x1e, 0x0a, 0x9e, 0xfa, 0x1c, 0xee,
+0x12, 0xe6, 0xb1, 0xe2, 0x23, 0xe3, 0x0a, 0xe6, 0x74, 0xea, 0x7c, 0xef, 0x3e, 0xf5, 0x9e, 0xfb,
+0xa6, 0x02, 0x1a, 0x0a, 0xf8, 0x10, 0xc8, 0x15, 0x7e, 0x17, 0x6e, 0x15, 0x76, 0x10, 0xfa, 0x09,
+0x8a, 0x03, 0x8e, 0xfe, 0x84, 0xfb, 0x3e, 0xfa, 0xe0, 0xf9, 0xc4, 0xf9, 0x02, 0xf9, 0xb0, 0xf7,
+0xa2, 0xf5, 0x9a, 0xf3, 0xc0, 0xf2, 0xfe, 0xf3, 0x8e, 0xf7, 0x04, 0xfd, 0x2c, 0x03, 0xca, 0x08,
+0x1a, 0x0d, 0xbc, 0x0f, 0x2a, 0x11, 0xb2, 0x11, 0xb6, 0x11, 0x0c, 0x11, 0x24, 0x0f, 0x30, 0x0b,
+0xa6, 0x04, 0xa0, 0xfb, 0xde, 0xf0, 0x44, 0xe6, 0x43, 0xde, 0x49, 0xdb, 0xa1, 0xde, 0x84, 0xe7,
+0x2c, 0xf4, 0xcc, 0x01, 0x68, 0x0e, 0x9c, 0x18, 0xf3, 0x1f, 0xa7, 0x24, 0xe9, 0x26, 0x43, 0x26,
+0x21, 0x22, 0x98, 0x19, 0x32, 0x0c, 0xbc, 0xfa, 0x12, 0xe7, 0xaf, 0xd4, 0xa5, 0xc7, 0x17, 0xc3,
+0x51, 0xc8, 0x3b, 0xd6, 0xa8, 0xe9, 0xce, 0xfe, 0xc6, 0x12, 0x33, 0x23, 0xa7, 0x2f, 0xe5, 0x37,
+0x6d, 0x3b, 0xeb, 0x39, 0xef, 0x31, 0x0d, 0x23, 0x7a, 0x0d, 0x5e, 0xf3, 0x31, 0xd8, 0x03, 0xc1,
+0x3d, 0xb2, 0x0b, 0xaf, 0x19, 0xb8, 0x0d, 0xcb, 0x56, 0xe4, 0xa0, 0xff, 0x4a, 0x19, 0x2d, 0x2f,
+0xf3, 0x3f, 0x9f, 0x4a, 0x5f, 0x4e, 0xb5, 0x49, 0xe5, 0x3b, 0x2b, 0x25, 0x76, 0x07, 0x56, 0xe6,
+0xd1, 0xc6, 0xf7, 0xad, 0x5a, 0xa0, 0x00, 0xa0, 0xa9, 0xac, 0x33, 0xc4, 0x79, 0xe2, 0x36, 0x03,
+0x39, 0x22, 0xcf, 0x3c, 0xbb, 0x50, 0x50, 0x5c, 0x66, 0x5d, 0x4f, 0x53, 0x89, 0x3e, 0x9f, 0x20,
+0x3a, 0xfd, 0x99, 0xd8, 0x21, 0xb8, 0x80, 0xa0, 0x08, 0x95, 0x48, 0x97, 0x10, 0xa7, 0x3d, 0xc2,
+0xb8, 0xe4, 0x04, 0x0a, 0x61, 0x2d, 0x25, 0x4b, 0xfc, 0x5f, 0x58, 0x69, 0xbc, 0x65, 0x4e, 0x55,
+0x33, 0x3a, 0xb0, 0x17, 0x34, 0xf2, 0xbb, 0xcd, 0xef, 0xae, 0x80, 0x99, 0x42, 0x90, 0xa0, 0x94,
+0xae, 0xa6, 0xbd, 0xc4, 0xce, 0xea, 0x9a, 0x13, 0x4b, 0x39, 0x4a, 0x57, 0xdc, 0x69, 0x8a, 0x6e,
+0x28, 0x65, 0x63, 0x4f, 0x09, 0x31, 0xdc, 0x0d, 0x94, 0xe9, 0x6b, 0xc7, 0x1c, 0xab, 0xd6, 0x97,
+0x5a, 0x90, 0x92, 0x96, 0xd8, 0xaa, 0x99, 0xcb, 0x02, 0xf4, 0x45, 0x1e, 0xd3, 0x43, 0x80, 0x5f,
+0x88, 0x6d, 0xd4, 0x6c, 0x98, 0x5e, 0xff, 0x45, 0xfd, 0x26, 0x1e, 0x05, 0x51, 0xe3, 0x2d, 0xc4,
+0xb0, 0xaa, 0xd6, 0x99, 0x94, 0x94, 0xe6, 0x9c, 0x3f, 0xb3, 0x73, 0xd5, 0x82, 0xfe, 0x79, 0x27,
+0xc9, 0x49, 0x4e, 0x60, 0xd4, 0x68, 0xac, 0x63, 0x01, 0x53, 0x67, 0x3a, 0x69, 0x1d, 0xd2, 0xfe,
+0x89, 0xe0, 0x27, 0xc5, 0xef, 0xae, 0x54, 0xa1, 0xf0, 0x9e, 0x90, 0xa9, 0x5b, 0xc1, 0x1f, 0xe3,
+0x3a, 0x09, 0xf5, 0x2c, 0xb5, 0x48, 0x8c, 0x58, 0x18, 0x5c, 0xf9, 0x53, 0x47, 0x43, 0x0d, 0x2d,
+0x70, 0x13, 0x2e, 0xf9, 0xb1, 0xdf, 0x49, 0xc9, 0xf3, 0xb7, 0x5b, 0xae, 0xe7, 0xae, 0xf7, 0xba,
+0x49, 0xd1, 0x9c, 0xee, 0x0e, 0x0e, 0xfb, 0x29, 0x5f, 0x3e, 0xef, 0x48, 0xa9, 0x49, 0x03, 0x42,
+0xe5, 0x33, 0x57, 0x21, 0xba, 0x0c, 0xa0, 0xf7, 0xd8, 0xe3, 0xd7, 0xd2, 0x83, 0xc6, 0xdf, 0xc0,
+0x5d, 0xc3, 0x19, 0xce, 0xf9, 0xdf, 0x24, 0xf6, 0xbe, 0x0c, 0x59, 0x20, 0x29, 0x2e, 0xdf, 0x34,
+0x79, 0x34, 0xfd, 0x2d, 0x3d, 0x23, 0xb4, 0x15, 0xfa, 0x06, 0xa0, 0xf8, 0xe6, 0xeb, 0x7b, 0xe1,
+0x3f, 0xda, 0xf1, 0xd6, 0x51, 0xd8, 0x9b, 0xde, 0xea, 0xe8, 0x56, 0xf6, 0xdc, 0x04, 0x3c, 0x12,
+0xde, 0x1b, 0x5d, 0x20, 0xef, 0x1f, 0xc0, 0x1b, 0xc6, 0x14, 0x9c, 0x0c, 0xa8, 0x04, 0xc4, 0xfd,
+0x78, 0xf8, 0x7a, 0xf4, 0x5e, 0xf1, 0xe2, 0xee, 0x20, 0xed, 0xae, 0xec, 0x82, 0xee, 0xd6, 0xf2,
+0x0a, 0xf9, 0xd6, 0xff, 0x78, 0x05, 0xd4, 0x08, 0xb4, 0x09, 0xb8, 0x08, 0x36, 0x07, 0x5a, 0x06,
+0xd0, 0x06, 0x90, 0x08, 0xae, 0x0a, 0x9e, 0x0b, 0xce, 0x09, 0xaa, 0x04, 0x02, 0xfd, 0xa2, 0xf4,
+0x8c, 0xed, 0x8a, 0xe9, 0xea, 0xe8, 0xdc, 0xea, 0xf8, 0xed, 0x44, 0xf1, 0xd4, 0xf4, 0x36, 0xf9,
+0x46, 0xff, 0x44, 0x07, 0xc6, 0x10, 0x34, 0x1a, 0x43, 0x21, 0xb7, 0x23, 0x3d, 0x20, 0xd4, 0x16,
+0xe4, 0x08, 0x2e, 0xf9, 0xb2, 0xea, 0x9d, 0xdf, 0xd5, 0xd8, 0x1b, 0xd6, 0x0d, 0xd7, 0x31, 0xdb,
+0x95, 0xe2, 0xa0, 0xed, 0x3a, 0xfc, 0x6c, 0x0d, 0xdd, 0x1e, 0xe5, 0x2d, 0x9f, 0x37, 0xe1, 0x39,
+0x81, 0x33, 0x29, 0x25, 0x0e, 0x11, 0x44, 0xfa, 0x64, 0xe4, 0x15, 0xd2, 0x99, 0xc5, 0x87, 0xbf,
+0x5b, 0xc0, 0xf5, 0xc7, 0x11, 0xd6, 0xb4, 0xe9, 0x0c, 0x01, 0x54, 0x19, 0x97, 0x2f, 0xd9, 0x40,
+0x3d, 0x4a, 0x91, 0x4a, 0x0b, 0x41, 0xa1, 0x2e, 0x4c, 0x15, 0x4e, 0xf8, 0x7d, 0xdb, 0x0d, 0xc3,
+0xe7, 0xb1, 0x4c, 0xaa, 0x31, 0xad, 0x27, 0xba, 0xe1, 0xcf, 0x72, 0xeb, 0x98, 0x09, 0xb7, 0x26,
+0x71, 0x3f, 0x01, 0x51, 0x96, 0x59, 0xa6, 0x57, 0xfb, 0x4a, 0x4d, 0x34, 0x64, 0x15, 0x40, 0xf2,
+0x6f, 0xcf, 0x43, 0xb2, 0x88, 0x9f, 0xe6, 0x99, 0x96, 0xa1, 0x5b, 0xb5, 0xbd, 0xd1, 0xc4, 0xf2,
+0x2a, 0x14, 0x33, 0x32, 0xab, 0x4a, 0x84, 0x5b, 0xcc, 0x62, 0x12, 0x5f, 0xa9, 0x4f, 0xd9, 0x34,
+0x2c, 0x11, 0x64, 0xe8, 0x41, 0xc1, 0xae, 0xa2, 0x6a, 0x91, 0xea, 0x8f, 0x44, 0x9d, 0x85, 0xb6,
+0x31, 0xd7, 0xb0, 0xfa, 0x8d, 0x1c, 0x97, 0x3a, 0x77, 0x52, 0x4c, 0x62, 0x24, 0x68, 0xfc, 0x61,
+0x33, 0x4f, 0x3d, 0x30, 0x14, 0x08, 0x3f, 0xdc, 0x3b, 0xb4, 0x38, 0x97, 0x0e, 0x8a, 0x92, 0x8d,
+0xa2, 0x9f, 0x45, 0xbc, 0xa9, 0xde, 0x62, 0x02, 0x01, 0x24, 0x05, 0x41, 0xc2, 0x57, 0xf8, 0x65,
+0x1c, 0x69, 0x76, 0x5f, 0x67, 0x48, 0xdd, 0x25, 0x92, 0xfb, 0x33, 0xd0, 0x5b, 0xab, 0x68, 0x93,
+0x7c, 0x8b, 0x20, 0x93, 0x88, 0xa7, 0xaf, 0xc4, 0xb4, 0xe6, 0x3e, 0x09, 0x95, 0x29, 0x23, 0x45,
+0x72, 0x59, 0x56, 0x64, 0x5a, 0x63, 0x9e, 0x55, 0xa3, 0x3b, 0x52, 0x18, 0x3a, 0xf0, 0xab, 0xc9,
+0xc8, 0xaa, 0x5a, 0x98, 0x6c, 0x94, 0xe0, 0x9d, 0x67, 0xb2, 0x7d, 0xce, 0x8e, 0xee, 0x3e, 0x0f,
+0xfd, 0x2c, 0x61, 0x45, 0xe2, 0x55, 0x66, 0x5c, 0x4c, 0x57, 0xef, 0x46, 0xeb, 0x2c, 0x60, 0x0c,
+0xca, 0xe9, 0xbb, 0xc9, 0x6d, 0xb1, 0xec, 0xa3, 0xb0, 0xa2, 0xbf, 0xac, 0x47, 0xc0, 0x4f, 0xda,
+0x62, 0xf7, 0x4c, 0x14, 0xa1, 0x2d, 0xeb, 0x40, 0xb7, 0x4b, 0x3f, 0x4d, 0x6f, 0x45, 0xa7, 0x35,
+0xa1, 0x1f, 0xdc, 0x05, 0x04, 0xeb, 0x8b, 0xd2, 0xb5, 0xbf, 0x29, 0xb5, 0x81, 0xb4, 0xc1, 0xbd,
+0xf9, 0xce, 0xa8, 0xe5, 0x94, 0xfe, 0x28, 0x16, 0x61, 0x29, 0x17, 0x36, 0x47, 0x3b, 0x77, 0x39,
+0xb9, 0x31, 0x5f, 0x25, 0xb2, 0x15, 0xbc, 0x03, 0xd0, 0xf0, 0xdd, 0xde, 0x81, 0xd0, 0x6f, 0xc8,
+0x3b, 0xc8, 0xd9, 0xcf, 0x1d, 0xde, 0x16, 0xf0, 0xae, 0x02, 0xec, 0x12, 0xaf, 0x1e, 0xf9, 0x24,
+0x77, 0x26, 0xeb, 0x23, 0x03, 0x1f, 0x6c, 0x18, 0x58, 0x10, 0x5c, 0x06, 0xe0, 0xfa, 0xea, 0xee,
+0xb8, 0xe4, 0x7f, 0xde, 0xdd, 0xdd, 0x07, 0xe3, 0x24, 0xec, 0x12, 0xf7, 0xea, 0x00, 0x60, 0x08,
+0x86, 0x0c, 0x0a, 0x0e, 0xf4, 0x0d, 0xd8, 0x0d, 0x2e, 0x0e, 0xc4, 0x0e, 0xc4, 0x0e, 0xd4, 0x0c,
+0xa0, 0x08, 0x6e, 0x02, 0xf4, 0xfb, 0xf2, 0xf6, 0xae, 0xf4, 0xee, 0xf4, 0x84, 0xf6, 0x22, 0xf8,
+0xc2, 0xf8, 0x00, 0xf8, 0x74, 0xf6, 0x84, 0xf5, 0x66, 0xf6, 0xe8, 0xf9, 0x40, 0x00, 0x28, 0x08,
+0x1a, 0x10, 0x20, 0x16, 0xce, 0x18, 0x00, 0x18, 0x66, 0x14, 0x22, 0x0f, 0xbc, 0x08, 0xaa, 0x01,
+0x00, 0xfa, 0x06, 0xf2, 0x3c, 0xea, 0xa3, 0xe3, 0x63, 0xdf, 0x73, 0xde, 0x1d, 0xe2, 0x6a, 0xea,
+0xca, 0xf6, 0x1c, 0x06, 0xdc, 0x15, 0x6f, 0x23, 0x99, 0x2c, 0xf3, 0x2f, 0xd1, 0x2c, 0x35, 0x24,
+0x1e, 0x17, 0x5e, 0x07, 0xb6, 0xf6, 0xe8, 0xe6, 0x47, 0xd9, 0x53, 0xcf, 0xfd, 0xc9, 0x73, 0xca,
+0x2b, 0xd1, 0x83, 0xde, 0x6e, 0xf1, 0x00, 0x08, 0x77, 0x1f, 0x33, 0x34, 0x7b, 0x42, 0x6f, 0x47,
+0x79, 0x42, 0x3b, 0x34, 0xb7, 0x1f, 0xc2, 0x07, 0x9e, 0xef, 0xb9, 0xd9, 0x77, 0xc8, 0x8f, 0xbc,
+0x57, 0xb7, 0x89, 0xb9, 0xed, 0xc3, 0x6b, 0xd6, 0x1c, 0xf0, 0x44, 0x0e, 0xf3, 0x2c, 0x1f, 0x47,
+0x92, 0x57, 0x58, 0x5b, 0xbb, 0x51, 0x6d, 0x3d, 0xf3, 0x21, 0xe8, 0x03, 0xb2, 0xe6, 0x71, 0xcd,
+0xbb, 0xb9, 0x31, 0xad, 0xcc, 0xa8, 0x6d, 0xad, 0x29, 0xbc, 0xbd, 0xd4, 0x56, 0xf5, 0x34, 0x1a,
+0xa9, 0x3d, 0x92, 0x59, 0xe6, 0x68, 0xe4, 0x68, 0xfe, 0x59, 0xf1, 0x3f, 0x99, 0x1f, 0x66, 0xfd,
+0x3f, 0xdd, 0xc7, 0xc1, 0x37, 0xad, 0x0c, 0xa1, 0x80, 0x9e, 0xca, 0xa6, 0xbb, 0xba, 0x69, 0xd9,
+0x80, 0xff, 0xcd, 0x27, 0x1d, 0x4c, 0x92, 0x66, 0xc8, 0x72, 0xc0, 0x6e, 0x40, 0x5c, 0xfd, 0x3e,
+0x04, 0x1c, 0x86, 0xf7, 0x63, 0xd5, 0x7b, 0xb8, 0xb2, 0xa3, 0xb2, 0x98, 0x06, 0x99, 0x16, 0xa6,
+0x87, 0xbf, 0x2f, 0xe3, 0x46, 0x0c, 0x0b, 0x35, 0x62, 0x57, 0x84, 0x6e, 0x82, 0x76, 0xde, 0x6e,
+0x60, 0x59, 0x2b, 0x3a, 0x82, 0x15, 0xbe, 0xef, 0x9b, 0xcc, 0xe3, 0xaf, 0x82, 0x9c, 0xf8, 0x94,
+0x88, 0x9a, 0xf1, 0xac, 0xcf, 0xca, 0x40, 0xf0, 0x38, 0x18, 0x55, 0x3d, 0xfa, 0x5a, 0x36, 0x6d,
+0xe6, 0x71, 0x4e, 0x68, 0x0b, 0x52, 0x87, 0x32, 0xdc, 0x0d, 0x18, 0xe8, 0xd1, 0xc5, 0x43, 0xab,
+0xee, 0x9b, 0x92, 0x99, 0x16, 0xa4, 0x29, 0xba, 0xbf, 0xd8, 0xde, 0xfb, 0xfb, 0x1e, 0x69, 0x3e,
+0xba, 0x56, 0x80, 0x65, 0x3c, 0x68, 0x12, 0x5e, 0x41, 0x48, 0x53, 0x29, 0x62, 0x05, 0x55, 0xe1,
+0x17, 0xc2, 0x11, 0xac, 0x36, 0xa2, 0xd4, 0xa4, 0xa7, 0xb2, 0x4d, 0xc9, 0x2a, 0xe5, 0xfc, 0x02,
+0xe5, 0x1f, 0x7f, 0x39, 0x91, 0x4d, 0x82, 0x59, 0x36, 0x5b, 0x27, 0x51, 0x07, 0x3c, 0x71, 0x1e,
+0x22, 0xfd, 0x17, 0xdd, 0x89, 0xc3, 0xc9, 0xb3, 0x51, 0xaf, 0x61, 0xb5, 0xed, 0xc3, 0xbb, 0xd7,
+0x82, 0xee, 0x02, 0x06, 0x97, 0x1c, 0x9b, 0x30, 0x9d, 0x40, 0xf1, 0x49, 0x6d, 0x4a, 0xb5, 0x40,
+0x25, 0x2d, 0x3c, 0x13, 0x50, 0xf7, 0x4f, 0xde, 0x23, 0xcc, 0xff, 0xc2, 0xa7, 0xc2, 0xd1, 0xc9,
+0xcd, 0xd5, 0xa0, 0xe4, 0xb4, 0xf4, 0xf6, 0x04, 0xe4, 0x14, 0xad, 0x23, 0x73, 0x2f, 0x59, 0x36,
+0x0b, 0x36, 0x99, 0x2d, 0x57, 0x1e, 0xd0, 0x0a, 0x02, 0xf7, 0xbe, 0xe6, 0x35, 0xdc, 0xfd, 0xd7,
+0x65, 0xd9, 0xa1, 0xde, 0x1e, 0xe6, 0xa0, 0xee, 0x5a, 0xf7, 0x66, 0x00, 0xba, 0x09, 0xb8, 0x12,
+0x54, 0x1a, 0x09, 0x1f, 0x9d, 0x1f, 0x94, 0x1b, 0x70, 0x13, 0x1a, 0x09, 0xf2, 0xfe, 0xfa, 0xf6,
+0x1c, 0xf2, 0x44, 0xf0, 0x9c, 0xf0, 0x46, 0xf2, 0x20, 0xf4, 0xb0, 0xf5, 0xe4, 0xf6, 0x64, 0xf8,
+0x76, 0xfa, 0xa2, 0xfd, 0xe4, 0x01, 0xba, 0x06, 0x18, 0x0b, 0x06, 0x0e, 0xd4, 0x0e, 0x0a, 0x0e,
+0x62, 0x0c, 0x7c, 0x0a, 0xf0, 0x08, 0x74, 0x07, 0xac, 0x05, 0xfa, 0x02, 0xe6, 0xfe, 0x4c, 0xf9,
+0xba, 0xf2, 0xfe, 0xeb, 0x1a, 0xe7, 0x88, 0xe5, 0x88, 0xe8, 0x14, 0xf0, 0xb6, 0xfa, 0x1e, 0x06,
+0x86, 0x10, 0x2e, 0x18, 0x1f, 0x1d, 0x73, 0x1f, 0x5f, 0x1f, 0x2d, 0x1d, 0x80, 0x18, 0x10, 0x11,
+0x90, 0x06, 0x14, 0xf9, 0xc0, 0xe9, 0x31, 0xdb, 0x5b, 0xd0, 0x7f, 0xcc, 0x05, 0xd1, 0x85, 0xdd,
+0xc4, 0xef, 0x8a, 0x03, 0xb8, 0x15, 0x4b, 0x24, 0x19, 0x2e, 0x73, 0x33, 0x53, 0x34, 0xcf, 0x30,
+0xc1, 0x28, 0xa6, 0x1b, 0x3a, 0x09, 0x36, 0xf3, 0xc5, 0xdb, 0x15, 0xc7, 0x93, 0xb9, 0x37, 0xb6,
+0xd7, 0xbe, 0x5f, 0xd1, 0x66, 0xea, 0x52, 0x05, 0xf3, 0x1d, 0x7d, 0x31, 0x11, 0x3f, 0xfd, 0x45,
+0x65, 0x46, 0x83, 0x40, 0x4d, 0x33, 0x2f, 0x1f, 0xf4, 0x04, 0x34, 0xe7, 0x77, 0xca, 0x59, 0xb3,
+0x4a, 0xa6, 0x36, 0xa6, 0x27, 0xb3, 0x07, 0xcb, 0x92, 0xe9, 0xb6, 0x09, 0x1b, 0x27, 0xdb, 0x3e,
+0xed, 0x4e, 0x16, 0x57, 0x1c, 0x56, 0x95, 0x4b, 0xff, 0x37, 0x24, 0x1c, 0xf8, 0xfa, 0x71, 0xd8,
+0xab, 0xb9, 0x28, 0xa3, 0xf2, 0x98, 0x22, 0x9c, 0xcd, 0xac, 0x95, 0xc8, 0x22, 0xeb, 0x78, 0x0f,
+0xb5, 0x30, 0xa5, 0x4b, 0xa4, 0x5d, 0x00, 0x65, 0x62, 0x60, 0x17, 0x50, 0xa9, 0x35, 0xd8, 0x13,
+0xce, 0xee, 0x0d, 0xcb, 0x2f, 0xad, 0x54, 0x99, 0xa6, 0x91, 0xb6, 0x97, 0x47, 0xab, 0x05, 0xca,
+0xac, 0xef, 0x3e, 0x17, 0x5d, 0x3b, 0xf4, 0x57, 0xae, 0x69, 0xe2, 0x6d, 0x1e, 0x64, 0xb9, 0x4d,
+0xf1, 0x2d, 0x08, 0x09, 0x5b, 0xe3, 0x13, 0xc1, 0x3a, 0xa6, 0x5e, 0x95, 0x92, 0x90, 0x12, 0x99,
+0x67, 0xae, 0x4b, 0xcf, 0x56, 0xf7, 0xc7, 0x20, 0xf3, 0x45, 0x84, 0x61, 0xaa, 0x6f, 0xa4, 0x6e,
+0x06, 0x5f, 0x05, 0x44, 0x4d, 0x22, 0xe0, 0xfd, 0xbf, 0xda, 0x13, 0xbc, 0xd6, 0xa4, 0x26, 0x97,
+0xc8, 0x94, 0x10, 0x9f, 0x5d, 0xb6, 0xed, 0xd8, 0xf4, 0x01, 0x3d, 0x2b, 0x1d, 0x4e, 0x54, 0x65,
+0xd6, 0x6d, 0x10, 0x67, 0x9f, 0x53, 0xbf, 0x37, 0xa0, 0x17, 0xcc, 0xf6, 0xe7, 0xd7, 0x7f, 0xbd,
+0xac, 0xa9, 0x8c, 0x9e, 0xf2, 0x9d, 0x8e, 0xa9, 0xa3, 0xc1, 0xdc, 0xe3, 0x14, 0x0b, 0x9f, 0x30,
+0x4d, 0x4e, 0x94, 0x5f, 0x10, 0x63, 0x52, 0x59, 0xa7, 0x45, 0xe5, 0x2b, 0x6e, 0x0f, 0x1a, 0xf3,
+0xab, 0xd8, 0x6d, 0xc2, 0x33, 0xb2, 0x2e, 0xaa, 0xd5, 0xab, 0xe9, 0xb8, 0x91, 0xd0, 0x04, 0xf0,
+0x3e, 0x12, 0x0d, 0x31, 0xa3, 0x47, 0x1d, 0x53, 0xd3, 0x52, 0x5b, 0x48, 0xb1, 0x36, 0xab, 0x20,
+0x34, 0x09, 0x1e, 0xf2, 0xf5, 0xdc, 0x9b, 0xcb, 0x8b, 0xbf, 0x29, 0xba, 0x87, 0xbd, 0xf1, 0xc9,
+0x9d, 0xde, 0x82, 0xf8, 0x0a, 0x13, 0x0b, 0x2a, 0x0f, 0x3a, 0x17, 0x41, 0x3b, 0x3f, 0xeb, 0x35,
+0x39, 0x27, 0xda, 0x15, 0xde, 0x03, 0xda, 0xf2, 0x62, 0xe4, 0x1b, 0xd9, 0x29, 0xd2, 0x23, 0xd0,
+0x87, 0xd3, 0x95, 0xdc, 0x34, 0xea, 0x94, 0xfa, 0x72, 0x0b, 0x44, 0x1a, 0xd3, 0x24, 0xf1, 0x29,
+0x2f, 0x29, 0x4f, 0x23, 0xde, 0x19, 0x6c, 0x0e, 0xce, 0x02, 0x82, 0xf8, 0x3a, 0xf0, 0xa4, 0xea,
+0xe6, 0xe7, 0x26, 0xe7, 0x04, 0xe8, 0xb0, 0xea, 0x84, 0xef, 0xb4, 0xf6, 0x52, 0xff, 0x30, 0x08,
+0x4a, 0x0f, 0x32, 0x13, 0xa2, 0x13, 0xdc, 0x10, 0x86, 0x0c, 0xde, 0x07, 0x56, 0x04, 0x94, 0x02,
+0x12, 0x02, 0x1c, 0x02, 0x26, 0x01, 0x5a, 0xfe, 0xae, 0xf9, 0x44, 0xf4, 0xd6, 0xef, 0x18, 0xee,
+0x7a, 0xef, 0x20, 0xf3, 0xc6, 0xf7, 0xe8, 0xfb, 0x06, 0xff, 0x8a, 0x01, 0x3e, 0x04, 0x44, 0x08,
+0xac, 0x0d, 0xda, 0x13, 0xde, 0x18, 0xe0, 0x1a, 0x2a, 0x18, 0x38, 0x10, 0x4c, 0x04, 0x9e, 0xf6,
+0x22, 0xea, 0x2d, 0xe1, 0xe7, 0xdc, 0xaf, 0xdc, 0xff, 0xdf, 0x7e, 0xe5, 0xa2, 0xec, 0xd6, 0xf5,
+0xc0, 0x00, 0xa6, 0x0d, 0x26, 0x1b, 0xff, 0x26, 0x0b, 0x2f, 0x01, 0x31, 0x5f, 0x2b, 0xd9, 0x1e,
+0xd0, 0x0c, 0x06, 0xf8, 0x74, 0xe4, 0x3f, 0xd4, 0xf7, 0xc9, 0x37, 0xc6, 0x8b, 0xc8, 0xbf, 0xd0,
+0x1f, 0xde, 0x6c, 0xef, 0xee, 0x03, 0x42, 0x19, 0xc7, 0x2c, 0x4b, 0x3c, 0x79, 0x44, 0xe5, 0x43,
+0x5d, 0x3a, 0x31, 0x28, 0x1e, 0x10, 0x18, 0xf5, 0x8b, 0xda, 0xa1, 0xc4, 0x19, 0xb6, 0x7f, 0xb0,
+0xaf, 0xb4, 0xe5, 0xc1, 0x95, 0xd6, 0xc0, 0xf0, 0xde, 0x0c, 0xd3, 0x27, 0xb9, 0x3e, 0x73, 0x4e,
+0x52, 0x55, 0xd1, 0x51, 0x2f, 0x44, 0x7d, 0x2d, 0x3c, 0x10, 0x48, 0xef, 0x41, 0xcf, 0xc7, 0xb4,
+0xd0, 0xa3, 0x5a, 0x9f, 0x50, 0xa7, 0xf7, 0xba, 0x23, 0xd7, 0xf4, 0xf7, 0xe0, 0x18, 0x37, 0x36,
+0x13, 0x4d, 0x6a, 0x5b, 0xe8, 0x5f, 0x6a, 0x59, 0x6f, 0x48, 0xe5, 0x2d, 0xfa, 0x0b, 0x32, 0xe6,
+0xcd, 0xc1, 0xb0, 0xa4, 0x18, 0x94, 0xbe, 0x92, 0x3c, 0xa0, 0x41, 0xba, 0x4d, 0xdc, 0xe8, 0x00,
+0xe5, 0x23, 0x1d, 0x41, 0xee, 0x56, 0xb8, 0x63, 0xea, 0x65, 0x12, 0x5d, 0xfb, 0x48, 0xb3, 0x2a,
+0x92, 0x04, 0x11, 0xdb, 0x39, 0xb4, 0xa6, 0x97, 0x24, 0x8a, 0xca, 0x8d, 0x32, 0xa1, 0xe5, 0xbf,
+0xd4, 0xe4, 0x42, 0x0a, 0x09, 0x2c, 0x7b, 0x47, 0x66, 0x5b, 0x42, 0x66, 0xc0, 0x66, 0xb8, 0x5b,
+0xa3, 0x44, 0x0d, 0x23, 0xce, 0xf9, 0xb1, 0xce, 0x46, 0xa9, 0x60, 0x90, 0x4e, 0x88, 0x44, 0x91,
+0x58, 0xa8, 0xc9, 0xc8, 0x56, 0xed, 0x12, 0x11, 0xc9, 0x30, 0x63, 0x4a, 0x6c, 0x5c, 0x24, 0x65,
+0xae, 0x62, 0x27, 0x54, 0xeb, 0x39, 0x44, 0x16, 0x50, 0xed, 0x29, 0xc5, 0xd0, 0xa4, 0xa6, 0x91,
+0x6c, 0x8e, 0x6c, 0x9a, 0x87, 0xb2, 0x77, 0xd2, 0x28, 0xf5, 0x8a, 0x16, 0x8d, 0x33, 0x5d, 0x4a,
+0x3a, 0x59, 0x66, 0x5e, 0x6e, 0x58, 0x3f, 0x47, 0x0f, 0x2c, 0xde, 0x09, 0xea, 0xe4, 0xc9, 0xc2,
+0xfc, 0xa8, 0x46, 0x9b, 0x6a, 0x9b, 0x5a, 0xa8, 0x77, 0xbf, 0xe7, 0xdc, 0x46, 0xfc, 0xf2, 0x19,
+0x4f, 0x33, 0x1d, 0x46, 0xd5, 0x50, 0xf7, 0x51, 0x01, 0x49, 0x2b, 0x37, 0x25, 0x1e, 0x14, 0x01,
+0x63, 0xe3, 0xeb, 0xc8, 0x55, 0xb5, 0x5b, 0xab, 0x41, 0xac, 0xbf, 0xb7, 0xf7, 0xcb, 0x96, 0xe5,
+0xce, 0x00, 0x48, 0x1a, 0xe3, 0x2e, 0xdb, 0x3c, 0xaf, 0x42, 0x1f, 0x40, 0x2f, 0x36, 0x7f, 0x26,
+0xfc, 0x12, 0x88, 0xfd, 0x1e, 0xe8, 0xe5, 0xd4, 0x91, 0xc6, 0xf9, 0xbe, 0xf3, 0xbf, 0x79, 0xc9,
+0x1f, 0xda, 0x1c, 0xef, 0x9a, 0x04, 0xc0, 0x17, 0xc5, 0x25, 0x93, 0x2d, 0xfb, 0x2e, 0xb9, 0x2a,
+0xb7, 0x22, 0x54, 0x18, 0x74, 0x0c, 0xba, 0xff, 0x6a, 0xf2, 0xa0, 0xe5, 0x53, 0xdb, 0x1f, 0xd5,
+0xe7, 0xd4, 0x4b, 0xdb, 0xce, 0xe6, 0x54, 0xf5, 0x76, 0x03, 0x92, 0x0e, 0xbc, 0x15, 0x62, 0x18,
+0xa6, 0x17, 0xf8, 0x14, 0xa2, 0x11, 0x7a, 0x0e, 0x40, 0x0b, 0xf0, 0x06, 0x06, 0x01, 0xe6, 0xf9,
+0x86, 0xf2, 0x04, 0xed, 0xd4, 0xea, 0x76, 0xec, 0x4c, 0xf1, 0x28, 0xf7, 0x12, 0xfc, 0x26, 0xff,
+0x20, 0x00, 0x14, 0x00, 0x34, 0x00, 0x70, 0x01, 0x94, 0x04, 0x32, 0x09, 0xe4, 0x0d, 0x46, 0x11,
+0xce, 0x11, 0x4e, 0x0f, 0x96, 0x0a, 0xaa, 0x04, 0x1a, 0xff, 0x46, 0xfa, 0x20, 0xf6, 0x56, 0xf2,
+0x58, 0xee, 0xc2, 0xea, 0x24, 0xe8, 0xc2, 0xe7, 0x96, 0xea, 0x06, 0xf1, 0xfe, 0xfa, 0x2a, 0x07,
+0xa0, 0x13, 0x29, 0x1e, 0xad, 0x24, 0x2d, 0x26, 0x89, 0x22, 0x5e, 0x1a, 0xfa, 0x0e, 0xbe, 0x01,
+0x02, 0xf4, 0x56, 0xe7, 0xa9, 0xdc, 0x17, 0xd5, 0x9d, 0xd1, 0xe9, 0xd2, 0x95, 0xd9, 0x8c, 0xe5,
+0xf6, 0xf5, 0x34, 0x09, 0xed, 0x1c, 0x0f, 0x2e, 0xd3, 0x39, 0xe3, 0x3d, 0x1d, 0x39, 0x53, 0x2c,
+0x54, 0x19, 0x0a, 0x03, 0xca, 0xec, 0xfd, 0xd8, 0xe1, 0xc9, 0xa3, 0xc0, 0xb9, 0xbd, 0xc9, 0xc1,
+0xa1, 0xcc, 0xf7, 0xdd, 0xc8, 0xf4, 0xec, 0x0e, 0x6b, 0x29, 0x4f, 0x40, 0x47, 0x4f, 0x11, 0x53,
+0x9f, 0x4a, 0x31, 0x37, 0x7d, 0x1c, 0xb8, 0xfe, 0x2f, 0xe2, 0x63, 0xca, 0x59, 0xb9, 0x0b, 0xb0,
+0xbf, 0xae, 0x7f, 0xb5, 0x83, 0xc4, 0x45, 0xdb, 0x70, 0xf8, 0x1e, 0x19, 0x55, 0x39, 0x8b, 0x53,
+0xee, 0x62, 0xb4, 0x63, 0xb0, 0x55, 0xc7, 0x3b, 0x8c, 0x1a, 0x9c, 0xf7, 0x55, 0xd7, 0x4d, 0xbd,
+0x87, 0xab, 0xb8, 0xa2, 0x38, 0xa3, 0x4f, 0xad, 0x15, 0xc1, 0xcd, 0xdd, 0x32, 0x01, 0x0b, 0x27,
+0x21, 0x4a, 0x5a, 0x64, 0x98, 0x70, 0x9a, 0x6c, 0x04, 0x59, 0x39, 0x3a, 0x72, 0x15, 0xea, 0xef,
+0x55, 0xce, 0xaf, 0xb3, 0x18, 0xa2, 0x6c, 0x9a, 0x28, 0x9d, 0xdc, 0xaa, 0x91, 0xc3, 0x84, 0xe5,
+0x34, 0x0d, 0x2b, 0x35, 0x78, 0x57, 0xac, 0x6e, 0x8c, 0x76, 0xfe, 0x6d, 0xe6, 0x56, 0x8f, 0x35,
+0x34, 0x0f, 0xa0, 0xe8, 0x2d, 0xc6, 0x5f, 0xab, 0x92, 0x9a, 0x36, 0x95, 0xdc, 0x9b, 0xbb, 0xae,
+0x87, 0xcc, 0x3a, 0xf2, 0xc6, 0x1a, 0xbf, 0x40, 0xf2, 0x5e, 0x2e, 0x71, 0xb8, 0x74, 0x32, 0x69,
+0x9b, 0x50, 0xf7, 0x2e, 0x90, 0x08, 0x21, 0xe2, 0x2f, 0xc0, 0x9e, 0xa6, 0x7e, 0x98, 0xf4, 0x96,
+0x58, 0xa2, 0x83, 0xb9, 0xe1, 0xd9, 0x16, 0xff, 0x3d, 0x24, 0xcb, 0x44, 0x4a, 0x5d, 0x02, 0x6b,
+0xda, 0x6b, 0x98, 0x5f, 0x77, 0x47, 0xbf, 0x26, 0x9c, 0x01, 0xb1, 0xdc, 0x11, 0xbd, 0xca, 0xa6,
+0xc8, 0x9c, 0xe2, 0x9f, 0x47, 0xaf, 0x89, 0xc8, 0xca, 0xe7, 0xe2, 0x08, 0xd3, 0x27, 0x17, 0x42,
+0x4e, 0x55, 0x8c, 0x5f, 0x06, 0x5f, 0xdf, 0x52, 0x29, 0x3c, 0x63, 0x1d, 0xc4, 0xfa, 0x51, 0xd9,
+0x0f, 0xbe, 0xfd, 0xac, 0x18, 0xa8, 0x33, 0xaf, 0x37, 0xc0, 0xfb, 0xd7, 0x98, 0xf2, 0x18, 0x0d,
+0x2b, 0x25, 0x41, 0x39, 0x13, 0x48, 0x8b, 0x4f, 0x49, 0x4e, 0x21, 0x43, 0xaf, 0x2e, 0x6a, 0x13,
+0x5e, 0xf5, 0xb9, 0xd9, 0xf1, 0xc4, 0x03, 0xba, 0xa7, 0xb9, 0xb5, 0xc2, 0x57, 0xd2, 0x88, 0xe5,
+0x7e, 0xf9, 0x90, 0x0c, 0xd7, 0x1d, 0x73, 0x2c, 0x69, 0x37, 0xff, 0x3c, 0xa5, 0x3b, 0x43, 0x32,
+0x71, 0x21, 0x68, 0x0b, 0x34, 0xf4, 0x09, 0xe0, 0x87, 0xd2, 0x19, 0xcd, 0x67, 0xcf, 0x6f, 0xd7,
+0xdb, 0xe2, 0x86, 0xef, 0xf8, 0xfb, 0xb2, 0x07, 0x44, 0x12, 0xaa, 0x1b, 0xfd, 0x22, 0x3f, 0x27,
+0xe5, 0x26, 0x23, 0x21, 0x2c, 0x16, 0x16, 0x08, 0xa8, 0xf9, 0xfc, 0xed, 0xdc, 0xe6, 0x9e, 0xe4,
+0x86, 0xe6, 0xda, 0xea, 0x42, 0xf0, 0x96, 0xf5, 0x72, 0xfa, 0xca, 0xfe, 0x06, 0x03, 0x5e, 0x07,
+0xf8, 0x0b, 0x00, 0x10, 0x88, 0x12, 0xaa, 0x12, 0x2c, 0x10, 0xc0, 0x0b, 0x76, 0x06, 0xc6, 0x01,
+0x7e, 0xfe, 0xcc, 0xfc, 0x12, 0xfc, 0x8e, 0xfb, 0x8a, 0xfa, 0x94, 0xf8, 0xa0, 0xf5, 0x6a, 0xf2,
+0x04, 0xf0, 0xe8, 0xef, 0xb8, 0xf2, 0xac, 0xf8, 0xd0, 0x00, 0x8e, 0x09, 0x1c, 0x11, 0x3a, 0x16,
+0xa4, 0x18, 0xbe, 0x18, 0x1e, 0x17, 0xe8, 0x13, 0x66, 0x0f, 0x0c, 0x09, 0x10, 0x01, 0x36, 0xf7,
+0x5c, 0xec, 0x05, 0xe2, 0x3b, 0xda, 0x7f, 0xd7, 0x41, 0xdb, 0xaa, 0xe5, 0x18, 0xf5, 0x90, 0x06,
+0xc8, 0x16, 0x47, 0x23, 0xe3, 0x2a, 0xd1, 0x2d, 0x91, 0x2c, 0x9d, 0x27, 0x17, 0x1f, 0x24, 0x13,
+0xe4, 0x03, 0x32, 0xf2, 0x89, 0xdf, 0xd3, 0xce, 0x53, 0xc3, 0x45, 0xc0, 0x3b, 0xc7, 0xb1, 0xd7,
+0x0c, 0xef, 0x9e, 0x08, 0x39, 0x20, 0x41, 0x32, 0xab, 0x3d, 0x21, 0x42, 0x43, 0x40, 0x6b, 0x38,
+0x15, 0x2b, 0x84, 0x18, 0xa4, 0x01, 0xf6, 0xe7, 0xc7, 0xce, 0x19, 0xba, 0x07, 0xae, 0xa9, 0xad,
+0xc9, 0xb9, 0xe7, 0xd0, 0xc4, 0xee, 0x44, 0x0e, 0x5d, 0x2a, 0x15, 0x40, 0x93, 0x4d, 0xd3, 0x52,
+0x8b, 0x4f, 0x55, 0x44, 0x59, 0x31, 0xa4, 0x17, 0x46, 0xf9, 0x5d, 0xd9, 0x8b, 0xbc, 0x4e, 0xa7,
+0xa4, 0x9d, 0x72, 0xa1, 0xc3, 0xb2, 0xdf, 0xce, 0x66, 0xf1, 0xf0, 0x14, 0xa9, 0x34, 0x2b, 0x4d,
+0x6c, 0x5c, 0x38, 0x61, 0x0a, 0x5b, 0x7f, 0x4a, 0xc3, 0x30, 0x3e, 0x10, 0x48, 0xec, 0x7f, 0xc9,
+0xfd, 0xac, 0xb4, 0x9a, 0x16, 0x95, 0x10, 0x9d, 0xdb, 0xb1, 0x01, 0xd1, 0x1a, 0xf6, 0xfa, 0x1b,
+0x17, 0x3e, 0x42, 0x58, 0xb0, 0x67, 0x6a, 0x6a, 0xfe, 0x5f, 0xab, 0x49, 0x11, 0x2a, 0xe8, 0x04,
+0x07, 0xdf, 0x2d, 0xbd, 0x86, 0xa3, 0xd2, 0x94, 0x98, 0x92, 0x46, 0x9d, 0x23, 0xb4, 0x23, 0xd5,
+0x42, 0xfc, 0x39, 0x24, 0xbb, 0x47, 0x16, 0x62, 0x72, 0x6f, 0x02, 0x6e, 0xf2, 0x5d, 0x45, 0x42,
+0x03, 0x1f, 0xfa, 0xf8, 0x9d, 0xd4, 0x21, 0xb6, 0x80, 0xa0, 0x4a, 0x95, 0x7a, 0x95, 0x96, 0xa1,
+0xcf, 0xb9, 0x01, 0xdc, 0x24, 0x04, 0xa5, 0x2c, 0x79, 0x4f, 0x52, 0x67, 0x54, 0x70, 0xa4, 0x69,
+0x00, 0x55, 0xb7, 0x36, 0x38, 0x13, 0x96, 0xef, 0x53, 0xcf, 0x79, 0xb5, 0xe6, 0xa3, 0x92, 0x9b,
+0xde, 0x9d, 0x69, 0xab, 0x55, 0xc4, 0x5c, 0xe6, 0xae, 0x0d, 0xbd, 0x33, 0xc7, 0x52, 0x4c, 0x65,
+0xfa, 0x68, 0xd4, 0x5d, 0x25, 0x47, 0x7b, 0x29, 0x64, 0x09, 0x86, 0xea, 0x7d, 0xcf, 0x65, 0xba,
+0x5f, 0xac, 0xb8, 0xa6, 0x42, 0xaa, 0x61, 0xb8, 0x7f, 0xd0, 0xa2, 0xf0, 0xf0, 0x13, 0x05, 0x35,
+0xff, 0x4d, 0xd8, 0x5a, 0x48, 0x5a, 0xcd, 0x4d, 0xc5, 0x38, 0xf1, 0x1e, 0x12, 0x04, 0xbe, 0xea,
+0x01, 0xd5, 0x29, 0xc4, 0x6b, 0xb9, 0x09, 0xb6, 0xfd, 0xba, 0xb9, 0xc8, 0x93, 0xde, 0x10, 0xfa,
+0x20, 0x17, 0xc7, 0x30, 0xbd, 0x42, 0x8d, 0x4a, 0x09, 0x48, 0x63, 0x3c, 0x75, 0x2a, 0x92, 0x15,
+0x48, 0x00, 0xae, 0xec, 0x2b, 0xdc, 0x4b, 0xd0, 0xa3, 0xc9, 0xf3, 0xc8, 0x9b, 0xce, 0x3b, 0xda,
+0x1e, 0xeb, 0xde, 0xfe, 0xe0, 0x12, 0xed, 0x23, 0x9f, 0x2f, 0x23, 0x34, 0x7d, 0x31, 0xcb, 0x28,
+0x47, 0x1c, 0x04, 0x0e, 0xec, 0xff, 0x94, 0xf3, 0xa6, 0xe9, 0x03, 0xe3, 0xcb, 0xdf, 0xfd, 0xdf,
+0x0d, 0xe3, 0xd6, 0xe8, 0xf8, 0xf0, 0x5a, 0xfb, 0x94, 0x06, 0x64, 0x11, 0xc2, 0x19, 0xab, 0x1d,
+0x2d, 0x1d, 0xce, 0x18, 0xd6, 0x11, 0x02, 0x0a, 0xf0, 0x02, 0x6c, 0xfd, 0xde, 0xf9, 0xec, 0xf7,
+0x1e, 0xf7, 0x20, 0xf6, 0x7c, 0xf4, 0xb2, 0xf2, 0xac, 0xf1, 0x90, 0xf2, 0xb8, 0xf5, 0x1a, 0xfb,
+0xf8, 0x00, 0xe6, 0x05, 0xae, 0x08, 0x7a, 0x09, 0x48, 0x09, 0x0e, 0x09, 0xe4, 0x09, 0xb6, 0x0b,
+0x0e, 0x0e, 0x54, 0x0f, 0x0c, 0x0e, 0x0a, 0x09, 0x8a, 0x00, 0x14, 0xf6, 0x1e, 0xec, 0x22, 0xe5,
+0x83, 0xe2, 0x3c, 0xe4, 0x32, 0xe9, 0xc8, 0xef, 0xd0, 0xf6, 0xe8, 0xfd, 0x7a, 0x05, 0x00, 0x0e,
+0x04, 0x17, 0x69, 0x1f, 0x67, 0x25, 0xe5, 0x26, 0x5b, 0x22, 0x78, 0x17, 0x9e, 0x07, 0x7c, 0xf5,
+0x44, 0xe4, 0xdf, 0xd6, 0x71, 0xcf, 0x7f, 0xce, 0x1f, 0xd3, 0x03, 0xdc, 0x02, 0xe8, 0x80, 0xf6,
+0xce, 0x06, 0x04, 0x18, 0x09, 0x28, 0xe3, 0x34, 0xef, 0x3b, 0x4d, 0x3b, 0x31, 0x32, 0x71, 0x21,
+0x1a, 0x0b, 0x38, 0xf2, 0x77, 0xda, 0x7d, 0xc7, 0xf1, 0xbb, 0x0f, 0xb9, 0xa7, 0xbe, 0xa5, 0xcb,
+0xb7, 0xde, 0xc8, 0xf5, 0xee, 0x0e, 0x1b, 0x27, 0xaf, 0x3b, 0x93, 0x49, 0x0f, 0x4f, 0xb7, 0x4a,
+0x03, 0x3d, 0xe5, 0x26, 0x14, 0x0b, 0x64, 0xec, 0xf5, 0xce, 0x17, 0xb7, 0x6e, 0xa8, 0x6e, 0xa5,
+0xd1, 0xad, 0xe3, 0xc0, 0x9d, 0xdb, 0x26, 0xfb, 0xca, 0x1a, 0x01, 0x37, 0x6f, 0x4c, 0x1a, 0x59,
+0x96, 0x5b, 0x89, 0x53, 0xd1, 0x41, 0xdb, 0x27, 0xb8, 0x07, 0x62, 0xe4, 0x8f, 0xc2, 0x88, 0xa7,
+0x1e, 0x98, 0xd2, 0x96, 0x3c, 0xa4, 0xf9, 0xbd, 0x31, 0xe0, 0x40, 0x05, 0x51, 0x28, 0x39, 0x45,
+0x96, 0x59, 0xce, 0x63, 0x54, 0x63, 0x40, 0x58, 0x2b, 0x43, 0x67, 0x25, 0xec, 0x00, 0xa3, 0xd9,
+0xd1, 0xb4, 0x16, 0x99, 0x84, 0x8b, 0xec, 0x8e, 0x64, 0xa2, 0x5b, 0xc2, 0x10, 0xe9, 0x74, 0x10,
+0x57, 0x33, 0x77, 0x4e, 0x56, 0x60, 0xee, 0x67, 0xee, 0x64, 0x1a, 0x57, 0x35, 0x3f, 0x63, 0x1e,
+0x32, 0xf7, 0xf5, 0xcd, 0x48, 0xa9, 0xda, 0x8f, 0xac, 0x86, 0x42, 0x8f, 0xb2, 0xa7, 0xf7, 0xca,
+0xc0, 0xf2, 0x18, 0x19, 0xc7, 0x39, 0xb5, 0x52, 0x18, 0x62, 0x84, 0x67, 0xe8, 0x61, 0xa7, 0x51,
+0x0d, 0x37, 0xee, 0x13, 0x98, 0xeb, 0x63, 0xc3, 0x1e, 0xa2, 0xce, 0x8d, 0x60, 0x8a, 0xa4, 0x97,
+0x9f, 0xb2, 0xdb, 0xd5, 0xa4, 0xfb, 0x05, 0x1f, 0xab, 0x3c, 0x65, 0x52, 0x34, 0x5f, 0xda, 0x61,
+0xe4, 0x59, 0x35, 0x47, 0x0d, 0x2b, 0xec, 0x07, 0xe1, 0xe1, 0x37, 0xbe, 0xfe, 0xa2, 0xc2, 0x94,
+0x90, 0x95, 0x9e, 0xa4, 0xa9, 0xbe, 0x49, 0xdf, 0x6c, 0x01, 0x07, 0x21, 0xeb, 0x3a, 0x71, 0x4d,
+0xd6, 0x56, 0x6c, 0x56, 0xb9, 0x4b, 0xa3, 0x37, 0x4b, 0x1c, 0xb6, 0xfc, 0xbd, 0xdc, 0xc7, 0xc0,
+0xb1, 0xac, 0x92, 0xa3, 0x86, 0xa6, 0xbf, 0xb4, 0xdd, 0xcb, 0x14, 0xe8, 0x74, 0x05, 0x2f, 0x20,
+0xa3, 0x35, 0x89, 0x43, 0x1f, 0x49, 0xc1, 0x45, 0xf9, 0x39, 0x71, 0x27, 0x7e, 0x10, 0xee, 0xf7,
+0x4d, 0xe0, 0xfd, 0xcb, 0x89, 0xbd, 0xf3, 0xb6, 0x71, 0xb9, 0xdb, 0xc4, 0xcf, 0xd7, 0x24, 0xef,
+0x54, 0x07, 0xbd, 0x1c, 0xb9, 0x2c, 0xc9, 0x35, 0x4d, 0x37, 0xef, 0x31, 0xf3, 0x26, 0x90, 0x18,
+0x9c, 0x08, 0xbc, 0xf8, 0x92, 0xe9, 0x29, 0xdc, 0xbb, 0xd1, 0x35, 0xcc, 0x1f, 0xcd, 0xf9, 0xd4,
+0xcd, 0xe2, 0x06, 0xf4, 0x8a, 0x05, 0x38, 0x14, 0x17, 0x1e, 0x21, 0x22, 0x1f, 0x21, 0x42, 0x1c,
+0x7c, 0x15, 0x38, 0x0e, 0x36, 0x07, 0x42, 0x00, 0xc6, 0xf8, 0x9e, 0xf0, 0xf2, 0xe8, 0x7f, 0xe3,
+0x03, 0xe2, 0x4c, 0xe5, 0xc0, 0xec, 0x5c, 0xf6, 0xa2, 0xff, 0x74, 0x06, 0xbe, 0x09, 0x2e, 0x0a,
+0xe8, 0x08, 0xaa, 0x07, 0x90, 0x07, 0xb6, 0x08, 0x68, 0x0a, 0x5a, 0x0b, 0x1c, 0x0a, 0x4c, 0x06,
+0x82, 0x00, 0x6c, 0xfa, 0x78, 0xf5, 0xc2, 0xf2, 0x34, 0xf2, 0xbe, 0xf2, 0x4a, 0xf3, 0xe8, 0xf2,
+0x40, 0xf2, 0x02, 0xf2, 0xaa, 0xf3, 0x14, 0xf8, 0x2e, 0xff, 0x2a, 0x08, 0x5c, 0x11, 0xdc, 0x18,
+0xeb, 0x1c, 0x9b, 0x1c, 0x10, 0x18, 0x0c, 0x10, 0x18, 0x06, 0xb6, 0xfb, 0xca, 0xf1, 0x0a, 0xe9,
+0xa1, 0xe1, 0x73, 0xdc, 0x47, 0xda, 0xf9, 0xdb, 0x37, 0xe2, 0xb2, 0xec, 0xda, 0xfa, 0xce, 0x0a,
+0xda, 0x1a, 0x91, 0x28, 0x99, 0x31, 0x27, 0x34, 0x2b, 0x2f, 0x35, 0x23, 0x1c, 0x12, 0x80, 0xfe,
+0x08, 0xeb, 0xf3, 0xd9, 0x35, 0xcd, 0x09, 0xc6, 0xef, 0xc4, 0x07, 0xca, 0xe5, 0xd4, 0x54, 0xe5,
+0xd2, 0xf9, 0xae, 0x10, 0x4b, 0x27, 0x91, 0x3a, 0x3b, 0x47, 0x39, 0x4a, 0x31, 0x42, 0x01, 0x30,
+0xba, 0x16, 0x7a, 0xfa, 0x77, 0xdf, 0x3d, 0xc9, 0x21, 0xba, 0x2b, 0xb3, 0x37, 0xb4, 0x87, 0xbc,
+0x0d, 0xcc, 0xc3, 0xe1, 0x5e, 0xfc, 0x56, 0x19, 0x95, 0x35, 0xed, 0x4c, 0xf8, 0x5a, 0x20, 0x5c,
+0x1f, 0x4f, 0xfd, 0x35, 0x42, 0x15, 0x6c, 0xf2, 0x9f, 0xd2, 0xe3, 0xb9, 0x7a, 0xaa, 0xc8, 0xa4,
+0x16, 0xa8, 0x1f, 0xb4, 0x31, 0xc8, 0x99, 0xe3, 0x0c, 0x04, 0x6b, 0x26, 0x6f, 0x46, 0x0a, 0x5f,
+0x4e, 0x6b, 0xd2, 0x67, 0xad, 0x54, 0x55, 0x35, 0x68, 0x0f, 0xf2, 0xe8, 0x29, 0xc7, 0xfb, 0xad,
+0x2e, 0x9f, 0xf4, 0x9a, 0xea, 0xa0, 0x7d, 0xb0, 0x7b, 0xc9, 0xf0, 0xe9, 0xf6, 0x0e, 0x31, 0x34,
+0x9f, 0x54, 0x00, 0x6b, 0xf2, 0x72, 0x6a, 0x6a, 0xd7, 0x52, 0x6f, 0x30, 0xec, 0x08, 0xc7, 0xe1,
+0x13, 0xc0, 0x3a, 0xa7, 0x20, 0x99, 0x6a, 0x96, 0xe0, 0x9e, 0x8d, 0xb2, 0x01, 0xd0, 0xa8, 0xf4,
+0x24, 0x1c, 0x6d, 0x41, 0x54, 0x5f, 0x26, 0x71, 0xf4, 0x73, 0x2a, 0x67, 0xff, 0x4c, 0xb1, 0x29,
+0x02, 0x02, 0x51, 0xdb, 0x31, 0xba, 0x7a, 0xa2, 0x46, 0x96, 0x46, 0x96, 0xb2, 0xa2, 0x8d, 0xba,
+0xa7, 0xdb, 0xde, 0x01, 0x2f, 0x28, 0xa5, 0x49, 0xfc, 0x61, 0x50, 0x6e, 0xf8, 0x6c, 0x40, 0x5e,
+0x2d, 0x44, 0xeb, 0x21, 0xf0, 0xfb, 0xe3, 0xd6, 0xd7, 0xb7, 0xa8, 0xa2, 0x96, 0x99, 0x92, 0x9d,
+0xed, 0xad, 0xb3, 0xc8, 0x48, 0xea, 0xca, 0x0d, 0xd3, 0x2e, 0x9d, 0x49, 0xe4, 0x5b, 0xdc, 0x63,
+0xb6, 0x60, 0x6b, 0x52, 0x0b, 0x3a, 0x48, 0x1a, 0xaa, 0xf6, 0x79, 0xd4, 0xa7, 0xb8, 0x40, 0xa7,
+0x8c, 0xa2, 0x66, 0xaa, 0x5b, 0xbd, 0x0d, 0xd8, 0x42, 0xf6, 0xf2, 0x13, 0xd1, 0x2d, 0x37, 0x42,
+0xb5, 0x4f, 0x64, 0x55, 0x03, 0x52, 0x29, 0x45, 0x57, 0x2f, 0x84, 0x12, 0xac, 0xf2, 0xaf, 0xd4,
+0xd1, 0xbd, 0xa1, 0xb1, 0x69, 0xb1, 0x25, 0xbc, 0x1f, 0xcf, 0x6c, 0xe6, 0x9a, 0xfe, 0xaa, 0x14,
+0x4b, 0x27, 0xb7, 0x35, 0x63, 0x3f, 0x59, 0x43, 0x63, 0x40, 0xa1, 0x35, 0x3d, 0x23, 0x38, 0x0b,
+0x40, 0xf1, 0x15, 0xda, 0x13, 0xca, 0x6d, 0xc3, 0x75, 0xc6, 0xff, 0xd0, 0x33, 0xe0, 0xfe, 0xf0,
+0xe6, 0x00, 0x1e, 0x0f, 0xda, 0x1a, 0x67, 0x24, 0x07, 0x2b, 0x33, 0x2e, 0x93, 0x2c, 0x4b, 0x25,
+0x4c, 0x18, 0x4c, 0x07, 0x86, 0xf5, 0x7a, 0xe6, 0x2b, 0xdd, 0x89, 0xda, 0xcf, 0xdd, 0xf6, 0xe4,
+0xca, 0xed, 0x7e, 0xf6, 0x7c, 0xfe, 0x4e, 0x05, 0x32, 0x0b, 0x50, 0x10, 0x90, 0x14, 0xb4, 0x17,
+0xce, 0x18, 0xbe, 0x16, 0x74, 0x11, 0xa0, 0x09, 0x38, 0x01, 0x14, 0xfa, 0x90, 0xf5, 0xc2, 0xf3,
+0x1c, 0xf4, 0x66, 0xf5, 0x9a, 0xf6, 0x8c, 0xf7, 0xbc, 0xf7, 0xe6, 0xf7, 0x38, 0xf8, 0x94, 0xf9,
+0x9e, 0xfc, 0x58, 0x01, 0x3e, 0x07, 0xee, 0x0c, 0x42, 0x11, 0x20, 0x13, 0xdc, 0x12, 0xda, 0x10,
+0xf4, 0x0d, 0xa2, 0x0a, 0xa4, 0x06, 0x0c, 0x02, 0x88, 0xfc, 0x10, 0xf6, 0x20, 0xef, 0x8e, 0xe8,
+0x9b, 0xe3, 0x07, 0xe2, 0xfa, 0xe4, 0x56, 0xed, 0x3a, 0xfa, 0x16, 0x09, 0xf6, 0x16, 0x41, 0x21,
+0xb5, 0x26, 0x81, 0x27, 0x73, 0x24, 0x57, 0x1e, 0xe8, 0x15, 0x76, 0x0b, 0x00, 0xff, 0x4c, 0xf1,
+0x07, 0xe3, 0x29, 0xd6, 0x4f, 0xcd, 0x87, 0xca, 0x57, 0xd0, 0xc5, 0xde, 0xfe, 0xf3, 0xa8, 0x0b,
+0x6f, 0x21, 0x7d, 0x31, 0x7d, 0x3a, 0x61, 0x3c, 0xf3, 0x37, 0xe9, 0x2e, 0x91, 0x21, 0xd0, 0x10,
+0x44, 0xfd, 0xfe, 0xe7, 0x17, 0xd3, 0x9b, 0xc1, 0xd1, 0xb6, 0x31, 0xb6, 0x01, 0xc1, 0x69, 0xd6,
+0x20, 0xf3, 0xd4, 0x11, 0x11, 0x2d, 0x25, 0x41, 0x43, 0x4c, 0x7b, 0x4e, 0xb3, 0x48, 0xd1, 0x3b,
+0x07, 0x29, 0x80, 0x11, 0x44, 0xf6, 0xf3, 0xd9, 0x2b, 0xc0, 0xc9, 0xac, 0x12, 0xa4, 0xec, 0xa7,
+0xe7, 0xb8, 0xb5, 0xd4, 0x02, 0xf7, 0x0c, 0x1a, 0x97, 0x38, 0xdf, 0x4e, 0x1a, 0x5b, 0x2c, 0x5d,
+0xde, 0x54, 0x9f, 0x43, 0xaf, 0x2a, 0xfc, 0x0b, 0x58, 0xea, 0x93, 0xc9, 0x79, 0xae, 0x44, 0x9d,
+0x9e, 0x98, 0x84, 0xa1, 0x55, 0xb7, 0x1d, 0xd7, 0x5e, 0xfc, 0xc5, 0x21, 0x2f, 0x42, 0x26, 0x5a,
+0x1e, 0x67, 0xa2, 0x67, 0xe4, 0x5b, 0x51, 0x45, 0x07, 0x26, 0xa2, 0x01, 0x33, 0xdc, 0xc7, 0xba,
+0x18, 0xa2, 0xae, 0x94, 0x7c, 0x94, 0x66, 0xa1, 0xff, 0xb9, 0xd9, 0xdb, 0x7e, 0x02, 0x2b, 0x29,
+0xe9, 0x4a, 0x5c, 0x63, 0x0c, 0x6f, 0x8a, 0x6c, 0x0a, 0x5c, 0xed, 0x3f, 0x04, 0x1c, 0xcc, 0xf4,
+0xaf, 0xcf, 0x13, 0xb1, 0x8e, 0x9c, 0xa2, 0x93, 0xda, 0x96, 0xd0, 0xa5, 0x77, 0xbf, 0xaf, 0xe1,
+0xd0, 0x08, 0xf5, 0x2f, 0x8f, 0x51, 0xc4, 0x68, 0xaa, 0x71, 0xe0, 0x6a, 0x98, 0x55, 0xbd, 0x35,
+0x30, 0x10, 0x22, 0xea, 0x41, 0xc8, 0x0b, 0xae, 0xe8, 0x9d, 0x6e, 0x98, 0xb6, 0x9d, 0x95, 0xad,
+0x9b, 0xc7, 0xfa, 0xe9, 0x8e, 0x10, 0x85, 0x36, 0xde, 0x55, 0x5e, 0x69, 0x8a, 0x6d, 0xb8, 0x61,
+0xf7, 0x48, 0x0b, 0x28, 0x50, 0x04, 0x53, 0xe2, 0xbf, 0xc5, 0x09, 0xb1, 0x44, 0xa5, 0xac, 0xa2,
+0x7c, 0xa9, 0x01, 0xba, 0x8d, 0xd3, 0x1e, 0xf4, 0xe6, 0x17, 0xa3, 0x39, 0xad, 0x53, 0x66, 0x61,
+0x7a, 0x60, 0x03, 0x52, 0xa7, 0x39, 0xc0, 0x1b, 0x42, 0xfd, 0x9d, 0xe1, 0x49, 0xcb, 0x73, 0xbb,
+0xc1, 0xb2, 0xab, 0xb1, 0xb3, 0xb8, 0x0d, 0xc8, 0xed, 0xde, 0xb0, 0xfb, 0x4a, 0x1a, 0xf3, 0x35,
+0xad, 0x49, 0x3f, 0x52, 0xf3, 0x4e, 0x0f, 0x41, 0xc1, 0x2b, 0x2e, 0x13, 0xce, 0xfa, 0x50, 0xe5,
+0x39, 0xd4, 0x65, 0xc8, 0x71, 0xc2, 0x2d, 0xc3, 0x51, 0xca, 0x11, 0xd8, 0x88, 0xeb, 0x60, 0x02,
+0xa0, 0x19, 0x55, 0x2d, 0x6f, 0x3a, 0xff, 0x3e, 0xcf, 0x3a, 0xef, 0x2e, 0x7d, 0x1e, 0xf6, 0x0b,
+0x5e, 0xfa, 0x9a, 0xeb, 0x77, 0xe0, 0x9f, 0xd9, 0x0b, 0xd7, 0xa9, 0xd8, 0x4f, 0xde, 0x76, 0xe7,
+0x1c, 0xf3, 0x82, 0x00, 0x1a, 0x0e, 0x30, 0x1a, 0xe9, 0x22, 0xaf, 0x26, 0x0b, 0x25, 0xd5, 0x1e,
+0x2e, 0x15, 0x1c, 0x0a, 0x68, 0xff, 0x9c, 0xf6, 0x68, 0xf0, 0x24, 0xed, 0xa2, 0xec, 0x22, 0xee,
+0x24, 0xf0, 0x46, 0xf2, 0xea, 0xf4, 0x5e, 0xf8, 0x92, 0xfd, 0xf6, 0x03, 0x44, 0x0a, 0xfa, 0x0e,
+0x38, 0x11, 0x80, 0x10, 0xbe, 0x0d, 0x50, 0x0a, 0x60, 0x07, 0x02, 0x06, 0xac, 0x05, 0xca, 0x05,
+0x38, 0x05, 0x92, 0x02, 0x76, 0xfd, 0xae, 0xf6, 0xd0, 0xef, 0x28, 0xeb, 0x42, 0xea, 0x22, 0xed,
+0x10, 0xf3, 0x14, 0xfa, 0x7a, 0x00, 0xce, 0x05, 0x4a, 0x0a, 0xa2, 0x0e, 0x82, 0x13, 0x5a, 0x18,
+0x45, 0x1c, 0xb7, 0x1d, 0xac, 0x1a, 0x70, 0x12, 0x9c, 0x05, 0xe6, 0xf5, 0x94, 0xe6, 0x9b, 0xda,
+0x5f, 0xd4, 0xf7, 0xd4, 0x23, 0xdb, 0xfc, 0xe4, 0xd4, 0xf0, 0x78, 0xfd, 0x68, 0x0a, 0x96, 0x17,
+0xd3, 0x23, 0xf1, 0x2d, 0xbf, 0x33, 0x2d, 0x33, 0x55, 0x2b, 0x5d, 0x1c, 0xe8, 0x07, 0xf0, 0xf0,
+0x11, 0xdb, 0xef, 0xc9, 0x9f, 0xc0, 0xc5, 0xbf, 0xff, 0xc6, 0x83, 0xd4, 0x86, 0xe6, 0x6c, 0xfb,
+0x78, 0x11, 0x7f, 0x26, 0x47, 0x38, 0x53, 0x44, 0x6b, 0x48, 0xa7, 0x43, 0xe3, 0x35, 0x79, 0x20,
+0xe0, 0x05, 0x2e, 0xe9, 0x53, 0xce, 0x4f, 0xb9, 0x41, 0xad, 0xff, 0xab, 0x79, 0xb5, 0x35, 0xc8,
+0xd1, 0xe1, 0x5c, 0xff, 0x1d, 0x1d, 0xa7, 0x37, 0x99, 0x4b, 0x9a, 0x56, 0x7a, 0x57, 0x0b, 0x4e,
+0x4d, 0x3b, 0x01, 0x21, 0xdc, 0x01, 0xed, 0xe0, 0x61, 0xc2, 0x88, 0xaa, 0x6e, 0x9d, 0x66, 0x9d,
+0xbc, 0xaa, 0xc3, 0xc3, 0xcc, 0xe4, 0x18, 0x09, 0x77, 0x2b, 0xb9, 0x47, 0xf2, 0x5a, 0x66, 0x63,
+0x8e, 0x60, 0x03, 0x53, 0x63, 0x3c, 0x83, 0x1e, 0xbe, 0xfb, 0x45, 0xd7, 0xcd, 0xb5, 0x9e, 0x9c,
+0x48, 0x90, 0x74, 0x93, 0x4a, 0xa6, 0xfd, 0xc5, 0x2e, 0xed, 0x52, 0x15, 0xcd, 0x38, 0xcf, 0x53,
+0x58, 0x64, 0x80, 0x69, 0x50, 0x63, 0xd7, 0x52, 0x8f, 0x39, 0x1a, 0x19, 0xb0, 0xf3, 0x1d, 0xcd,
+0xaa, 0xaa, 0x7a, 0x92, 0x5a, 0x89, 0x90, 0x91, 0x20, 0xaa, 0x81, 0xce, 0x0a, 0xf8, 0x07, 0x20,
+0x5d, 0x41, 0x38, 0x59, 0x8a, 0x66, 0xd4, 0x68, 0x68, 0x60, 0x23, 0x4e, 0x1d, 0x33, 0xf8, 0x10,
+0x60, 0xea, 0x89, 0xc3, 0xac, 0xa2, 0xd4, 0x8d, 0x6a, 0x89, 0xa4, 0x96, 0xd9, 0xb2, 0xa1, 0xd8,
+0x3e, 0x01, 0x97, 0x26, 0x91, 0x44, 0x52, 0x59, 0xce, 0x63, 0xdc, 0x63, 0x84, 0x59, 0x57, 0x45,
+0xf5, 0x28, 0x2e, 0x06, 0x69, 0xe0, 0x7f, 0xbc, 0x58, 0xa0, 0x3a, 0x91, 0x36, 0x92, 0xbc, 0xa2,
+0x8f, 0xbf, 0x6f, 0xe3, 0x4a, 0x08, 0x49, 0x29, 0x35, 0x43, 0x37, 0x54, 0xd2, 0x5b, 0x64, 0x59,
+0x1b, 0x4d, 0x09, 0x38, 0xc4, 0x1b, 0x20, 0xfb, 0xb7, 0xd9, 0x29, 0xbc, 0xcc, 0xa6, 0x8a, 0x9d,
+0x74, 0xa1, 0x07, 0xb2, 0x39, 0xcc, 0x6c, 0xeb, 0x48, 0x0b, 0x85, 0x27, 0x69, 0x3d, 0x19, 0x4b,
+0xb5, 0x4f, 0xdd, 0x4a, 0x7b, 0x3d, 0xbb, 0x28, 0x18, 0x0f, 0xae, 0xf3, 0x99, 0xd9, 0xd9, 0xc3,
+0x4f, 0xb5, 0x85, 0xaf, 0x1f, 0xb4, 0x2f, 0xc2, 0xc9, 0xd7, 0xba, 0xf1, 0x22, 0x0c, 0x5f, 0x23,
+0x91, 0x34, 0x0b, 0x3e, 0xfb, 0x3e, 0x6f, 0x38, 0xed, 0x2a, 0x2c, 0x19, 0x6a, 0x05, 0xec, 0xf1,
+0xa1, 0xe0, 0x73, 0xd2, 0xa1, 0xc8, 0xbd, 0xc4, 0xa1, 0xc7, 0x8d, 0xd1, 0x9b, 0xe1, 0x40, 0xf5,
+0x4c, 0x09, 0xa6, 0x1a, 0x67, 0x26, 0xab, 0x2b, 0x7d, 0x2a, 0xa3, 0x23, 0x90, 0x19, 0xca, 0x0d,
+0x78, 0x02, 0x46, 0xf8, 0x3a, 0xef, 0x04, 0xe7, 0x2d, 0xe0, 0xb1, 0xdb, 0x3b, 0xdb, 0xf7, 0xdf,
+0x38, 0xe9, 0xb6, 0xf5, 0x8a, 0x02, 0x00, 0x0d, 0x7a, 0x13, 0x3e, 0x15, 0x58, 0x13, 0x62, 0x0f,
+0xfc, 0x0a, 0x70, 0x07, 0x30, 0x05, 0x7a, 0x03, 0x1c, 0x01, 0x3e, 0xfd, 0xcc, 0xf7, 0x44, 0xf2,
+0x2c, 0xee, 0xdc, 0xec, 0xc2, 0xee, 0xc4, 0xf2, 0x3a, 0xf7, 0x9a, 0xfa, 0x1e, 0xfc, 0x84, 0xfc,
+0xf2, 0xfc, 0x96, 0xfe, 0x08, 0x02, 0x54, 0x07, 0x46, 0x0d, 0x7a, 0x12, 0x0e, 0x15, 0xd2, 0x13,
+0xe8, 0x0e, 0x36, 0x07, 0x60, 0xfe, 0xf6, 0xf5, 0x04, 0xef, 0xc8, 0xe9, 0x1a, 0xe6, 0xbb, 0xe3,
+0x37, 0xe3, 0x3e, 0xe5, 0xa6, 0xea, 0x44, 0xf3, 0xac, 0xfe, 0x8a, 0x0b, 0x94, 0x18, 0x59, 0x23,
+0xfb, 0x29, 0xcf, 0x2a, 0x29, 0x25, 0xea, 0x19, 0x62, 0x0a, 0x38, 0xf9, 0xa2, 0xe8, 0xcf, 0xda,
+0xd3, 0xd0, 0xd7, 0xcb, 0x25, 0xcc, 0x0b, 0xd2, 0x15, 0xdd, 0x56, 0xec, 0xb0, 0xfe, 0x7a, 0x12,
+0x65, 0x25, 0x4b, 0x35, 0x27, 0x3f, 0xe5, 0x40, 0x2f, 0x39, 0x9b, 0x28, 0x8c, 0x11, 0x6a, 0xf7,
+0x5d, 0xde, 0xb7, 0xc9, 0x5d, 0xbc, 0xef, 0xb6, 0xdd, 0xb9, 0xdd, 0xc3, 0x2b, 0xd4, 0x58, 0xe9,
+0x82, 0x01, 0xda, 0x1a, 0xd7, 0x32, 0x6b, 0x46, 0x1b, 0x52, 0xf5, 0x52, 0x57, 0x47, 0x61, 0x30,
+0x8a, 0x11, 0xbc, 0xef, 0xbd, 0xd0, 0xe9, 0xb8, 0xe8, 0xaa, 0x66, 0xa7, 0x3b, 0xad, 0x53, 0xbb,
+0x09, 0xd0, 0x06, 0xea, 0x5a, 0x07, 0xb7, 0x25, 0xe1, 0x41, 0xe0, 0x57, 0x50, 0x63, 0x9a, 0x60,
+0x39, 0x4f, 0x1b, 0x31, 0x8c, 0x0b, 0xd8, 0xe4, 0x01, 0xc3, 0xb6, 0xaa, 0xf0, 0x9d, 0x96, 0x9c,
+0x5a, 0xa5, 0x19, 0xb7, 0x31, 0xd0, 0xf4, 0xee, 0xf6, 0x10, 0x15, 0x33, 0x5b, 0x51, 0xaa, 0x66,
+0xb6, 0x6e, 0xd4, 0x66, 0x6d, 0x4f, 0x55, 0x2c, 0x5e, 0x03, 0x07, 0xdb, 0x1b, 0xb9, 0xd8, 0xa1,
+0xa0, 0x96, 0x42, 0x97, 0x9c, 0xa2, 0x87, 0xb7, 0x83, 0xd4, 0x2e, 0xf7, 0x75, 0x1c, 0x03, 0x40,
+0x14, 0x5d, 0xfa, 0x6e, 0xe8, 0x71, 0xae, 0x64, 0x5d, 0x49, 0x4d, 0x24, 0x08, 0xfb, 0x93, 0xd3,
+0x0f, 0xb3, 0x2a, 0x9d, 0x9a, 0x93, 0x52, 0x96, 0xb0, 0xa4, 0x61, 0xbd, 0x41, 0xde, 0xd4, 0x03,
+0xaf, 0x29, 0x0b, 0x4b, 0x78, 0x63, 0x54, 0x6f, 0xca, 0x6c, 0x48, 0x5c, 0x0b, 0x40, 0x26, 0x1c,
+0x0c, 0xf5, 0xcb, 0xcf, 0x41, 0xb1, 0x5e, 0x9d, 0xf6, 0x95, 0x9e, 0x9b, 0x65, 0xad, 0x57, 0xc9,
+0x16, 0xec, 0xd8, 0x10, 0x15, 0x33, 0xbd, 0x4e, 0xb8, 0x60, 0x32, 0x67, 0xa0, 0x61, 0x81, 0x50,
+0xdd, 0x35, 0x88, 0x14, 0x44, 0xf0, 0xf9, 0xcd, 0x81, 0xb2, 0xa2, 0xa1, 0xa4, 0x9d, 0x90, 0xa6,
+0x2b, 0xbb, 0x2b, 0xd8, 0x20, 0xf9, 0x78, 0x19, 0x4d, 0x35, 0x23, 0x4a, 0x7c, 0x56, 0xca, 0x59,
+0x5d, 0x53, 0xe7, 0x43, 0xfd, 0x2b, 0x16, 0x0e, 0xa4, 0xed, 0x49, 0xcf, 0xe9, 0xb7, 0x4f, 0xab,
+0x1e, 0xab, 0xcd, 0xb6, 0x0b, 0xcc, 0xa4, 0xe6, 0x64, 0x02, 0xa6, 0x1b, 0x05, 0x30, 0x8f, 0x3e,
+0xd7, 0x46, 0x67, 0x48, 0xe1, 0x42, 0xdb, 0x35, 0xe9, 0x21, 0x9e, 0x08, 0x82, 0xed, 0xbd, 0xd4,
+0xf7, 0xc2, 0x05, 0xbb, 0xf7, 0xbd, 0x5f, 0xca, 0xd9, 0xdc, 0x04, 0xf2, 0x2c, 0x06, 0x66, 0x17,
+0xa1, 0x24, 0xe1, 0x2d, 0x35, 0x33, 0x5d, 0x34, 0xa3, 0x30, 0x65, 0x27, 0xc4, 0x18, 0xf2, 0x05,
+0xdc, 0xf1, 0x1f, 0xe0, 0x17, 0xd4, 0x3d, 0xd0, 0x1f, 0xd4, 0x05, 0xde, 0xee, 0xea, 0x2c, 0xf8,
+0x06, 0x04, 0x9c, 0x0d, 0xd6, 0x14, 0x00, 0x1a, 0x8d, 0x1d, 0x2b, 0x1f, 0x5b, 0x1e, 0x26, 0x1a,
+0x38, 0x12, 0x9a, 0x07, 0xe2, 0xfb, 0xa4, 0xf1, 0xf4, 0xea, 0xbc, 0xe8, 0xaa, 0xea, 0x14, 0xef,
+0x4e, 0xf4, 0x1a, 0xf9, 0xee, 0xfc, 0x6c, 0xff, 0x58, 0x01, 0x24, 0x03, 0xae, 0x05, 0x1a, 0x09,
+0xa8, 0x0c, 0x86, 0x0f, 0xa2, 0x10, 0x88, 0x0f, 0x96, 0x0c, 0x96, 0x08, 0x72, 0x04, 0x12, 0x01,
+0x34, 0xfe, 0x86, 0xfb, 0xc6, 0xf8, 0xb6, 0xf5, 0x3e, 0xf2, 0xf2, 0xee, 0x44, 0xec, 0xce, 0xeb,
+0x96, 0xee, 0x42, 0xf5, 0x3e, 0xff, 0xd6, 0x0a, 0xb2, 0x15, 0xc5, 0x1d, 0x6b, 0x21, 0xb7, 0x20,
+0x77, 0x1c, 0x8e, 0x15, 0x2a, 0x0d, 0xd0, 0x03, 0xfa, 0xf9, 0xd4, 0xef, 0xee, 0xe5, 0xdd, 0xdc,
+0xab, 0xd6, 0x09, 0xd5, 0xe5, 0xd9, 0xba, 0xe5, 0x4c, 0xf7, 0xc6, 0x0b, 0x51, 0x1f, 0x0d, 0x2e,
+0xe9, 0x35, 0x7b, 0x36, 0xc9, 0x30, 0x79, 0x26, 0xfc, 0x18, 0x5c, 0x09, 0x8a, 0xf8, 0x3a, 0xe7,
+0x81, 0xd6, 0xd7, 0xc8, 0x4b, 0xc0, 0x13, 0xc0, 0x45, 0xc9, 0x47, 0xdc, 0x20, 0xf6, 0xde, 0x12,
+0xeb, 0x2c, 0x15, 0x40, 0xed, 0x49, 0x19, 0x4a, 0x41, 0x42, 0xd3, 0x33, 0x11, 0x21, 0x0c, 0x0b,
+0x2e, 0xf3, 0x11, 0xdb, 0x2f, 0xc5, 0x9b, 0xb4, 0xcd, 0xac, 0x0f, 0xb0, 0x77, 0xbf, 0x93, 0xd9,
+0xa4, 0xfa, 0xcf, 0x1c, 0x9f, 0x3a, 0x83, 0x4f, 0x7c, 0x59, 0x8c, 0x58, 0xbf, 0x4d, 0x67, 0x3b,
+0xfb, 0x22, 0xb0, 0x06, 0x46, 0xe8, 0x09, 0xcb, 0x53, 0xb2, 0x76, 0xa2, 0x18, 0x9e, 0xde, 0xa6,
+0x7d, 0xbc, 0x03, 0xdc, 0x3e, 0x01, 0x3b, 0x26, 0xb9, 0x45, 0xba, 0x5b, 0x22, 0x66, 0x40, 0x64,
+0xfe, 0x56, 0x35, 0x40, 0xf7, 0x21, 0x4a, 0xff, 0x79, 0xdb, 0x2d, 0xbb, 0xfa, 0xa2, 0x34, 0x96,
+0xe6, 0x96, 0x0e, 0xa5, 0xfb, 0xbe, 0xb1, 0xe1, 0x9a, 0x08, 0x95, 0x2e, 0xb9, 0x4e, 0xfc, 0x64,
+0x72, 0x6e, 0x48, 0x6a, 0xfa, 0x58, 0xb1, 0x3c, 0x14, 0x19, 0x00, 0xf2, 0xab, 0xcc, 0xcf, 0xad,
+0x92, 0x99, 0x00, 0x92, 0xa2, 0x97, 0x50, 0xa9, 0x5b, 0xc5, 0xae, 0xe8, 0x58, 0x0f, 0x1f, 0x35,
+0xe2, 0x54, 0x6c, 0x6a, 0x14, 0x72, 0x86, 0x6a, 0xab, 0x54, 0x1d, 0x34, 0x36, 0x0d, 0xa6, 0xe5,
+0x79, 0xc2, 0xdc, 0xa7, 0xb2, 0x98, 0x6a, 0x95, 0xb4, 0x9d, 0x79, 0xb0, 0x5f, 0xcc, 0x24, 0xef,
+0x40, 0x15, 0x1d, 0x3a, 0xbc, 0x58, 0x00, 0x6c, 0x24, 0x70, 0x66, 0x64, 0xdd, 0x4a, 0xf3, 0x27,
+0x76, 0x01, 0x6f, 0xdc, 0xd5, 0xbd, 0xb4, 0xa8, 0x46, 0x9e, 0x90, 0x9e, 0x9c, 0xa8, 0xb1, 0xbb,
+0xa7, 0xd6, 0x86, 0xf7, 0xe8, 0x1a, 0xb7, 0x3c, 0x60, 0x57, 0x30, 0x66, 0x32, 0x66, 0x0e, 0x57,
+0x5f, 0x3c, 0xd6, 0x1a, 0x00, 0xf8, 0x8d, 0xd8, 0x0d, 0xc0, 0x61, 0xb0, 0xfa, 0xa9, 0x53, 0xac,
+0xab, 0xb6, 0xd9, 0xc8, 0x6f, 0xe1, 0xf6, 0xfe, 0x1b, 0x1e, 0xa9, 0x3a, 0xe7, 0x4f, 0x92, 0x59,
+0xe6, 0x55, 0xf1, 0x45, 0x3f, 0x2d, 0x92, 0x10, 0x68, 0xf4, 0x25, 0xdc, 0xfb, 0xc9, 0x27, 0xbf,
+0x35, 0xbb, 0x21, 0xbe, 0x9d, 0xc7, 0x1f, 0xd7, 0x04, 0xec, 0x3e, 0x04, 0x4f, 0x1d, 0x39, 0x33,
+0x61, 0x42, 0x9f, 0x47, 0x63, 0x42, 0x0b, 0x34, 0xe1, 0x1f, 0xba, 0x09, 0xa4, 0xf4, 0x3b, 0xe3,
+0xa9, 0xd6, 0x99, 0xcf, 0xf3, 0xcd, 0x57, 0xd1, 0x51, 0xd9, 0x5e, 0xe5, 0x60, 0xf4, 0xf2, 0x04,
+0x40, 0x15, 0x0d, 0x23, 0x49, 0x2c, 0x71, 0x2f, 0xf9, 0x2b, 0x0f, 0x23, 0x68, 0x16, 0x4a, 0x08,
+0x02, 0xfb, 0xf2, 0xef, 0x22, 0xe8, 0x50, 0xe4, 0x28, 0xe4, 0xfc, 0xe6, 0xd6, 0xeb, 0xb6, 0xf1,
+0x52, 0xf8, 0x8e, 0xff, 0x02, 0x07, 0x82, 0x0e, 0xe0, 0x14, 0x8a, 0x18, 0xd4, 0x18, 0xb4, 0x15,
+0xf6, 0x0f, 0x2e, 0x09, 0xf4, 0x02, 0x4a, 0xfe, 0xc6, 0xfb, 0xe6, 0xfa, 0x34, 0xfb, 0x46, 0xfb,
+0x3c, 0xfa, 0xf8, 0xf7, 0x52, 0xf5, 0x76, 0xf3, 0xb4, 0xf3, 0xa0, 0xf6, 0xa6, 0xfb, 0xb2, 0x01,
+0xe0, 0x06, 0x9c, 0x0a, 0xcc, 0x0c, 0x3c, 0x0e, 0x96, 0x0f, 0x22, 0x11, 0x8c, 0x12, 0x08, 0x13,
+0x30, 0x11, 0xde, 0x0b, 0xce, 0x02, 0x28, 0xf7, 0x28, 0xeb, 0x9d, 0xe1, 0xaf, 0xdc, 0xc9, 0xdd,
+0x3a, 0xe4, 0x22, 0xee, 0x68, 0xf9, 0x2e, 0x04, 0x34, 0x0e, 0x38, 0x17, 0x67, 0x1f, 0xdb, 0x25,
+0xab, 0x29, 0x1b, 0x29, 0xf7, 0x22, 0xac, 0x16, 0x22, 0x05, 0x2c, 0xf1, 0xd3, 0xdd, 0xe7, 0xce,
+0x0b, 0xc7, 0x81, 0xc7, 0xb5, 0xcf, 0x95, 0xdd, 0xb4, 0xee, 0x08, 0x01, 0x7c, 0x13, 0x75, 0x24,
+0xc9, 0x32, 0x71, 0x3c, 0xb7, 0x3f, 0x79, 0x3b, 0xfb, 0x2e, 0x48, 0x1b, 0x84, 0x02, 0x22, 0xe8,
+0xdb, 0xcf, 0x71, 0xbd, 0xb1, 0xb3, 0x1f, 0xb4, 0x6b, 0xbe, 0xbf, 0xd0, 0xaa, 0xe8, 0x58, 0x03,
+0xc7, 0x1d, 0x6d, 0x35, 0x31, 0x47, 0x21, 0x51, 0x95, 0x51, 0x21, 0x48, 0x8f, 0x35, 0xbc, 0x1b,
+0xa4, 0xfd, 0xab, 0xde, 0xe9, 0xc2, 0xd3, 0xad, 0x24, 0xa3, 0x5a, 0xa4, 0xd9, 0xb1, 0xfb, 0xc9,
+0x52, 0xe9, 0xb8, 0x0b, 0x75, 0x2c, 0x49, 0x47, 0x0e, 0x59, 0x10, 0x60, 0xc0, 0x5b, 0x0b, 0x4d,
+0xad, 0x35, 0xe0, 0x17, 0x82, 0xf6, 0xd1, 0xd4, 0x9d, 0xb6, 0x5c, 0xa0, 0xb0, 0x95, 0x5c, 0x99,
+0x8f, 0xab, 0x13, 0xca, 0x38, 0xf0, 0xf2, 0x17, 0x67, 0x3b, 0x26, 0x56, 0x8a, 0x65, 0x94, 0x68,
+0x08, 0x60, 0x5d, 0x4d, 0xcb, 0x32, 0xa0, 0x12, 0x1e, 0xef, 0x91, 0xcb, 0x1d, 0xac, 0xbe, 0x95,
+0x16, 0x8d, 0xdc, 0x94, 0xcb, 0xac, 0x5d, 0xd1, 0xf0, 0xfb, 0x37, 0x25, 0x5b, 0x47, 0xb0, 0x5e,
+0xf4, 0x69, 0x60, 0x69, 0x16, 0x5e, 0xa5, 0x49, 0xcd, 0x2d, 0xf2, 0x0b, 0xe8, 0xe6, 0x55, 0xc2,
+0x7c, 0xa3, 0xbe, 0x8f, 0x58, 0x8b, 0x2a, 0x98, 0x95, 0xb4, 0xaf, 0xdb, 0x5e, 0x06, 0xe3, 0x2d,
+0xfd, 0x4c, 0x26, 0x61, 0x68, 0x69, 0x1c, 0x66, 0x96, 0x58, 0x4b, 0x42, 0xd9, 0x24, 0x56, 0x02,
+0x87, 0xdd, 0xf5, 0xba, 0xb0, 0x9f, 0xc0, 0x90, 0x64, 0x91, 0x5a, 0xa2, 0xdb, 0xc0, 0x6a, 0xe7,
+0x4e, 0x0f, 0x45, 0x32, 0xb9, 0x4c, 0x7a, 0x5c, 0x70, 0x61, 0xe2, 0x5b, 0xf5, 0x4c, 0x19, 0x36,
+0xfa, 0x18, 0xde, 0xf7, 0x25, 0xd6, 0x5b, 0xb8, 0x14, 0xa3, 0x0e, 0x9a, 0x06, 0x9f, 0x59, 0xb1,
+0x41, 0xce, 0x98, 0xf0, 0xf8, 0x12, 0xaf, 0x30, 0xab, 0x46, 0x75, 0x53, 0x4e, 0x56, 0x93, 0x4f,
+0x17, 0x40, 0x9b, 0x29, 0x14, 0x0e, 0x78, 0xf0, 0x47, 0xd4, 0x47, 0xbd, 0xb9, 0xae, 0x44, 0xaa,
+0xb1, 0xb0, 0x21, 0xc1, 0x51, 0xd9, 0xb4, 0xf5, 0xec, 0x11, 0x47, 0x2a, 0x09, 0x3c, 0xa9, 0x45,
+0x61, 0x46, 0xb1, 0x3e, 0xb3, 0x2f, 0x6c, 0x1b, 0x7e, 0x04, 0x82, 0xed, 0x61, 0xd9, 0xeb, 0xc9,
+0x95, 0xc0, 0x17, 0xbe, 0x05, 0xc3, 0x55, 0xcf, 0xd1, 0xe1, 0xdc, 0xf7, 0x1c, 0x0e, 0x39, 0x21,
+0x97, 0x2e, 0xc5, 0x34, 0x77, 0x33, 0x73, 0x2b, 0xa9, 0x1e, 0x42, 0x0f, 0xa4, 0xff, 0xa2, 0xf1,
+0x10, 0xe6, 0x35, 0xdd, 0x31, 0xd7, 0x97, 0xd4, 0x69, 0xd6, 0x69, 0xdd, 0x1a, 0xe9, 0xf2, 0xf7,
+0x44, 0x07, 0x38, 0x14, 0xa3, 0x1c, 0x69, 0x1f, 0xfd, 0x1c, 0xea, 0x16, 0x26, 0x0f, 0x86, 0x07,
+0x06, 0x01, 0xb2, 0xfb, 0x10, 0xf7, 0xa2, 0xf2, 0xa0, 0xee, 0x0e, 0xec, 0xba, 0xeb, 0xec, 0xed,
+0xea, 0xf1, 0x6c, 0xf6, 0x58, 0xfa, 0x1c, 0xfd, 0x98, 0xfe, 0x3e, 0xff, 0x68, 0xff, 0x2e, 0xff,
+0xc4, 0xfe, 0x1e, 0xfe, 0x96, 0xfd, 0x34, 0xfd, 0x04, 0xfd, 0xda, 0xfc, 0xc4, 0xfc, 0xa6, 0xfc,
+0x8e, 0xfc, 0x76, 0xfc, 0x42, 0xfc, 0x2a, 0xfc, 0x34, 0xfc, 0x54, 0xfc, 0x88, 0xfc, 0xb8, 0xfc,
+0xda, 0xfc, 0x16, 0xfd, 0x4c, 0xfd, 0x78, 0xfd, 0x9e, 0xfd, 0xb4, 0xfd, 0xbc, 0xfd, 0xc8, 0xfd,
+0xcc, 0xfd, 0xe8, 0xfd, 0xf0, 0xfd, 0xe2, 0xfd, 0xd6, 0xfd, 0xce, 0xfd, 0xfc, 0xfd, 0x14, 0xfe,
+0x12, 0xfe, 0xf2, 0xfd, 0xda, 0xfd, 0xc2, 0xfd, 0xb4, 0xfd, 0xb2, 0xfd, 0xc4, 0xfd, 0xfa, 0xfd,
+0x2e, 0xfe, 0x56, 0xfe, 0x7c, 0xfe, 0x9a, 0xfe, 0xae, 0xfe, 0xb6, 0xfe, 0xa0, 0xfe, 0x76, 0xfe,
+0x3c, 0xfe, 0xfe, 0xfd, 0xf4, 0xfd, 0x26, 0xfe, 0x78, 0xfe, 0xdc, 0xfe, 0xfc, 0xfe, 0xfc, 0xfe,
+0xfa, 0xfe, 0x04, 0xff, 0x28, 0xff, 0x30, 0xff, 0x18, 0xff, 0xe4, 0xfe, 0xc2, 0xfe, 0xb4, 0xfe,
+0xbe, 0xfe, 0xda, 0xfe, 0xe8, 0xfe, 0xe6, 0xfe, 0xe2, 0xfe, 0xee, 0xfe, 0x1e, 0xff, 0x70, 0xff,
+0xc2, 0xff, 0x04, 0x00, 0x44, 0x00, 0x84, 0x00, 0xa2, 0x00, 0x8c, 0x00, 0x5c, 0x00, 0x14, 0x00,
+0xc8, 0xff, 0x72, 0xff, 0x1a, 0xff, 0xe0, 0xfe, 0xca, 0xfe, 0xc4, 0xfe, 0xd6, 0xfe, 0x00, 0xff,
+0x50, 0xff, 0xba, 0xff, 0x28, 0x00, 0x84, 0x00, 0xc4, 0x00, 0xdc, 0x00, 0xd0, 0x00, 0xb0, 0x00,
+0x82, 0x00, 0x58, 0x00, 0x26, 0x00, 0xde, 0xff, 0x76, 0xff, 0x1c, 0xff, 0xde, 0xfe, 0xd6, 0xfe,
+0xee, 0xfe, 0x1e, 0xff, 0x64, 0xff, 0xb0, 0xff, 0xf8, 0xff, 0x36, 0x00, 0x6e, 0x00, 0x9a, 0x00,
+0xc0, 0x00, 0xbe, 0x00, 0x96, 0x00, 0x66, 0x00, 0x40, 0x00, 0x20, 0x00, 0x0c, 0x00, 0xfc, 0xff,
+0xf0, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0x08, 0x00, 0x38, 0x00, 0x74, 0x00, 0xa8, 0x00, 0xcc, 0x00,
+0xec, 0x00, 0xfc, 0x00, 0xee, 0x00, 0xbc, 0x00, 0x6c, 0x00, 0x22, 0x00, 0xec, 0xff, 0xc8, 0xff,
+0xb6, 0xff, 0xb6, 0xff, 0xb0, 0xff, 0xb8, 0xff, 0xc6, 0xff, 0xe8, 0xff, 0x24, 0x00, 0x74, 0x00,
+0xbc, 0x00, 0xe8, 0x00, 0x10, 0x01, 0x24, 0x01, 0x24, 0x01, 0xf8, 0x00, 0xb6, 0x00, 0x68, 0x00,
+0x24, 0x00, 0xee, 0xff, 0xcc, 0xff, 0xd4, 0xff, 0xf2, 0xff, 0x24, 0x00, 0x4e, 0x00, 0x70, 0x00,
+0xae, 0x00, 0xf0, 0x00, 0x36, 0x01, 0x64, 0x01, 0x7a, 0x01, 0x70, 0x01, 0x3e, 0x01, 0xf6, 0x00,
+0x92, 0x00, 0x38, 0x00, 0xfe, 0xff, 0xd2, 0xff, 0xb2, 0xff, 0xb8, 0xff, 0xd2, 0xff, 0xf4, 0xff,
+0x0e, 0x00, 0x38, 0x00, 0x7a, 0x00, 0xb8, 0x00, 0xea, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xee, 0x00,
+0xe8, 0x00, 0xcc, 0x00, 0x90, 0x00, 0x72, 0x00, 0x56, 0x00, 0x46, 0x00, 0x36, 0x00, 0x20, 0x00,
+0x10, 0x00, 0x08, 0x00, 0x16, 0x00, 0x4c, 0x00, 0x92, 0x00, 0xda, 0x00, 0x04, 0x01, 0xfe, 0x00,
+0xf8, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xd6, 0x00, 0x94, 0x00, 0x58, 0x00, 0x44, 0x00, 0x54, 0x00,
+0x7e, 0x00, 0x88, 0x00, 0x7a, 0x00, 0x5c, 0x00, 0x42, 0x00, 0x44, 0x00, 0x5a, 0x00, 0x8a, 0x00,
+0xa8, 0x00, 0x9a, 0x00, 0x8a, 0x00, 0x94, 0x00, 0xa6, 0x00, 0xa8, 0x00, 0x98, 0x00, 0x96, 0x00,
+0x9c, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x8e, 0x00, 0x84, 0x00, 0x7e, 0x00, 0x76, 0x00, 0x70, 0x00,
+0x60, 0x00, 0x72, 0x00, 0x84, 0x00, 0xa0, 0x00, 0xc0, 0x00, 0xe6, 0x00, 0xee, 0x00, 0xd4, 0x00,
+0xa8, 0x00, 0x8e, 0x00, 0x98, 0x00, 0xa8, 0x00, 0xac, 0x00, 0xb2, 0x00, 0xae, 0x00, 0xb4, 0x00,
+0xbe, 0x00, 0xc8, 0x00, 0xd4, 0x00, 0xca, 0x00, 0xb6, 0x00, 0x90, 0x00, 0x70, 0x00, 0x68, 0x00,
+0x7e, 0x00, 0x92, 0x00, 0xa0, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xb2, 0x00, 0xb0, 0x00, 0xc6, 0x00,
+0xc8, 0x00, 0xcc, 0x00, 0xc2, 0x00, 0xa2, 0x00, 0x8e, 0x00, 0x7a, 0x00, 0x7c, 0x00, 0x72, 0x00,
+0x5a, 0x00, 0x54, 0x00, 0x52, 0x00, 0x50, 0x00, 0x52, 0x00, 0x5c, 0x00, 0x84, 0x00, 0xb4, 0x00,
+0xd4, 0x00, 0xe4, 0x00, 0xda, 0x00, 0xbe, 0x00, 0x9c, 0x00, 0x60, 0x00, 0x3e, 0x00, 0x30, 0x00,
+0x2a, 0x00, 0x3a, 0x00, 0x50, 0x00, 0x6c, 0x00, 0x9e, 0x00, 0xc2, 0x00, 0xd6, 0x00, 0xe0, 0x00,
+0xe6, 0x00, 0xee, 0x00, 0xe4, 0x00, 0xd2, 0x00, 0xba, 0x00, 0xa0, 0x00, 0x80, 0x00, 0x48, 0x00,
+0x1c, 0x00, 0xf8, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0x38, 0x00, 0x78, 0x00, 0xba, 0x00,
+0xf4, 0x00, 0x04, 0x01, 0x08, 0x01, 0xe2, 0x00, 0xac, 0x00, 0x68, 0x00, 0x42, 0x00, 0x20, 0x00,
+0x06, 0x00, 0xec, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xd6, 0xff, 0xee, 0xff, 0x10, 0x00, 0x42, 0x00,
+0x8a, 0x00, 0xc4, 0x00, 0xfe, 0x00, 0x0e, 0x01, 0x16, 0x01, 0x0a, 0x01, 0xe2, 0x00, 0xb0, 0x00,
+0x74, 0x00, 0x44, 0x00, 0x02, 0x00, 0xbe, 0xff, 0x94, 0xff, 0x84, 0xff, 0xa6, 0xff, 0xe4, 0xff,
+0x24, 0x00, 0x60, 0x00, 0xa0, 0x00, 0xc8, 0x00, 0xf0, 0x00, 0x08, 0x01, 0x1e, 0x01, 0x16, 0x01,
+0xdc, 0x00, 0x98, 0x00, 0x58, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xaa, 0xff, 0x8c, 0xff,
+0x88, 0xff, 0xa8, 0xff, 0xe0, 0xff, 0x32, 0x00, 0x7a, 0x00, 0xc4, 0x00, 0xfc, 0x00, 0x2c, 0x01,
+0x2e, 0x01, 0x1a, 0x01, 0xf0, 0x00, 0xa0, 0x00, 0x54, 0x00, 0x18, 0x00, 0xd0, 0xff, 0x90, 0xff,
+0x6a, 0xff, 0x6e, 0xff, 0x90, 0xff, 0xc4, 0xff, 0x0a, 0x00, 0x44, 0x00, 0x7e, 0x00, 0xc8, 0x00,
+0x06, 0x01, 0x30, 0x01, 0x22, 0x01, 0xf4, 0x00, 0xb4, 0x00, 0x62, 0x00, 0x2c, 0x00, 0x02, 0x00,
+0xda, 0xff, 0xa8, 0xff, 0x8e, 0xff, 0x94, 0xff, 0xc2, 0xff, 0xf2, 0xff, 0x28, 0x00, 0x50, 0x00,
+0x6c, 0x00, 0xa6, 0x00, 0xd8, 0x00, 0xee, 0x00, 0xf2, 0x00, 0xd0, 0x00, 0x9c, 0x00, 0x52, 0x00,
+0x1c, 0x00, 0xf2, 0xff, 0xbc, 0xff, 0xa8, 0xff, 0x92, 0xff, 0x9c, 0xff, 0xc4, 0xff, 0xec, 0xff,
+0x22, 0x00, 0x4a, 0x00, 0x80, 0x00, 0xa8, 0x00, 0xbe, 0x00, 0xc6, 0x00, 0xba, 0x00, 0xa0, 0x00,
+0x7e, 0x00, 0x4a, 0x00, 0x1a, 0x00, 0xf2, 0xff, 0xda, 0xff, 0xc4, 0xff, 0xcc, 0xff, 0xe2, 0xff,
+0xe6, 0xff, 0x06, 0x00, 0x30, 0x00, 0x4e, 0x00, 0x7e, 0x00, 0xa0, 0x00, 0xa6, 0x00, 0xa8, 0x00,
+0x96, 0x00, 0x82, 0x00, 0x64, 0x00, 0x3c, 0x00, 0x10, 0x00, 0xea, 0xff, 0xd4, 0xff, 0xc6, 0xff,
+0xca, 0xff, 0xc6, 0xff, 0xda, 0xff, 0xfa, 0xff, 0x14, 0x00, 0x40, 0x00, 0x60, 0x00, 0x74, 0x00,
+0x7e, 0x00, 0x82, 0x00, 0x82, 0x00, 0x74, 0x00, 0x58, 0x00, 0x2e, 0x00, 0x14, 0x00, 0xfc, 0xff,
+0xe4, 0xff, 0xf6, 0xff, 0xee, 0xff, 0xea, 0xff, 0xfc, 0xff, 0x04, 0x00, 0x18, 0x00, 0x30, 0x00,
+0x54, 0x00, 0x5c, 0x00, 0x58, 0x00, 0x6a, 0x00, 0x66, 0x00, 0x56, 0x00, 0x3a, 0x00, 0x30, 0x00,
+0x1c, 0x00, 0xfa, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0x02, 0x00,
+0x08, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x34, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x2c, 0x00,
+0x32, 0x00, 0x36, 0x00, 0x30, 0x00, 0x2e, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x2c, 0x00, 0x22, 0x00,
+0x20, 0x00, 0x12, 0x00, 0x02, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0x08, 0x00, 0x04, 0x00, 0x0a, 0x00,
+0x14, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x44, 0x00, 0x54, 0x00, 0x66, 0x00, 0x62, 0x00, 0x56, 0x00,
+0x4e, 0x00, 0x36, 0x00, 0x20, 0x00, 0x06, 0x00, 0xf2, 0xff, 0xd2, 0xff, 0xcc, 0xff, 0xd0, 0xff,
+0xd0, 0xff, 0xd4, 0xff, 0xfa, 0xff, 0x10, 0x00, 0x28, 0x00, 0x4c, 0x00, 0x66, 0x00, 0x72, 0x00,
+0x7e, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x40, 0x00, 0x1a, 0x00, 0xf6, 0xff, 0xcc, 0xff, 0xbc, 0xff,
+0xaa, 0xff, 0xa0, 0xff, 0xb2, 0xff, 0xba, 0xff, 0xe4, 0xff, 0x0a, 0x00, 0x40, 0x00, 0x6e, 0x00,
+0x88, 0x00, 0x9c, 0x00, 0x98, 0x00, 0x86, 0x00, 0x72, 0x00, 0x38, 0x00, 0x0c, 0x00, 0xd6, 0xff,
+0xa4, 0xff, 0x92, 0xff, 0x72, 0xff, 0x7c, 0xff, 0x8e, 0xff, 0xaa, 0xff, 0xdc, 0xff, 0x12, 0x00,
+0x54, 0x00, 0x80, 0x00, 0xa0, 0x00, 0xaa, 0x00, 0xa0, 0x00, 0x80, 0x00, 0x58, 0x00, 0x28, 0x00,
+0xe6, 0xff, 0xaa, 0xff, 0x82, 0xff, 0x5c, 0xff, 0x54, 0xff, 0x60, 0xff, 0x78, 0xff, 0xba, 0xff,
+0xee, 0xff, 0x22, 0x00, 0x58, 0x00, 0x8c, 0x00, 0xb4, 0x00, 0xc0, 0x00, 0xaa, 0x00, 0x82, 0x00,
+0x46, 0x00, 0x1a, 0x00, 0xda, 0xff, 0xa0, 0xff, 0x7c, 0xff, 0x50, 0xff, 0x44, 0xff, 0x58, 0xff,
+0x82, 0xff, 0xca, 0xff, 0xfe, 0xff, 0x2e, 0x00, 0x7a, 0x00, 0xa6, 0x00, 0xc2, 0x00, 0xc2, 0x00,
+0xae, 0x00, 0x7e, 0x00, 0x30, 0x00, 0x02, 0x00, 0xce, 0xff, 0x94, 0xff, 0x60, 0xff, 0x38, 0xff,
+0x3e, 0xff, 0x5c, 0xff, 0x88, 0xff, 0xd8, 0xff, 0x0c, 0x00, 0x3a, 0x00, 0x80, 0x00, 0x9e, 0x00,
+0xc4, 0x00, 0xc6, 0x00, 0xa4, 0x00, 0x78, 0x00, 0x26, 0x00, 0xf8, 0xff, 0xbe, 0xff, 0x86, 0xff,
+0x66, 0xff, 0x46, 0xff, 0x5a, 0xff, 0x6e, 0xff, 0xa6, 0xff, 0xec, 0xff, 0x24, 0x00, 0x5c, 0x00,
+0x86, 0x00, 0xb0, 0x00, 0xc8, 0x00, 0xb2, 0x00, 0x9e, 0x00, 0x62, 0x00, 0x24, 0x00, 0xf0, 0xff,
+0xc0, 0xff, 0x98, 0xff, 0x68, 0xff, 0x56, 0xff, 0x62, 0xff, 0x7c, 0xff, 0xc0, 0xff, 0xf8, 0xff,
+0x24, 0x00, 0x5a, 0x00, 0x7c, 0x00, 0x94, 0x00, 0x96, 0x00, 0x8e, 0x00, 0x74, 0x00, 0x44, 0x00,
+0x0e, 0x00, 0xd6, 0xff, 0xae, 0xff, 0x8c, 0xff, 0x7c, 0xff, 0x6e, 0xff, 0x7a, 0xff, 0xa0, 0xff,
+0xc6, 0xff, 0xf8, 0xff, 0x20, 0x00, 0x4a, 0x00, 0x72, 0x00, 0x84, 0x00, 0x7c, 0x00, 0x64, 0x00,
+0x54, 0x00, 0x22, 0x00, 0xfe, 0xff, 0xde, 0xff, 0xa6, 0xff, 0xa0, 0xff, 0x8c, 0xff, 0x90, 0xff,
+0x9e, 0xff, 0xbe, 0xff, 0xe4, 0xff, 0x00, 0x00, 0x24, 0x00, 0x36, 0x00, 0x4a, 0x00, 0x54, 0x00,
+0x54, 0x00, 0x42, 0x00, 0x24, 0x00, 0x0c, 0x00, 0xec, 0xff, 0xda, 0xff, 0xb8, 0xff, 0xb4, 0xff,
+0xa0, 0xff, 0xa8, 0xff, 0xb4, 0xff, 0xca, 0xff, 0xe8, 0xff, 0xf2, 0xff, 0x00, 0x00, 0x10, 0x00,
+0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x24, 0x00, 0x12, 0x00, 0x0a, 0x00, 0xf6, 0xff, 0xe8, 0xff,
+0xd4, 0xff, 0xd8, 0xff, 0xd4, 0xff, 0xca, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xea, 0xff, 0xf2, 0xff,
+0xf8, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x04, 0x00, 0x06, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00,
+0x04, 0x00, 0x02, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xe6, 0xff,
+0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xd2, 0xff, 0xea, 0xff, 0xf6, 0xff,
+0x00, 0x00, 0xfe, 0xff, 0x14, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x18, 0x00, 0x16, 0x00, 0x0c, 0x00,
+0x02, 0x00, 0xfe, 0xff, 0xe0, 0xff, 0xcc, 0xff, 0xb8, 0xff, 0xca, 0xff, 0xd2, 0xff, 0xd2, 0xff,
+0xde, 0xff, 0xf4, 0xff, 0x0c, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x3c, 0x00,
+0x48, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0xec, 0xff, 0xda, 0xff, 0xae, 0xff, 0xac, 0xff, 0xa8, 0xff,
+0xb2, 0xff, 0xb6, 0xff, 0xc0, 0xff, 0xf6, 0xff, 0x06, 0x00, 0x32, 0x00, 0x4e, 0x00, 0x60, 0x00,
+0x58, 0x00, 0x5c, 0x00, 0x48, 0x00, 0x26, 0x00, 0x04, 0x00, 0xe6, 0xff, 0xb4, 0xff, 0x90, 0xff,
+0x80, 0xff, 0x70, 0xff, 0x8a, 0xff, 0x94, 0xff, 0xbc, 0xff, 0xf6, 0xff, 0x10, 0x00, 0x3c, 0x00,
+0x60, 0x00, 0x72, 0x00, 0x86, 0x00, 0x80, 0x00, 0x60, 0x00, 0x26, 0x00, 0xfa, 0xff, 0xd4, 0xff,
+0x9c, 0xff, 0x7e, 0xff, 0x5e, 0xff, 0x56, 0xff, 0x68, 0xff, 0x8c, 0xff, 0xba, 0xff, 0xe2, 0xff,
+0x1a, 0x00, 0x4a, 0x00, 0x76, 0x00, 0x94, 0x00, 0x98, 0x00, 0x92, 0x00, 0x54, 0x00, 0x26, 0x00,
+0xf2, 0xff, 0xae, 0xff, 0x7c, 0xff, 0x52, 0xff, 0x3c, 0xff, 0x32, 0xff, 0x46, 0xff, 0x78, 0xff,
+0xba, 0xff, 0xe2, 0xff, 0x1a, 0x00, 0x5c, 0x00, 0x8a, 0x00, 0xa2, 0x00, 0xa8, 0x00, 0x88, 0x00,
+0x58, 0x00, 0x18, 0x00, 0xea, 0xff, 0xb0, 0xff, 0x6c, 0xff, 0x46, 0xff, 0x24, 0xff, 0x38, 0xff,
+0x58, 0xff, 0x7c, 0xff, 0xbe, 0xff, 0xfa, 0xff, 0x32, 0x00, 0x76, 0x00, 0x9c, 0x00, 0xb8, 0x00,
+0xa8, 0x00, 0x82, 0x00, 0x48, 0x00, 0x0a, 0x00, 0xe0, 0xff, 0x94, 0xff, 0x62, 0xff, 0x42, 0xff,
+0x2e, 0xff, 0x40, 0xff, 0x5c, 0xff, 0x90, 0xff, 0xd6, 0xff, 0x04, 0x00, 0x46, 0x00, 0x7e, 0x00,
+0xa6, 0x00, 0xb8, 0x00, 0x9c, 0x00, 0x70, 0x00, 0x3a, 0x00, 0xfa, 0xff, 0xc0, 0xff, 0x8e, 0xff,
+0x5a, 0xff, 0x44, 0xff, 0x3a, 0xff, 0x52, 0xff, 0x76, 0xff, 0xae, 0xff, 0xee, 0xff, 0x18, 0x00,
+0x58, 0x00, 0x8e, 0x00, 0x9c, 0x00, 0xa8, 0x00, 0x92, 0x00, 0x62, 0x00, 0x30, 0x00, 0xf4, 0xff,
+0xc4, 0xff, 0x8a, 0xff, 0x62, 0xff, 0x4a, 0xff, 0x50, 0xff, 0x62, 0xff, 0x92, 0xff, 0xc2, 0xff,
+0xf4, 0xff, 0x28, 0x00, 0x56, 0x00, 0x78, 0x00, 0x84, 0x00, 0x88, 0x00, 0x72, 0x00, 0x46, 0x00,
+0x08, 0x00, 0xe4, 0xff, 0xbc, 0xff, 0x92, 0xff, 0x72, 0xff, 0x70, 0xff, 0x6c, 0xff, 0x70, 0xff,
+0x90, 0xff, 0xce, 0xff, 0xf8, 0xff, 0x24, 0x00, 0x4e, 0x00, 0x62, 0x00, 0x64, 0x00, 0x54, 0x00,
+0x4c, 0x00, 0x2e, 0x00, 0x06, 0x00, 0xe2, 0xff, 0xb8, 0xff, 0x9a, 0xff, 0x8e, 0xff, 0x92, 0xff,
+0x92, 0xff, 0x9c, 0xff, 0xc0, 0xff, 0xde, 0xff, 0xf4, 0xff, 0x24, 0x00, 0x38, 0x00, 0x3a, 0x00,
+0x40, 0x00, 0x3e, 0x00, 0x2a, 0x00, 0x0e, 0x00, 0xf4, 0xff, 0xdc, 0xff, 0xc4, 0xff, 0xb2, 0xff,
+0xb8, 0xff, 0xb0, 0xff, 0xae, 0xff, 0xc2, 0xff, 0xd2, 0xff, 0xea, 0xff, 0xfa, 0xff, 0x04, 0x00,
+0x18, 0x00, 0x14, 0x00, 0x16, 0x00, 0x12, 0x00, 0x08, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xea, 0xff,
+0xde, 0xff, 0xc6, 0xff, 0xd2, 0xff, 0xc4, 0xff, 0xbe, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xde, 0xff,
+0xe0, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfc, 0xff,
+0x08, 0x00, 0x04, 0x00, 0xfc, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe8, 0xff,
+0xde, 0xff, 0xd4, 0xff, 0xd0, 0xff, 0xce, 0xff, 0xdc, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xe8, 0xff,
+0xf2, 0xff, 0x08, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x1a, 0x00,
+0xfe, 0xff, 0xf0, 0xff, 0xd2, 0xff, 0xc8, 0xff, 0xb8, 0xff, 0xa8, 0xff, 0xae, 0xff, 0xac, 0xff,
+0xb4, 0xff, 0xd0, 0xff, 0xf2, 0xff, 0x0a, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x44, 0x00, 0x4c, 0x00,
+0x38, 0x00, 0x36, 0x00, 0x18, 0x00, 0xf2, 0xff, 0xce, 0xff, 0xb0, 0xff, 0x94, 0xff, 0x8c, 0xff,
+0x7c, 0xff, 0x96, 0xff, 0xa0, 0xff, 0xce, 0xff, 0xfe, 0xff, 0x24, 0x00, 0x5a, 0x00, 0x68, 0x00,
+0x72, 0x00, 0x76, 0x00, 0x6a, 0x00, 0x50, 0x00, 0x2e, 0x00, 0xf0, 0xff, 0xca, 0xff, 0x96, 0xff,
+0x6c, 0xff, 0x5e, 0xff, 0x5a, 0xff, 0x70, 0xff, 0x98, 0xff, 0xca, 0xff, 0xfe, 0xff, 0x28, 0x00,
+0x68, 0x00, 0x8c, 0x00, 0x94, 0x00, 0x9c, 0x00, 0x7a, 0x00, 0x4a, 0x00, 0x24, 0x00, 0xe2, 0xff,
+0xac, 0xff, 0x7a, 0xff, 0x52, 0xff, 0x3a, 0xff, 0x40, 0xff, 0x5e, 0xff, 0x9c, 0xff, 0xd2, 0xff,
+0x06, 0x00, 0x46, 0x00, 0x70, 0x00, 0x98, 0x00, 0xa8, 0x00, 0x9e, 0x00, 0x7a, 0x00, 0x44, 0x00,
+0x0c, 0x00, 0xdc, 0xff, 0x98, 0xff, 0x58, 0xff, 0x38, 0xff, 0x30, 0xff, 0x46, 0xff, 0x6a, 0xff,
+0xac, 0xff, 0xe2, 0xff, 0x0c, 0x00, 0x54, 0x00, 0x7e, 0x00, 0x96, 0x00, 0xa6, 0x00, 0x82, 0x00,
+0x5e, 0x00, 0x28, 0x00, 0xe6, 0xff, 0xb6, 0xff, 0x76, 0xff, 0x40, 0xff, 0x2a, 0xff, 0x20, 0xff,
+0x36, 0xff, 0x72, 0xff, 0xba, 0xff, 0xf4, 0xff, 0x16, 0x00, 0x4a, 0x00, 0x7c, 0x00, 0x92, 0x00,
+0x92, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x00, 0x00, 0xce, 0xff, 0xa4, 0xff, 0x66, 0xff, 0x3e, 0xff,
+0x26, 0xff, 0x2e, 0xff, 0x58, 0xff, 0x88, 0xff, 0xc8, 0xff, 0xfe, 0xff, 0x2c, 0x00, 0x58, 0x00,
+0x88, 0x00, 0x94, 0x00, 0x7e, 0x00, 0x68, 0x00, 0x3c, 0x00, 0x06, 0x00, 0xc2, 0xff, 0x94, 0xff,
+0x5c, 0xff, 0x38, 0xff, 0x2e, 0xff, 0x40, 0xff, 0x64, 0xff, 0x94, 0xff, 0xce, 0xff, 0x00, 0x00,
+0x2a, 0x00, 0x4e, 0x00, 0x72, 0x00, 0x88, 0x00, 0x74, 0x00, 0x52, 0x00, 0x2a, 0x00, 0xf2, 0xff,
+0xbc, 0xff, 0x8a, 0xff, 0x62, 0xff, 0x46, 0xff, 0x50, 0xff, 0x58, 0xff, 0x7c, 0xff, 0xac, 0xff,
+0xda, 0xff, 0x10, 0x00, 0x40, 0x00, 0x52, 0x00, 0x68, 0x00, 0x70, 0x00, 0x64, 0x00, 0x4a, 0x00,
+0x28, 0x00, 0xfa, 0xff, 0xc4, 0xff, 0x92, 0xff, 0x82, 0xff, 0x72, 0xff, 0x72, 0xff, 0x8a, 0xff,
+0x96, 0xff, 0xc2, 0xff, 0xee, 0xff, 0x0c, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x4a, 0x00,
+0x4e, 0x00, 0x28, 0x00, 0x10, 0x00, 0xee, 0xff, 0xc0, 0xff, 0x9e, 0xff, 0x94, 0xff, 0x98, 0xff,
+0x8c, 0xff, 0x9c, 0xff, 0xb2, 0xff, 0xd0, 0xff, 0xf0, 0xff, 0x04, 0x00, 0x1a, 0x00, 0x20, 0x00,
+0x22, 0x00, 0x30, 0x00, 0x2a, 0x00, 0x1e, 0x00, 0xfa, 0xff, 0xde, 0xff, 0xd4, 0xff, 0xba, 0xff,
+0xb8, 0xff, 0xba, 0xff, 0xb4, 0xff, 0xc2, 0xff, 0xce, 0xff, 0xda, 0xff, 0xf4, 0xff, 0x04, 0x00,
+0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x02, 0x00, 0xe8, 0xff, 0xe4, 0xff,
+0xe0, 0xff, 0xd0, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xdc, 0xff, 0xd6, 0xff, 0xde, 0xff, 0xe2, 0xff,
+0xde, 0xff, 0xd4, 0xff, 0xd0, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xe4, 0xff, 0xde, 0xff, 0xe6, 0xff,
+0xe4, 0xff, 0xf2, 0xff, 0x02, 0x00, 0x06, 0x00, 0xfe, 0xff, 0x02, 0x00, 0x02, 0x00, 0xf4, 0xff,
+0xea, 0xff, 0xda, 0xff, 0xc0, 0xff, 0xb8, 0xff, 0xae, 0xff, 0xb2, 0xff, 0xc0, 0xff, 0xc2, 0xff,
+0xde, 0xff, 0xe8, 0xff, 0x04, 0x00, 0x18, 0x00, 0x2c, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x30, 0x00,
+0x1c, 0x00, 0x0e, 0x00, 0xde, 0xff, 0xc2, 0xff, 0xa0, 0xff, 0x8a, 0xff, 0x82, 0xff, 0x8a, 0xff,
+0x96, 0xff, 0xa8, 0xff, 0xd2, 0xff, 0xee, 0xff, 0x16, 0x00, 0x42, 0x00, 0x50, 0x00, 0x66, 0x00,
+0x54, 0x00, 0x3c, 0x00, 0x38, 0x00, 0x04, 0x00, 0xe4, 0xff, 0xb0, 0xff, 0x86, 0xff, 0x6c, 0xff,
+0x6e, 0xff, 0x72, 0xff, 0x86, 0xff, 0xb4, 0xff, 0xd6, 0xff, 0x08, 0x00, 0x36, 0x00, 0x68, 0x00,
+0x86, 0x00, 0x90, 0x00, 0x8a, 0x00, 0x6a, 0x00, 0x3c, 0x00, 0x0c, 0x00, 0xda, 0xff, 0xaa, 0xff,
+0x7a, 0xff, 0x58, 0xff, 0x4c, 0xff, 0x5a, 0xff, 0x78, 0xff, 0xa6, 0xff, 0xde, 0xff, 0x10, 0x00,
+0x50, 0x00, 0x7c, 0x00, 0x94, 0x00, 0xa6, 0x00, 0x92, 0x00, 0x66, 0x00, 0x30, 0x00, 0x02, 0x00,
+0xc6, 0xff, 0x86, 0xff, 0x5a, 0xff, 0x2c, 0xff, 0x32, 0xff, 0x40, 0xff, 0x6a, 0xff, 0xa6, 0xff,
+0xe2, 0xff, 0x16, 0x00, 0x5a, 0x00, 0x96, 0x00, 0xb0, 0x00, 0xb2, 0x00, 0x92, 0x00, 0x64, 0x00,
+0x28, 0x00, 0xfa, 0xff, 0xbe, 0xff, 0x7c, 0xff, 0x42, 0xff, 0x2e, 0xff, 0x22, 0xff, 0x44, 0xff,
+0x7a, 0xff, 0xbe, 0xff, 0xf4, 0xff, 0x36, 0x00, 0x74, 0x00, 0x96, 0x00, 0xb2, 0x00, 0xb0, 0x00,
+0x88, 0x00, 0x4e, 0x00, 0x0c, 0x00, 0xdc, 0xff, 0xa0, 0xff, 0x5a, 0xff, 0x36, 0xff, 0x1a, 0xff,
+0x2a, 0xff, 0x4c, 0xff, 0x88, 0xff, 0xd0, 0xff, 0x00, 0x00, 0x3c, 0x00, 0x7e, 0x00, 0xa0, 0x00,
+0xa0, 0x00, 0x94, 0x00, 0x62, 0x00, 0x36, 0x00, 0xfc, 0xff, 0xc0, 0xff, 0x96, 0xff, 0x4e, 0xff,
+0x2c, 0xff, 0x2c, 0xff, 0x36, 0xff, 0x6e, 0xff, 0x9e, 0xff, 0xea, 0xff, 0x1c, 0x00, 0x52, 0x00,
+0x86, 0x00, 0x98, 0x00, 0xa8, 0x00, 0x8a, 0x00, 0x6a, 0x00, 0x2a, 0x00, 0xf4, 0xff, 0xba, 0xff,
+0x88, 0xff, 0x66, 0xff, 0x4e, 0xff, 0x46, 0xff, 0x52, 0xff, 0x8a, 0xff, 0xc0, 0xff, 0xf2, 0xff,
+0x28, 0x00, 0x52, 0x00, 0x6a, 0x00, 0x7a, 0x00, 0x78, 0x00, 0x6c, 0x00, 0x48, 0x00, 0x16, 0x00,
+0xf2, 0xff, 0xb0, 0xff, 0x90, 0xff, 0x72, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x78, 0xff, 0x96, 0xff,
+0xce, 0xff, 0xf8, 0xff, 0x1a, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x66, 0x00, 0x56, 0x00, 0x54, 0x00,
+0x40, 0x00, 0x10, 0x00, 0xec, 0xff, 0xca, 0xff, 0xb2, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x8a, 0xff,
+0xa4, 0xff, 0xba, 0xff, 0xe4, 0xff, 0x06, 0x00, 0x14, 0x00, 0x3a, 0x00, 0x3e, 0x00, 0x42, 0x00,
+0x4a, 0x00, 0x38, 0x00, 0x22, 0x00, 0x0c, 0x00, 0xe4, 0xff, 0xda, 0xff, 0xbe, 0xff, 0xb4, 0xff,
+0xb4, 0xff, 0xa4, 0xff, 0xc0, 0xff, 0xc8, 0xff, 0xe4, 0xff, 0x02, 0x00, 0x02, 0x00, 0x16, 0x00,
+0x16, 0x00, 0x1a, 0x00, 0x18, 0x00, 0x14, 0x00, 0x02, 0x00, 0xf2, 0xff, 0xe8, 0xff, 0xe8, 0xff,
+0xde, 0xff, 0xd8, 0xff, 0xd4, 0xff, 0xda, 0xff, 0xe4, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf4, 0xff,
+0xfa, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfc, 0xff,
+0x08, 0x00, 0x06, 0x00, 0x02, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf4, 0xff, 0xee, 0xff, 0xf6, 0xff,
+0xe4, 0xff, 0xe0, 0xff, 0xd0, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xd8, 0xff, 0xd4, 0xff, 0xf2, 0xff,
+0xf8, 0xff, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x00, 0x00,
+0xee, 0xff, 0xd8, 0xff, 0xc4, 0xff, 0xa6, 0xff, 0xa0, 0xff, 0xa4, 0xff, 0xa2, 0xff, 0xae, 0xff,
+0xc4, 0xff, 0xe6, 0xff, 0x08, 0x00, 0x22, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00,
+0x38, 0x00, 0x1e, 0x00, 0xf6, 0xff, 0xd0, 0xff, 0xa8, 0xff, 0x8c, 0xff, 0x80, 0xff, 0x7c, 0xff,
+0x82, 0xff, 0x94, 0xff, 0xbc, 0xff, 0xf0, 0xff, 0x14, 0x00, 0x3e, 0x00, 0x58, 0x00, 0x6e, 0x00,
+0x6c, 0x00, 0x5c, 0x00, 0x4a, 0x00, 0x18, 0x00, 0xf0, 0xff, 0xc2, 0xff, 0x84, 0xff, 0x56, 0xff,
+0x4e, 0xff, 0x54, 0xff, 0x5c, 0xff, 0x86, 0xff, 0xb0, 0xff, 0xf2, 0xff, 0x22, 0x00, 0x58, 0x00,
+0x74, 0x00, 0x8e, 0x00, 0x92, 0x00, 0x82, 0x00, 0x58, 0x00, 0x1a, 0x00, 0xf2, 0xff, 0xb4, 0xff,
+0x7a, 0xff, 0x4c, 0xff, 0x3a, 0xff, 0x40, 0xff, 0x58, 0xff, 0x92, 0xff, 0xcc, 0xff, 0xfe, 0xff,
+0x3a, 0x00, 0x6e, 0x00, 0x98, 0x00, 0xae, 0x00, 0xb6, 0x00, 0x90, 0x00, 0x60, 0x00, 0x1c, 0x00,
+0xe0, 0xff, 0xa4, 0xff, 0x62, 0xff, 0x42, 0xff, 0x2c, 0xff, 0x30, 0xff, 0x52, 0xff, 0x90, 0xff,
+0xd4, 0xff, 0x00, 0x00, 0x38, 0x00, 0x80, 0x00, 0x9c, 0x00, 0xb6, 0x00, 0xac, 0x00, 0x80, 0x00,
+0x44, 0x00, 0x04, 0x00, 0xca, 0xff, 0x8a, 0xff, 0x50, 0xff, 0x2e, 0xff, 0x22, 0xff, 0x3c, 0xff,
+0x68, 0xff, 0x9c, 0xff, 0xe8, 0xff, 0x0c, 0x00, 0x50, 0x00, 0x88, 0x00, 0xae, 0x00, 0xbc, 0x00,
+0x9c, 0x00, 0x78, 0x00, 0x30, 0x00, 0xf6, 0xff, 0xc0, 0xff, 0x7e, 0xff, 0x4e, 0xff, 0x3c, 0xff,
+0x34, 0xff, 0x42, 0xff, 0x7e, 0xff, 0xac, 0xff, 0xe6, 0xff, 0x12, 0x00, 0x58, 0x00, 0x86, 0x00,
+0x96, 0x00, 0xa2, 0x00, 0x84, 0x00, 0x54, 0x00, 0x1e, 0x00, 0xe6, 0xff, 0xa6, 0xff, 0x7a, 0xff,
+0x54, 0xff, 0x3c, 0xff, 0x42, 0xff, 0x50, 0xff, 0x80, 0xff, 0xba, 0xff, 0xf0, 0xff, 0x1a, 0x00,
+0x54, 0x00, 0x8c, 0x00, 0x90, 0x00, 0x92, 0x00, 0x70, 0x00, 0x46, 0x00, 0x18, 0x00, 0xea, 0xff,
+0xb4, 0xff, 0x88, 0xff, 0x6a, 0xff, 0x66, 0xff, 0x62, 0xff, 0x7c, 0xff, 0xa6, 0xff, 0xca, 0xff,
+0x04, 0x00, 0x2c, 0x00, 0x5e, 0x00, 0x6a, 0x00, 0x78, 0x00, 0x70, 0x00, 0x56, 0x00, 0x32, 0x00,
+0x00, 0x00, 0xdc, 0xff, 0xb4, 0xff, 0xa6, 0xff, 0x90, 0xff, 0x84, 0xff, 0x88, 0xff, 0x9c, 0xff,
+0xbc, 0xff, 0xde, 0xff, 0x08, 0x00, 0x2c, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x46, 0x00,
+0x34, 0x00, 0x14, 0x00, 0xfc, 0xff, 0xee, 0xff, 0xba, 0xff, 0xb0, 0xff, 0xc2, 0xff, 0xb0, 0xff,
+0xae, 0xff, 0xc8, 0xff, 0xda, 0xff, 0xf4, 0xff, 0x08, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x20, 0x00,
+0x30, 0x00, 0x20, 0x00, 0x18, 0x00, 0x0a, 0x00, 0x02, 0x00, 0xf0, 0xff, 0xe2, 0xff, 0xde, 0xff,
+0xd0, 0xff, 0xdc, 0xff, 0xd8, 0xff, 0xe2, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfc, 0xff,
+0xfe, 0xff, 0xfa, 0xff, 0x06, 0x00, 0xfe, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0x02, 0x00, 0x00, 0x00,
+0xf4, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xdc, 0xff,
+0xd8, 0xff, 0xd8, 0xff, 0xe0, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xfc, 0xff,
+0x08, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0xf8, 0xff,
+0xe6, 0xff, 0xc4, 0xff, 0xb8, 0xff, 0xa8, 0xff, 0xb2, 0xff, 0xc2, 0xff, 0xb8, 0xff, 0xd4, 0xff,
+0xee, 0xff, 0x0c, 0x00, 0x20, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x44, 0x00, 0x34, 0x00, 0x1a, 0x00,
+0xf8, 0xff, 0xb0, 0xff, 0x8c, 0xff, 0x78, 0xff, 0x84, 0xff, 0x96, 0xff, 0xa4, 0xff, 0xcc, 0xff,
+0xf8, 0xff, 0x1c, 0x00, 0x40, 0x00, 0x5e, 0x00, 0x6c, 0x00, 0x62, 0x00, 0x52, 0x00, 0x34, 0x00,
+0x06, 0x00, 0xdc, 0xff, 0xac, 0xff, 0x86, 0xff, 0x6c, 0xff, 0x5e, 0xff, 0x68, 0xff, 0x7a, 0xff,
+0xa4, 0xff, 0xda, 0xff, 0x0a, 0x00, 0x36, 0x00, 0x72, 0x00, 0x88, 0x00, 0x94, 0x00, 0x8c, 0x00,
+0x62, 0x00, 0x44, 0x00, 0x06, 0x00, 0xdc, 0xff, 0x90, 0xff, 0x64, 0xff, 0x46, 0xff, 0x38, 0xff,
+0x50, 0xff, 0x70, 0xff, 0xac, 0xff, 0xe6, 0xff, 0x1c, 0x00, 0x5a, 0x00, 0x8c, 0x00, 0xac, 0x00,
+0xb2, 0x00, 0x94, 0x00, 0x72, 0x00, 0x2e, 0x00, 0xfc, 0xff, 0xc8, 0xff, 0x84, 0xff, 0x58, 0xff,
+0x3c, 0xff, 0x38, 0xff, 0x52, 0xff, 0x7a, 0xff, 0xc4, 0xff, 0xfa, 0xff, 0x2c, 0x00, 0x74, 0x00,
+0x9c, 0x00, 0xb8, 0x00, 0xb2, 0x00, 0x9a, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0xf4, 0xff, 0xc2, 0xff,
+0x76, 0xff, 0x54, 0xff, 0x34, 0xff, 0x32, 0xff, 0x5a, 0xff, 0x84, 0xff, 0xd4, 0xff, 0x08, 0x00,
+0x3e, 0x00, 0x7c, 0x00, 0xa6, 0x00, 0xba, 0x00, 0xa8, 0x00, 0x88, 0x00, 0x58, 0x00, 0x12, 0x00,
+0xe6, 0xff, 0xa8, 0xff, 0x70, 0xff, 0x44, 0xff, 0x2a, 0xff, 0x44, 0xff, 0x64, 0xff, 0x92, 0xff,
+0xde, 0xff, 0x06, 0x00, 0x40, 0x00, 0x7e, 0x00, 0x9c, 0x00, 0xae, 0x00, 0x9c, 0x00, 0x7a, 0x00,
+0x46, 0x00, 0x08, 0x00, 0xd0, 0xff, 0x9e, 0xff, 0x66, 0xff, 0x3e, 0xff, 0x3a, 0xff, 0x50, 0xff,
+0x70, 0xff, 0xa8, 0xff, 0xe4, 0xff, 0x1a, 0x00, 0x56, 0x00, 0x72, 0x00, 0x8e, 0x00, 0x98, 0x00,
+0x88, 0x00, 0x66, 0x00, 0x2c, 0x00, 0xf4, 0xff, 0xc4, 0xff, 0x94, 0xff, 0x5e, 0xff, 0x46, 0xff,
+0x4c, 0xff, 0x5c, 0xff, 0x84, 0xff, 0xb0, 0xff, 0xde, 0xff, 0x16, 0x00, 0x46, 0x00, 0x66, 0x00,
+0x7e, 0x00, 0x7e, 0x00, 0x66, 0x00, 0x48, 0x00, 0x1c, 0x00, 0xf2, 0xff, 0xb8, 0xff, 0x8a, 0xff,
+0x74, 0xff, 0x6a, 0xff, 0x5c, 0xff, 0x78, 0xff, 0x98, 0xff, 0xc8, 0xff, 0xec, 0xff, 0x16, 0x00,
+0x3e, 0x00, 0x46, 0x00, 0x68, 0x00, 0x66, 0x00, 0x5a, 0x00, 0x2e, 0x00, 0x0c, 0x00, 0xf4, 0xff,
+0xc2, 0xff, 0xaa, 0xff, 0x9e, 0xff, 0x98, 0xff, 0x9a, 0xff, 0xa6, 0xff, 0xc2, 0xff, 0xe0, 0xff,
+0xfa, 0xff, 0x16, 0x00, 0x28, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x12, 0x00,
+0xfc, 0xff, 0xec, 0xff, 0xd2, 0xff, 0xc6, 0xff, 0xc2, 0xff, 0xc8, 0xff, 0xc0, 0xff, 0xc4, 0xff,
+0xde, 0xff, 0xea, 0xff, 0xf6, 0xff, 0x00, 0x00, 0x16, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x1a, 0x00,
+0x12, 0x00, 0x0c, 0x00, 0x02, 0x00, 0xf8, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xe0, 0xff,
+0xde, 0xff, 0xde, 0xff, 0xe4, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0x00, 0x00,
+0xfe, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x10, 0x00,
+0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0xea, 0xff, 0xe8, 0xff, 0xdc, 0xff, 0xce, 0xff, 0xc8, 0xff,
+0xca, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xde, 0xff, 0xf2, 0xff, 0x04, 0x00, 0x12, 0x00, 0x26, 0x00,
+0x28, 0x00, 0x32, 0x00, 0x2a, 0x00, 0x20, 0x00, 0x16, 0x00, 0xfa, 0xff, 0xce, 0xff, 0xc4, 0xff,
+0xaa, 0xff, 0x9c, 0xff, 0xa6, 0xff, 0xa0, 0xff, 0xb4, 0xff, 0xc2, 0xff, 0xee, 0xff, 0x0a, 0x00,
+0x28, 0x00, 0x50, 0x00, 0x5a, 0x00, 0x5e, 0x00, 0x52, 0x00, 0x3e, 0x00, 0x22, 0x00, 0xf6, 0xff,
+0xd6, 0xff, 0xa8, 0xff, 0x7c, 0xff, 0x72, 0xff, 0x6e, 0xff, 0x78, 0xff, 0x8e, 0xff, 0xa6, 0xff,
+0xe2, 0xff, 0x0a, 0x00, 0x3c, 0x00, 0x5c, 0x00, 0x74, 0x00, 0x82, 0x00, 0x62, 0x00, 0x48, 0x00,
+0x1c, 0x00, 0xec, 0xff, 0xba, 0xff, 0x8a, 0xff, 0x58, 0xff, 0x46, 0xff, 0x4c, 0xff, 0x4c, 0xff,
+0x80, 0xff, 0xa8, 0xff, 0xdc, 0xff, 0x18, 0x00, 0x4e, 0x00, 0x84, 0x00, 0x9a, 0x00, 0x96, 0x00,
+0x80, 0x00, 0x5a, 0x00, 0x20, 0x00, 0xf0, 0xff, 0xb4, 0xff, 0x80, 0xff, 0x52, 0xff, 0x36, 0xff,
+0x40, 0xff, 0x58, 0xff, 0x76, 0xff, 0xb4, 0xff, 0xf0, 0xff, 0x20, 0x00, 0x60, 0x00, 0x92, 0x00,
+0xb0, 0x00, 0xa6, 0x00, 0x8a, 0x00, 0x52, 0x00, 0x1c, 0x00, 0xea, 0xff, 0xae, 0xff, 0x6e, 0xff,
+0x3e, 0xff, 0x30, 0xff, 0x3c, 0xff, 0x54, 0xff, 0x8c, 0xff, 0xd2, 0xff, 0x00, 0x00, 0x38, 0x00,
+0x7c, 0x00, 0xa8, 0x00, 0xb6, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x3c, 0x00, 0x08, 0x00, 0xd6, 0xff,
+0x9a, 0xff, 0x68, 0xff, 0x44, 0xff, 0x32, 0xff, 0x4a, 0xff, 0x6e, 0xff, 0xb0, 0xff, 0xf2, 0xff,
+0x1e, 0x00, 0x58, 0x00, 0x8e, 0x00, 0xb4, 0x00, 0xb6, 0x00, 0x9c, 0x00, 0x6a, 0x00, 0x2c, 0x00,
+0xf8, 0xff, 0xc2, 0xff, 0x8c, 0xff, 0x5c, 0xff, 0x36, 0xff, 0x3c, 0xff, 0x46, 0xff, 0x76, 0xff,
+0xb4, 0xff, 0xea, 0xff, 0x2a, 0x00, 0x6a, 0x00, 0x98, 0x00, 0xa6, 0x00, 0xaa, 0x00, 0x88, 0x00,
+0x60, 0x00, 0x2a, 0x00, 0xe2, 0xff, 0xa8, 0xff, 0x74, 0xff, 0x56, 0xff, 0x3c, 0xff, 0x44, 0xff,
+0x66, 0xff, 0x7e, 0xff, 0xc2, 0xff, 0xfe, 0xff, 0x38, 0x00, 0x74, 0x00, 0x92, 0x00, 0x9a, 0x00,
+0x8c, 0x00, 0x78, 0x00, 0x4a, 0x00, 0x16, 0x00, 0xe2, 0xff, 0xa6, 0xff, 0x74, 0xff, 0x5e, 0xff,
+0x52, 0xff, 0x5a, 0xff, 0x7a, 0xff, 0xa4, 0xff, 0xda, 0xff, 0x06, 0x00, 0x3a, 0x00, 0x56, 0x00,
+0x72, 0x00, 0x74, 0x00, 0x62, 0x00, 0x44, 0x00, 0x1e, 0x00, 0xf0, 0xff, 0xce, 0xff, 0xa4, 0xff,
+0x86, 0xff, 0x72, 0xff, 0x70, 0xff, 0x7c, 0xff, 0x96, 0xff, 0xc2, 0xff, 0xe8, 0xff, 0x0e, 0x00,
+0x34, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x46, 0x00, 0x34, 0x00, 0x32, 0x00, 0x0c, 0x00, 0xf2, 0xff,
+0xdc, 0xff, 0xbc, 0xff, 0xaa, 0xff, 0xa6, 0xff, 0xaa, 0xff, 0xb6, 0xff, 0xc6, 0xff, 0xd2, 0xff,
+0xf6, 0xff, 0x0a, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x22, 0x00, 0x20, 0x00, 0x18, 0x00, 0x0a, 0x00,
+0xfa, 0xff, 0xf2, 0xff, 0xe8, 0xff, 0xd4, 0xff, 0xc6, 0xff, 0xce, 0xff, 0xca, 0xff, 0xd6, 0xff,
+0xdc, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf8, 0xff,
+0xfc, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xf4, 0xff,
+0xf4, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xe4, 0xff, 0xec, 0xff, 0xe0, 0xff, 0xd8, 0xff,
+0xec, 0xff, 0xe6, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0x12, 0x00, 0x1a, 0x00, 0x12, 0x00,
+0x16, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x06, 0x00, 0xf8, 0xff, 0xe8, 0xff, 0xd2, 0xff, 0xc0, 0xff,
+0xae, 0xff, 0xb2, 0xff, 0xc2, 0xff, 0xc4, 0xff, 0xde, 0xff, 0xf4, 0xff, 0x0a, 0x00, 0x2a, 0x00,
+0x36, 0x00, 0x40, 0x00, 0x3c, 0x00, 0x28, 0x00, 0x20, 0x00, 0x06, 0x00, 0xf0, 0xff, 0xd4, 0xff,
+0xac, 0xff, 0x96, 0xff, 0x90, 0xff, 0x8a, 0xff, 0x9e, 0xff, 0xac, 0xff, 0xd8, 0xff, 0xf4, 0xff,
+0x20, 0x00, 0x4e, 0x00, 0x58, 0x00, 0x6a, 0x00, 0x6e, 0x00, 0x5e, 0x00, 0x3a, 0x00, 0x1a, 0x00,
+0xe4, 0xff, 0xba, 0xff, 0x96, 0xff, 0x70, 0xff, 0x64, 0xff, 0x6a, 0xff, 0x82, 0xff, 0x98, 0xff,
+0xd2, 0xff, 0xfa, 0xff, 0x30, 0x00, 0x58, 0x00, 0x7c, 0x00, 0x8c, 0x00, 0x86, 0x00, 0x72, 0x00,
+0x44, 0x00, 0x10, 0x00, 0xce, 0xff, 0x98, 0xff, 0x6a, 0xff, 0x40, 0xff, 0x2e, 0xff, 0x44, 0xff,
+0x62, 0xff, 0x9a, 0xff, 0xd4, 0xff, 0x06, 0x00, 0x40, 0x00, 0x7c, 0x00, 0x9e, 0x00, 0xac, 0x00,
+0xa0, 0x00, 0x76, 0x00, 0x42, 0x00, 0x0c, 0x00, 0xce, 0xff, 0x82, 0xff, 0x48, 0xff, 0x26, 0xff,
+0x16, 0xff, 0x34, 0xff, 0x5e, 0xff, 0xa0, 0xff, 0xe8, 0xff, 0x0e, 0x00, 0x58, 0x00, 0x9a, 0x00,
+0xb6, 0x00, 0xc4, 0x00, 0xa6, 0x00, 0x76, 0x00, 0x36, 0x00, 0xfa, 0xff, 0xbe, 0xff, 0x78, 0xff,
+0x38, 0xff, 0x1a, 0xff, 0x18, 0xff, 0x32, 0xff, 0x58, 0xff, 0xac, 0xff, 0xea, 0xff, 0x26, 0x00,
+0x6c, 0x00, 0x9a, 0x00, 0xc2, 0x00, 0xb4, 0x00, 0xa8, 0x00, 0x6c, 0x00, 0x20, 0x00, 0xe8, 0xff,
+0xaa, 0xff, 0x6a, 0xff, 0x3a, 0xff, 0x2a, 0xff, 0x2e, 0xff, 0x52, 0xff, 0x7a, 0xff, 0xc8, 0xff,
+0xfe, 0xff, 0x44, 0x00, 0x80, 0x00, 0xa4, 0x00, 0xc6, 0x00, 0xae, 0x00, 0x96, 0x00, 0x58, 0x00,
+0x16, 0x00, 0xdc, 0xff, 0xa2, 0xff, 0x6e, 0xff, 0x44, 0xff, 0x3a, 0xff, 0x44, 0xff, 0x6e, 0xff,
+0xa6, 0xff, 0xe4, 0xff, 0x12, 0x00, 0x3e, 0x00, 0x7c, 0x00, 0x9c, 0x00, 0xa4, 0x00, 0x9a, 0x00,
+0x78, 0x00, 0x3c, 0x00, 0xfe, 0xff, 0xc6, 0xff, 0x98, 0xff, 0x6e, 0xff, 0x58, 0xff, 0x52, 0xff,
+0x58, 0xff, 0x80, 0xff, 0xb8, 0xff, 0xee, 0xff, 0x1c, 0x00, 0x50, 0x00, 0x74, 0x00, 0x86, 0x00,
+0x86, 0x00, 0x76, 0x00, 0x5e, 0x00, 0x2e, 0x00, 0xfe, 0xff, 0xc8, 0xff, 0x9c, 0xff, 0x88, 0xff,
+0x74, 0xff, 0x80, 0xff, 0x88, 0xff, 0x98, 0xff, 0xca, 0xff, 0xf8, 0xff, 0x18, 0x00, 0x46, 0x00,
+0x5e, 0x00, 0x62, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0xf0, 0xff, 0xce, 0xff,
+0xae, 0xff, 0xa4, 0xff, 0xa0, 0xff, 0x98, 0xff, 0x9c, 0xff, 0xbc, 0xff, 0xda, 0xff, 0xf0, 0xff,
+0x02, 0x00, 0x2a, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x26, 0x00, 0x10, 0x00, 0xf6, 0xff,
+0xec, 0xff, 0xd4, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xce, 0xff, 0xb6, 0xff, 0xc4, 0xff, 0xd4, 0xff,
+0xdc, 0xff, 0xe6, 0xff, 0xf4, 0xff, 0x06, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x08, 0x00,
+0x04, 0x00, 0xf4, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xe2, 0xff, 0xe0, 0xff,
+0xe4, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xec, 0xff, 0xf0, 0xff,
+0xfe, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0x02, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x00,
+0xfa, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xd4, 0xff, 0xd0, 0xff, 0xca, 0xff, 0xc8, 0xff,
+0xc6, 0xff, 0xbe, 0xff, 0xd0, 0xff, 0xee, 0xff, 0x02, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x34, 0x00,
+0x36, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x16, 0x00, 0xf0, 0xff, 0xe4, 0xff, 0xc2, 0xff, 0xa4, 0xff,
+0xb0, 0xff, 0xa0, 0xff, 0xa4, 0xff, 0xb2, 0xff, 0xc4, 0xff, 0xf6, 0xff, 0x10, 0x00, 0x2a, 0x00,
+0x52, 0x00, 0x62, 0x00, 0x5a, 0x00, 0x52, 0x00, 0x36, 0x00, 0x28, 0x00, 0xf6, 0xff, 0xd0, 0xff,
+0xae, 0xff, 0x86, 0xff, 0x7e, 0xff, 0x70, 0xff, 0x84, 0xff, 0xa2, 0xff, 0xbe, 0xff, 0xf6, 0xff,
+0x14, 0x00, 0x40, 0x00, 0x6e, 0x00, 0x76, 0x00, 0x7e, 0x00, 0x72, 0x00, 0x50, 0x00, 0x1e, 0x00,
+0xf4, 0xff, 0xce, 0xff, 0x98, 0xff, 0x6a, 0xff, 0x56, 0xff, 0x52, 0xff, 0x64, 0xff, 0x94, 0xff,
+0xc0, 0xff, 0xf6, 0xff, 0x26, 0x00, 0x54, 0x00, 0x88, 0x00, 0xa0, 0x00, 0x9a, 0x00, 0x90, 0x00,
+0x60, 0x00, 0x2c, 0x00, 0xfa, 0xff, 0xbe, 0xff, 0x8a, 0xff, 0x64, 0xff, 0x3e, 0xff, 0x32, 0xff,
+0x4a, 0xff, 0x7c, 0xff, 0xc0, 0xff, 0xf4, 0xff, 0x2a, 0x00, 0x5e, 0x00, 0x98, 0x00, 0xa4, 0x00,
+0xa8, 0x00, 0x8c, 0x00, 0x58, 0x00, 0x1c, 0x00, 0xe2, 0xff, 0xae, 0xff, 0x72, 0xff, 0x44, 0xff,
+0x20, 0xff, 0x22, 0xff, 0x4a, 0xff, 0x80, 0xff, 0xbc, 0xff, 0xf6, 0xff, 0x32, 0x00, 0x6e, 0x00,
+0x9e, 0x00, 0xae, 0x00, 0xa0, 0x00, 0x8c, 0x00, 0x48, 0x00, 0x0c, 0x00, 0xe6, 0xff, 0xa2, 0xff,
+0x64, 0xff, 0x40, 0xff, 0x28, 0xff, 0x38, 0xff, 0x5e, 0xff, 0x98, 0xff, 0xe6, 0xff, 0x04, 0x00,
+0x44, 0x00, 0x82, 0x00, 0xa2, 0x00, 0xb0, 0x00, 0xa2, 0x00, 0x7c, 0x00, 0x3c, 0x00, 0x00, 0x00,
+0xcc, 0xff, 0x94, 0xff, 0x58, 0xff, 0x38, 0xff, 0x26, 0xff, 0x3e, 0xff, 0x66, 0xff, 0xaa, 0xff,
+0xf2, 0xff, 0x16, 0x00, 0x54, 0x00, 0x80, 0x00, 0x9e, 0x00, 0xa4, 0x00, 0x92, 0x00, 0x68, 0x00,
+0x24, 0x00, 0xec, 0xff, 0xb8, 0xff, 0x7e, 0xff, 0x56, 0xff, 0x3e, 0xff, 0x38, 0xff, 0x56, 0xff,
+0x88, 0xff, 0xb8, 0xff, 0x00, 0x00, 0x36, 0x00, 0x58, 0x00, 0x86, 0x00, 0x96, 0x00, 0x94, 0x00,
+0x86, 0x00, 0x58, 0x00, 0x1c, 0x00, 0xf2, 0xff, 0xb0, 0xff, 0x86, 0xff, 0x70, 0xff, 0x5e, 0xff,
+0x68, 0xff, 0x80, 0xff, 0x9e, 0xff, 0xd4, 0xff, 0x08, 0x00, 0x32, 0x00, 0x58, 0x00, 0x66, 0x00,
+0x6c, 0x00, 0x6c, 0x00, 0x5c, 0x00, 0x36, 0x00, 0x02, 0x00, 0xda, 0xff, 0xb2, 0xff, 0x9c, 0xff,
+0x8e, 0xff, 0x8c, 0xff, 0x94, 0xff, 0xa0, 0xff, 0xc2, 0xff, 0xea, 0xff, 0x00, 0x00, 0x22, 0x00,
+0x3c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3a, 0x00, 0x12, 0x00, 0xfa, 0xff, 0xde, 0xff,
+0xbc, 0xff, 0xb0, 0xff, 0xb6, 0xff, 0xae, 0xff, 0xb0, 0xff, 0xc6, 0xff, 0xd8, 0xff, 0xf6, 0xff,
+0x0e, 0x00, 0x10, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x20, 0x00, 0x22, 0x00, 0x08, 0x00, 0xfc, 0xff,
+0xde, 0xff, 0xd6, 0xff, 0xd4, 0xff, 0xca, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xcc, 0xff, 0xd8, 0xff,
+0xe2, 0xff, 0xe4, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0x00, 0x00,
+0xf4, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xe4, 0xff, 0xe6, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xe8, 0xff,
+0xf0, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xde, 0xff, 0xce, 0xff, 0xe0, 0xff, 0xe2, 0xff,
+0xd4, 0xff, 0xe6, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0x12, 0x00, 0x12, 0x00, 0x10, 0x00,
+0x14, 0x00, 0x12, 0x00, 0x10, 0x00, 0xfa, 0xff, 0xe4, 0xff, 0xd2, 0xff, 0xb2, 0xff, 0xaa, 0xff,
+0xb4, 0xff, 0xb2, 0xff, 0xb4, 0xff, 0xc8, 0xff, 0xee, 0xff, 0x02, 0x00, 0x1c, 0x00, 0x3a, 0x00,
+0x44, 0x00, 0x3c, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x16, 0x00, 0xee, 0xff, 0xce, 0xff, 0xb6, 0xff,
+0x8e, 0xff, 0x80, 0xff, 0x8e, 0xff, 0xa0, 0xff, 0xb2, 0xff, 0xd0, 0xff, 0xfe, 0xff, 0x24, 0x00,
+0x42, 0x00, 0x68, 0x00, 0x72, 0x00, 0x80, 0x00, 0x5a, 0x00, 0x3e, 0x00, 0x18, 0x00, 0xe2, 0xff,
+0xba, 0xff, 0x86, 0xff, 0x70, 0xff, 0x66, 0xff, 0x66, 0xff, 0x80, 0xff, 0xa4, 0xff, 0xd6, 0xff,
+0x02, 0x00, 0x2a, 0x00, 0x66, 0x00, 0x7c, 0x00, 0x94, 0x00, 0x8e, 0x00, 0x6e, 0x00, 0x40, 0x00,
+0x16, 0x00, 0xce, 0xff, 0x9e, 0xff, 0x78, 0xff, 0x50, 0xff, 0x46, 0xff, 0x4e, 0xff, 0x72, 0xff,
+0x9e, 0xff, 0xda, 0xff, 0x0e, 0x00, 0x42, 0x00, 0x76, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0x9e, 0x00,
+0x78, 0x00, 0x3a, 0x00, 0xfe, 0xff, 0xd4, 0xff, 0xa0, 0xff, 0x62, 0xff, 0x46, 0xff, 0x3c, 0xff,
+0x4c, 0xff, 0x78, 0xff, 0xaa, 0xff, 0xec, 0xff, 0x1a, 0x00, 0x52, 0x00, 0x88, 0x00, 0xa2, 0x00,
+0xb0, 0x00, 0x8e, 0x00, 0x5a, 0x00, 0x20, 0x00, 0xee, 0xff, 0xb4, 0xff, 0x7a, 0xff, 0x50, 0xff,
+0x34, 0xff, 0x24, 0xff, 0x46, 0xff, 0x76, 0xff, 0xb4, 0xff, 0xfe, 0xff, 0x1e, 0x00, 0x60, 0x00,
+0x92, 0x00, 0xa2, 0x00, 0xa8, 0x00, 0x8c, 0x00, 0x54, 0x00, 0x0e, 0x00, 0xe0, 0xff, 0xa8, 0xff,
+0x74, 0xff, 0x3e, 0xff, 0x2a, 0xff, 0x2e, 0xff, 0x4c, 0xff, 0x90, 0xff, 0xca, 0xff, 0x06, 0x00,
+0x42, 0x00, 0x76, 0x00, 0x9e, 0x00, 0xb4, 0x00, 0xb0, 0x00, 0x8c, 0x00, 0x4c, 0x00, 0x16, 0x00,
+0xd0, 0xff, 0x9a, 0xff, 0x68, 0xff, 0x44, 0xff, 0x32, 0xff, 0x3a, 0xff, 0x5c, 0xff, 0x96, 0xff,
+0xd2, 0xff, 0x0e, 0x00, 0x40, 0x00, 0x6a, 0x00, 0x9a, 0x00, 0xa8, 0x00, 0x9e, 0x00, 0x7a, 0x00,
+0x42, 0x00, 0x04, 0x00, 0xca, 0xff, 0x9e, 0xff, 0x70, 0xff, 0x52, 0xff, 0x44, 0xff, 0x50, 0xff,
+0x72, 0xff, 0xaa, 0xff, 0xdc, 0xff, 0x12, 0x00, 0x52, 0x00, 0x70, 0x00, 0x8c, 0x00, 0x8e, 0x00,
+0x82, 0x00, 0x70, 0x00, 0x3c, 0x00, 0x04, 0x00, 0xda, 0xff, 0xa2, 0xff, 0x94, 0xff, 0x78, 0xff,
+0x6c, 0xff, 0x7e, 0xff, 0x92, 0xff, 0xbe, 0xff, 0xec, 0xff, 0x18, 0x00, 0x3e, 0x00, 0x56, 0x00,
+0x6a, 0x00, 0x64, 0x00, 0x5c, 0x00, 0x42, 0x00, 0x16, 0x00, 0x00, 0x00, 0xe4, 0xff, 0xb6, 0xff,
+0xa2, 0xff, 0x9e, 0xff, 0x86, 0xff, 0x94, 0xff, 0xae, 0xff, 0xdc, 0xff, 0xf2, 0xff, 0x10, 0x00,
+0x1e, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x30, 0x00, 0x10, 0x00, 0x0e, 0x00, 0xf4, 0xff,
+0xec, 0xff, 0xca, 0xff, 0xc4, 0xff, 0xc2, 0xff, 0xae, 0xff, 0xba, 0xff, 0xd0, 0xff, 0xde, 0xff,
+0xf8, 0xff, 0xfa, 0xff, 0x0a, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x0c, 0x00,
+0x02, 0x00, 0xfc, 0xff, 0xf4, 0xff, 0xe6, 0xff, 0xe2, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xd4, 0xff,
+0xde, 0xff, 0xd6, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xd8, 0xff, 0xe2, 0xff, 0xd4, 0xff, 0xe6, 0xff,
+0xf0, 0xff, 0xfa, 0xff, 0x06, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0xfc, 0xff, 0xfc, 0xff,
+0xfc, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xc8, 0xff, 0xb8, 0xff, 0xb4, 0xff, 0xb6, 0xff, 0xba, 0xff,
+0xc2, 0xff, 0xc8, 0xff, 0xde, 0xff, 0xf8, 0xff, 0x08, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x34, 0x00,
+0x24, 0x00, 0x24, 0x00, 0x1c, 0x00, 0xfa, 0xff, 0xe8, 0xff, 0xce, 0xff, 0xaa, 0xff, 0x98, 0xff,
+0x90, 0xff, 0x92, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xde, 0xff, 0xfc, 0xff, 0x1a, 0x00, 0x40, 0x00,
+0x44, 0x00, 0x58, 0x00, 0x4c, 0x00, 0x42, 0x00, 0x2c, 0x00, 0x08, 0x00, 0xe2, 0xff, 0xb8, 0xff,
+0x94, 0xff, 0x7c, 0xff, 0x6a, 0xff, 0x7a, 0xff, 0x8a, 0xff, 0xb0, 0xff, 0xe4, 0xff, 0x14, 0x00,
+0x40, 0x00, 0x5a, 0x00, 0x78, 0x00, 0x80, 0x00, 0x7a, 0x00, 0x60, 0x00, 0x38, 0x00, 0x08, 0x00,
+0xd8, 0xff, 0xaa, 0xff, 0x74, 0xff, 0x62, 0xff, 0x52, 0xff, 0x60, 0xff, 0x88, 0xff, 0xac, 0xff,
+0xf2, 0xff, 0x1e, 0x00, 0x58, 0x00, 0x88, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x8c, 0x00, 0x70, 0x00,
+0x42, 0x00, 0x04, 0x00, 0xc8, 0xff, 0x88, 0xff, 0x58, 0xff, 0x40, 0xff, 0x32, 0xff, 0x50, 0xff,
+0x8a, 0xff, 0xc6, 0xff, 0xfc, 0xff, 0x2e, 0x00, 0x68, 0x00, 0x9e, 0x00, 0xb6, 0x00, 0xb4, 0x00,
+0x9c, 0x00, 0x6a, 0x00, 0x28, 0x00, 0xea, 0xff, 0xac, 0xff, 0x66, 0xff, 0x34, 0xff, 0x20, 0xff,
+0x32, 0xff, 0x56, 0xff, 0x88, 0xff, 0xd8, 0xff, 0x06, 0x00, 0x3c, 0x00, 0x76, 0x00, 0xa2, 0x00,
+0xbe, 0x00, 0xba, 0x00, 0x96, 0x00, 0x5c, 0x00, 0x0c, 0x00, 0xd6, 0xff, 0xa4, 0xff, 0x54, 0xff,
+0x30, 0xff, 0x20, 0xff, 0x3a, 0xff, 0x5e, 0xff, 0x90, 0xff, 0xe6, 0xff, 0x0a, 0x00, 0x38, 0x00,
+0x78, 0x00, 0x9a, 0x00, 0xb0, 0x00, 0x9c, 0x00, 0x78, 0x00, 0x3e, 0x00, 0xfc, 0xff, 0xc8, 0xff,
+0x84, 0xff, 0x58, 0xff, 0x3a, 0xff, 0x2c, 0xff, 0x46, 0xff, 0x64, 0xff, 0xa2, 0xff, 0xd8, 0xff,
+0x0e, 0x00, 0x44, 0x00, 0x6e, 0x00, 0x96, 0x00, 0x92, 0x00, 0x7e, 0x00, 0x5e, 0x00, 0x26, 0x00,
+0xec, 0xff, 0xb8, 0xff, 0x8c, 0xff, 0x66, 0xff, 0x4a, 0xff, 0x46, 0xff, 0x5a, 0xff, 0x8a, 0xff,
+0xb8, 0xff, 0xe4, 0xff, 0x1c, 0x00, 0x4c, 0x00, 0x7c, 0x00, 0x84, 0x00, 0x88, 0x00, 0x70, 0x00,
+0x40, 0x00, 0x18, 0x00, 0xee, 0xff, 0xbe, 0xff, 0x94, 0xff, 0x74, 0xff, 0x64, 0xff, 0x62, 0xff,
+0x7c, 0xff, 0x9a, 0xff, 0xca, 0xff, 0xf8, 0xff, 0x1c, 0x00, 0x3c, 0x00, 0x64, 0x00, 0x74, 0x00,
+0x6c, 0x00, 0x5a, 0x00, 0x34, 0x00, 0x0c, 0x00, 0xec, 0xff, 0xc6, 0xff, 0xac, 0xff, 0x9a, 0xff,
+0x8e, 0xff, 0x92, 0xff, 0x96, 0xff, 0xba, 0xff, 0xda, 0xff, 0xfa, 0xff, 0x20, 0x00, 0x38, 0x00,
+0x42, 0x00, 0x4e, 0x00, 0x4c, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x04, 0x00, 0xf0, 0xff, 0xdc, 0xff,
+0xc2, 0xff, 0xc2, 0xff, 0xb8, 0xff, 0xc0, 0xff, 0xcc, 0xff, 0xd0, 0xff, 0xea, 0xff, 0x06, 0x00,
+0x04, 0x00, 0x20, 0x00, 0x1a, 0x00, 0x22, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0xfc, 0xff,
+0xee, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xe0, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xec, 0xff, 0xe2, 0xff,
+0xea, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xf0, 0xff,
+0xf8, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0xfe, 0xff, 0xfc, 0xff,
+0xfc, 0xff, 0xee, 0xff, 0xe8, 0xff, 0xde, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xd8, 0xff, 0xce, 0xff,
+0xd6, 0xff, 0xe0, 0xff, 0xea, 0xff, 0x00, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x1a, 0x00, 0x18, 0x00,
+0x12, 0x00, 0x06, 0x00, 0xfa, 0xff, 0xe2, 0xff, 0xd2, 0xff, 0xc6, 0xff, 0xb6, 0xff, 0xa8, 0xff,
+0xb0, 0xff, 0xa6, 0xff, 0xba, 0xff, 0xd6, 0xff, 0xea, 0xff, 0x12, 0x00, 0x28, 0x00, 0x40, 0x00,
+0x3a, 0x00, 0x30, 0x00, 0x2e, 0x00, 0x10, 0x00, 0xf8, 0xff, 0xda, 0xff, 0xba, 0xff, 0x9e, 0xff,
+0x8e, 0xff, 0x8a, 0xff, 0x96, 0xff, 0xa2, 0xff, 0xb0, 0xff, 0xe6, 0xff, 0x06, 0x00, 0x3a, 0x00,
+0x5a, 0x00, 0x5a, 0x00, 0x6a, 0x00, 0x52, 0x00, 0x46, 0x00, 0x18, 0x00, 0xf6, 0xff, 0xca, 0xff,
+0x98, 0xff, 0x82, 0xff, 0x6a, 0xff, 0x5c, 0xff, 0x6a, 0xff, 0x92, 0xff, 0xb0, 0xff, 0xec, 0xff,
+0x20, 0x00, 0x48, 0x00, 0x6e, 0x00, 0x82, 0x00, 0x7e, 0x00, 0x6e, 0x00, 0x4c, 0x00, 0x1e, 0x00,
+0xf0, 0xff, 0xb6, 0xff, 0x8e, 0xff, 0x66, 0xff, 0x3e, 0xff, 0x42, 0xff, 0x60, 0xff, 0x94, 0xff,
+0xca, 0xff, 0x00, 0x00, 0x3a, 0x00, 0x62, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x92, 0x00, 0x8c, 0x00,
+0x5a, 0x00, 0x20, 0x00, 0xf0, 0xff, 0xb6, 0xff, 0x82, 0xff, 0x68, 0xff, 0x48, 0xff, 0x46, 0xff,
+0x64, 0xff, 0x9e, 0xff, 0xd6, 0xff, 0x0e, 0x00, 0x40, 0x00, 0x7c, 0x00, 0xa4, 0x00, 0xa2, 0x00,
+0x94, 0x00, 0x70, 0x00, 0x3c, 0x00, 0x0c, 0x00, 0xdc, 0xff, 0x98, 0xff, 0x66, 0xff, 0x3e, 0xff,
+0x30, 0xff, 0x4a, 0xff, 0x70, 0xff, 0xb4, 0xff, 0xf2, 0xff, 0x16, 0x00, 0x58, 0x00, 0x8a, 0x00,
+0xb2, 0x00, 0xb0, 0x00, 0x94, 0x00, 0x6c, 0x00, 0x28, 0x00, 0xfc, 0xff, 0xc2, 0xff, 0x88, 0xff,
+0x5c, 0xff, 0x34, 0xff, 0x40, 0xff, 0x50, 0xff, 0x84, 0xff, 0xc2, 0xff, 0x02, 0x00, 0x36, 0x00,
+0x64, 0x00, 0x96, 0x00, 0xb0, 0x00, 0xa6, 0x00, 0x8a, 0x00, 0x5c, 0x00, 0x10, 0x00, 0xea, 0xff,
+0xb2, 0xff, 0x7c, 0xff, 0x58, 0xff, 0x34, 0xff, 0x3e, 0xff, 0x5a, 0xff, 0x86, 0xff, 0xc6, 0xff,
+0xfc, 0xff, 0x32, 0x00, 0x64, 0x00, 0x86, 0x00, 0x9a, 0x00, 0x8c, 0x00, 0x72, 0x00, 0x46, 0x00,
+0x10, 0x00, 0xda, 0xff, 0x9a, 0xff, 0x70, 0xff, 0x54, 0xff, 0x42, 0xff, 0x44, 0xff, 0x70, 0xff,
+0xa0, 0xff, 0xd6, 0xff, 0x08, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x6e, 0x00, 0x84, 0x00, 0x76, 0x00,
+0x5a, 0x00, 0x32, 0x00, 0xf6, 0xff, 0xd0, 0xff, 0xa4, 0xff, 0x88, 0xff, 0x7c, 0xff, 0x72, 0xff,
+0x72, 0xff, 0x80, 0xff, 0xba, 0xff, 0xe4, 0xff, 0x00, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x3c, 0x00,
+0x46, 0x00, 0x40, 0x00, 0x30, 0x00, 0x18, 0x00, 0xf0, 0xff, 0xd0, 0xff, 0xae, 0xff, 0x9a, 0xff,
+0x98, 0xff, 0xa4, 0xff, 0xa0, 0xff, 0xb0, 0xff, 0xce, 0xff, 0xf2, 0xff, 0x0c, 0x00, 0x12, 0x00,
+0x24, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x16, 0x00, 0x04, 0x00, 0xf4, 0xff, 0xd8, 0xff,
+0xc0, 0xff, 0xcc, 0xff, 0xd0, 0xff, 0xca, 0xff, 0xd0, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xfe, 0xff,
+0x0a, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x06, 0x00,
+0xf2, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xec, 0xff, 0xee, 0xff, 0xe4, 0xff, 0xe0, 0xff, 0xe0, 0xff,
+0xe4, 0xff, 0xe6, 0xff, 0xea, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xee, 0xff, 0xfe, 0xff,
+0x04, 0x00, 0x02, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0e, 0x00,
+0xfe, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xc2, 0xff, 0xcc, 0xff, 0xd2, 0xff,
+0xd8, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0x06, 0x00, 0x18, 0x00, 0x38, 0x00, 0x38, 0x00, 0x36, 0x00,
+0x2c, 0x00, 0x26, 0x00, 0x02, 0x00, 0xea, 0xff, 0xd8, 0xff, 0xb2, 0xff, 0x98, 0xff, 0x96, 0xff,
+0x9e, 0xff, 0xa6, 0xff, 0xb2, 0xff, 0xd0, 0xff, 0xf8, 0xff, 0x0c, 0x00, 0x40, 0x00, 0x52, 0x00,
+0x52, 0x00, 0x52, 0x00, 0x3e, 0x00, 0x2c, 0x00, 0x06, 0x00, 0xda, 0xff, 0xa8, 0xff, 0x82, 0xff,
+0x72, 0xff, 0x62, 0xff, 0x64, 0xff, 0x8a, 0xff, 0xa8, 0xff, 0xd6, 0xff, 0x02, 0x00, 0x32, 0x00,
+0x5c, 0x00, 0x7a, 0x00, 0x84, 0x00, 0x7c, 0x00, 0x64, 0x00, 0x36, 0x00, 0x00, 0x00, 0xcc, 0xff,
+0x96, 0xff, 0x6e, 0xff, 0x56, 0xff, 0x4c, 0xff, 0x5a, 0xff, 0x6e, 0xff, 0xa4, 0xff, 0xd4, 0xff,
+0x0e, 0x00, 0x40, 0x00, 0x70, 0x00, 0x90, 0x00, 0x98, 0x00, 0x90, 0x00, 0x64, 0x00, 0x32, 0x00,
+0xfa, 0xff, 0xc0, 0xff, 0x84, 0xff, 0x62, 0xff, 0x46, 0xff, 0x34, 0xff, 0x46, 0xff, 0x6a, 0xff,
+0xa8, 0xff, 0xe6, 0xff, 0x1a, 0x00, 0x52, 0x00, 0x7e, 0x00, 0xa6, 0x00, 0xac, 0x00, 0x9a, 0x00,
+0x70, 0x00, 0x2c, 0x00, 0xfa, 0xff, 0xc6, 0xff, 0x82, 0xff, 0x54, 0xff, 0x48, 0xff, 0x3a, 0xff,
+0x5a, 0xff, 0x88, 0xff, 0xb6, 0xff, 0xf2, 0xff, 0x28, 0x00, 0x6c, 0x00, 0x9c, 0x00, 0xae, 0x00,
+0xac, 0x00, 0x94, 0x00, 0x66, 0x00, 0x1a, 0x00, 0xee, 0xff, 0xbe, 0xff, 0x82, 0xff, 0x60, 0xff,
+0x3c, 0xff, 0x44, 0xff, 0x5e, 0xff, 0x88, 0xff, 0xd8, 0xff, 0x06, 0x00, 0x28, 0x00, 0x6e, 0x00,
+0x92, 0x00, 0xa6, 0x00, 0x98, 0x00, 0x7e, 0x00, 0x4a, 0x00, 0x08, 0x00, 0xe8, 0xff, 0xaa, 0xff,
+0x7a, 0xff, 0x54, 0xff, 0x48, 0xff, 0x50, 0xff, 0x76, 0xff, 0xa2, 0xff, 0xce, 0xff, 0x18, 0x00,
+0x3e, 0x00, 0x70, 0x00, 0x96, 0x00, 0x94, 0x00, 0x8c, 0x00, 0x72, 0x00, 0x42, 0x00, 0x04, 0x00,
+0xd6, 0xff, 0xa6, 0xff, 0x82, 0xff, 0x68, 0xff, 0x54, 0xff, 0x6e, 0xff, 0x8a, 0xff, 0xb0, 0xff,
+0xe8, 0xff, 0x1e, 0x00, 0x40, 0x00, 0x64, 0x00, 0x80, 0x00, 0x82, 0x00, 0x70, 0x00, 0x46, 0x00,
+0x26, 0x00, 0xec, 0xff, 0xcc, 0xff, 0x9e, 0xff, 0x7e, 0xff, 0x78, 0xff, 0x76, 0xff, 0x7e, 0xff,
+0x90, 0xff, 0xce, 0xff, 0xf8, 0xff, 0x1a, 0x00, 0x3e, 0x00, 0x4a, 0x00, 0x50, 0x00, 0x50, 0x00,
+0x50, 0x00, 0x30, 0x00, 0x06, 0x00, 0xf0, 0xff, 0xc2, 0xff, 0xa6, 0xff, 0xa0, 0xff, 0x98, 0xff,
+0x9e, 0xff, 0x9e, 0xff, 0xb4, 0xff, 0xde, 0xff, 0xf8, 0xff, 0x1a, 0x00, 0x32, 0x00, 0x34, 0x00,
+0x3a, 0x00, 0x34, 0x00, 0x26, 0x00, 0x14, 0x00, 0x04, 0x00, 0xe8, 0xff, 0xc8, 0xff, 0xbe, 0xff,
+0xbe, 0xff, 0xba, 0xff, 0xb6, 0xff, 0xc2, 0xff, 0xd8, 0xff, 0xec, 0xff, 0xfa, 0xff, 0x12, 0x00,
+0x20, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfa, 0xff, 0xe6, 0xff,
+0xe2, 0xff, 0xd4, 0xff, 0xd2, 0xff, 0xda, 0xff, 0xe0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf0, 0xff,
+0xfe, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf8, 0xff,
+0xfe, 0xff, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfa, 0xff, 0xfc, 0xff, 0xf8, 0xff,
+0xf2, 0xff, 0xe6, 0xff, 0xde, 0xff, 0xd8, 0xff, 0xce, 0xff, 0xe0, 0xff, 0xd6, 0xff, 0xd8, 0xff,
+0xee, 0xff, 0xf4, 0xff, 0x06, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x16, 0x00, 0x1e, 0x00,
+0x06, 0x00, 0xfe, 0xff, 0xf2, 0xff, 0xd8, 0xff, 0xbe, 0xff, 0xa6, 0xff, 0xa2, 0xff, 0xae, 0xff,
+0xbe, 0xff, 0xc0, 0xff, 0xe4, 0xff, 0x02, 0x00, 0x0c, 0x00, 0x34, 0x00, 0x48, 0x00, 0x48, 0x00,
+0x42, 0x00, 0x36, 0x00, 0x2a, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xbe, 0xff, 0xa0, 0xff, 0x90, 0xff,
+0x8a, 0xff, 0x8e, 0xff, 0x92, 0xff, 0xb0, 0xff, 0xe2, 0xff, 0x0a, 0x00, 0x36, 0x00, 0x52, 0x00,
+0x5c, 0x00, 0x64, 0x00, 0x5e, 0x00, 0x4a, 0x00, 0x30, 0x00, 0x00, 0x00, 0xc6, 0xff, 0x92, 0xff,
+0x6e, 0xff, 0x5e, 0xff, 0x58, 0xff, 0x6a, 0xff, 0x8a, 0xff, 0xae, 0xff, 0xdc, 0xff, 0x12, 0x00,
+0x50, 0x00, 0x6c, 0x00, 0x80, 0x00, 0x8a, 0x00, 0x78, 0x00, 0x54, 0x00, 0x20, 0x00, 0xee, 0xff,
+0xc2, 0xff, 0x88, 0xff, 0x5a, 0xff, 0x46, 0xff, 0x3e, 0xff, 0x58, 0xff, 0x88, 0xff, 0xba, 0xff,
+0x00, 0x00, 0x32, 0x00, 0x54, 0x00, 0x94, 0x00, 0xa4, 0x00, 0xa6, 0x00, 0x9a, 0x00, 0x56, 0x00,
+0x24, 0x00, 0xec, 0xff, 0xa2, 0xff, 0x74, 0xff, 0x3e, 0xff, 0x32, 0xff, 0x36, 0xff, 0x4c, 0xff,
+0x86, 0xff, 0xc6, 0xff, 0xfc, 0xff, 0x32, 0x00, 0x7e, 0x00, 0x9c, 0x00, 0xb8, 0x00, 0xaa, 0x00,
+0x84, 0x00, 0x58, 0x00, 0x0e, 0x00, 0xde, 0xff, 0xa6, 0xff, 0x62, 0xff, 0x36, 0xff, 0x28, 0xff,
+0x42, 0xff, 0x66, 0xff, 0xa2, 0xff, 0xe2, 0xff, 0x0c, 0x00, 0x4e, 0x00, 0x86, 0x00, 0xae, 0x00,
+0xc4, 0x00, 0xb0, 0x00, 0x7e, 0x00, 0x40, 0x00, 0xfe, 0xff, 0xd6, 0xff, 0x96, 0xff, 0x62, 0xff,
+0x48, 0xff, 0x32, 0xff, 0x4e, 0xff, 0x70, 0xff, 0xb4, 0xff, 0xfc, 0xff, 0x1a, 0x00, 0x4e, 0x00,
+0x84, 0x00, 0x9e, 0x00, 0xa4, 0x00, 0x98, 0x00, 0x66, 0x00, 0x30, 0x00, 0xf2, 0xff, 0xbc, 0xff,
+0x90, 0xff, 0x60, 0xff, 0x42, 0xff, 0x40, 0xff, 0x64, 0xff, 0x8e, 0xff, 0xb2, 0xff, 0xf4, 0xff,
+0x26, 0x00, 0x4c, 0x00, 0x7e, 0x00, 0x90, 0x00, 0x92, 0x00, 0x7e, 0x00, 0x4a, 0x00, 0x1a, 0x00,
+0xe0, 0xff, 0xb2, 0xff, 0x8e, 0xff, 0x6e, 0xff, 0x6a, 0xff, 0x60, 0xff, 0x7c, 0xff, 0xa4, 0xff,
+0xd8, 0xff, 0x04, 0x00, 0x2e, 0x00, 0x5a, 0x00, 0x74, 0x00, 0x7a, 0x00, 0x70, 0x00, 0x56, 0x00,
+0x32, 0x00, 0x06, 0x00, 0xdc, 0xff, 0xa4, 0xff, 0x8c, 0xff, 0x72, 0xff, 0x6e, 0xff, 0x84, 0xff,
+0x8c, 0xff, 0xb0, 0xff, 0xdc, 0xff, 0xfe, 0xff, 0x26, 0x00, 0x46, 0x00, 0x48, 0x00, 0x4e, 0x00,
+0x42, 0x00, 0x40, 0x00, 0x1c, 0x00, 0xe8, 0xff, 0xd6, 0xff, 0xb2, 0xff, 0xa0, 0xff, 0xa2, 0xff,
+0x96, 0xff, 0xa2, 0xff, 0xb2, 0xff, 0xbe, 0xff, 0xe4, 0xff, 0x00, 0x00, 0x18, 0x00, 0x36, 0x00,
+0x38, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x22, 0x00, 0x0c, 0x00, 0xf6, 0xff, 0xec, 0xff, 0xde, 0xff,
+0xbc, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc0, 0xff, 0xce, 0xff, 0xdc, 0xff, 0xf0, 0xff, 0xfe, 0xff,
+0xfc, 0xff, 0x08, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x04, 0x00, 0xf4, 0xff,
+0xe8, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xe6, 0xff, 0xea, 0xff, 0xec, 0xff, 0xdc, 0xff, 0xe4, 0xff,
+0xdc, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xee, 0xff,
+0xfc, 0xff, 0x14, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x14, 0x00, 0x02, 0x00,
+0x02, 0x00, 0xf2, 0xff, 0xdc, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xca, 0xff, 0xce, 0xff, 0xd0, 0xff,
+0xdc, 0xff, 0xf6, 0xff, 0x0a, 0x00, 0x1e, 0x00, 0x30, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x2e, 0x00,
+0x26, 0x00, 0x12, 0x00, 0xf2, 0xff, 0xd8, 0xff, 0xc2, 0xff, 0x9e, 0xff, 0x90, 0xff, 0x9a, 0xff,
+0xa2, 0xff, 0xa8, 0xff, 0xcc, 0xff, 0xe4, 0xff, 0x0a, 0x00, 0x30, 0x00, 0x52, 0x00, 0x60, 0x00,
+0x5a, 0x00, 0x4c, 0x00, 0x3c, 0x00, 0x14, 0x00, 0xe8, 0xff, 0xd0, 0xff, 0x9c, 0xff, 0x7e, 0xff,
+0x78, 0xff, 0x6c, 0xff, 0x84, 0xff, 0x9e, 0xff, 0xc4, 0xff, 0xf8, 0xff, 0x26, 0x00, 0x60, 0x00,
+0x76, 0x00, 0x8a, 0x00, 0x7c, 0x00, 0x66, 0x00, 0x42, 0x00, 0x10, 0x00, 0xe0, 0xff, 0xa2, 0xff,
+0x74, 0xff, 0x56, 0xff, 0x48, 0xff, 0x4c, 0xff, 0x68, 0xff, 0x8e, 0xff, 0xc4, 0xff, 0x00, 0x00,
+0x30, 0x00, 0x6a, 0x00, 0x82, 0x00, 0x90, 0x00, 0x82, 0x00, 0x60, 0x00, 0x2c, 0x00, 0xfa, 0xff,
+0xc4, 0xff, 0x8e, 0xff, 0x54, 0xff, 0x32, 0xff, 0x32, 0xff, 0x3c, 0xff, 0x5e, 0xff, 0xa4, 0xff,
+0xd0, 0xff, 0x12, 0x00, 0x4c, 0x00, 0x88, 0x00, 0xac, 0x00, 0xb2, 0x00, 0x9e, 0x00, 0x60, 0x00,
+0x36, 0x00, 0xee, 0xff, 0xc6, 0xff, 0x90, 0xff, 0x58, 0xff, 0x2c, 0xff, 0x18, 0xff, 0x36, 0xff,
+0x6c, 0xff, 0xac, 0xff, 0xf0, 0xff, 0x22, 0x00, 0x66, 0x00, 0x9a, 0x00, 0xbc, 0x00, 0xba, 0x00,
+0xa6, 0x00, 0x74, 0x00, 0x26, 0x00, 0xee, 0xff, 0xb6, 0xff, 0x70, 0xff, 0x32, 0xff, 0x20, 0xff,
+0x16, 0xff, 0x30, 0xff, 0x6c, 0xff, 0xb4, 0xff, 0xf2, 0xff, 0x30, 0x00, 0x72, 0x00, 0xa2, 0x00,
+0xb6, 0x00, 0xbc, 0x00, 0xa0, 0x00, 0x70, 0x00, 0x28, 0x00, 0xee, 0xff, 0xba, 0xff, 0x74, 0xff,
+0x46, 0xff, 0x32, 0xff, 0x32, 0xff, 0x56, 0xff, 0x82, 0xff, 0xc6, 0xff, 0x0c, 0x00, 0x46, 0x00,
+0x76, 0x00, 0xa2, 0x00, 0xae, 0x00, 0xa8, 0x00, 0x8a, 0x00, 0x58, 0x00, 0x20, 0x00, 0xe6, 0xff,
+0xae, 0xff, 0x80, 0xff, 0x56, 0xff, 0x3e, 0xff, 0x52, 0xff, 0x64, 0xff, 0x9c, 0xff, 0xda, 0xff,
+0x10, 0x00, 0x40, 0x00, 0x64, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x7e, 0x00, 0x66, 0x00, 0x38, 0x00,
+0x0a, 0x00, 0xd0, 0xff, 0xa6, 0xff, 0x82, 0xff, 0x68, 0xff, 0x5e, 0xff, 0x6c, 0xff, 0x8c, 0xff,
+0xb2, 0xff, 0xe8, 0xff, 0x16, 0x00, 0x4a, 0x00, 0x50, 0x00, 0x68, 0x00, 0x72, 0x00, 0x5a, 0x00,
+0x4c, 0x00, 0x22, 0x00, 0x02, 0x00, 0xd2, 0xff, 0xaa, 0xff, 0x9e, 0xff, 0x88, 0xff, 0x8a, 0xff,
+0x90, 0xff, 0xac, 0xff, 0xcc, 0xff, 0xe6, 0xff, 0x16, 0x00, 0x28, 0x00, 0x36, 0x00, 0x34, 0x00,
+0x30, 0x00, 0x32, 0x00, 0x18, 0x00, 0x0a, 0x00, 0xee, 0xff, 0xcc, 0xff, 0xb6, 0xff, 0xae, 0xff,
+0xa8, 0xff, 0x9e, 0xff, 0xae, 0xff, 0xc4, 0xff, 0xd4, 0xff, 0xe0, 0xff, 0xf4, 0xff, 0x04, 0x00,
+0x04, 0x00, 0x08, 0x00, 0x12, 0x00, 0x08, 0x00, 0x00, 0x00, 0xf4, 0xff, 0xee, 0xff, 0xde, 0xff,
+0xdc, 0xff, 0xd8, 0xff, 0xce, 0xff, 0xc8, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xe0, 0xff, 0xe8, 0xff,
+0xde, 0xff, 0xee, 0xff, 0xe6, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf8, 0xff,
+0xf8, 0xff, 0x02, 0x00, 0xfa, 0xff, 0xee, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xec, 0xff,
+0xea, 0xff, 0xd2, 0xff, 0xcc, 0xff, 0xca, 0xff, 0xca, 0xff, 0xce, 0xff, 0xd4, 0xff, 0xe2, 0xff,
+0xf4, 0xff, 0xfc, 0xff, 0x0e, 0x00, 0x1a, 0x00, 0x26, 0x00, 0x20, 0x00, 0x28, 0x00, 0x24, 0x00,
+0x18, 0x00, 0x00, 0x00, 0xde, 0xff, 0xd0, 0xff, 0xba, 0xff, 0xb0, 0xff, 0xb4, 0xff, 0xba, 0xff,
+0xc4, 0xff, 0xe4, 0xff, 0xfa, 0xff, 0x1a, 0x00, 0x36, 0x00, 0x48, 0x00, 0x5c, 0x00, 0x52, 0x00,
+0x4e, 0x00, 0x3a, 0x00, 0x0e, 0x00, 0xf6, 0xff, 0xce, 0xff, 0xa6, 0xff, 0x8e, 0xff, 0x84, 0xff,
+0x86, 0xff, 0xa2, 0xff, 0xba, 0xff, 0xe2, 0xff, 0x0c, 0x00, 0x30, 0x00, 0x54, 0x00, 0x70, 0x00,
+0x7e, 0x00, 0x72, 0x00, 0x5c, 0x00, 0x34, 0x00, 0x08, 0x00, 0xda, 0xff, 0xa0, 0xff, 0x84, 0xff,
+0x5c, 0xff, 0x5c, 0xff, 0x6e, 0xff, 0x8e, 0xff, 0xbe, 0xff, 0xe8, 0xff, 0x22, 0x00, 0x4a, 0x00,
+0x76, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x92, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0xfa, 0xff, 0xba, 0xff,
+0x82, 0xff, 0x56, 0xff, 0x44, 0xff, 0x3e, 0xff, 0x4e, 0xff, 0x80, 0xff, 0xba, 0xff, 0xf6, 0xff,
+0x2c, 0x00, 0x66, 0x00, 0x96, 0x00, 0xb0, 0x00, 0xac, 0x00, 0x90, 0x00, 0x62, 0x00, 0x1a, 0x00,
+0xdc, 0xff, 0x9c, 0xff, 0x60, 0xff, 0x2e, 0xff, 0x12, 0xff, 0x18, 0xff, 0x3e, 0xff, 0x74, 0xff,
+0xbc, 0xff, 0xfc, 0xff, 0x34, 0x00, 0x76, 0x00, 0xa6, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x94, 0x00,
+0x60, 0x00, 0x14, 0x00, 0xdc, 0xff, 0x96, 0xff, 0x52, 0xff, 0x2c, 0xff, 0x16, 0xff, 0x24, 0xff,
+0x4e, 0xff, 0x8c, 0xff, 0xce, 0xff, 0x08, 0x00, 0x4a, 0x00, 0x8e, 0x00, 0xb8, 0x00, 0xcc, 0x00,
+0xbc, 0x00, 0x8a, 0x00, 0x4a, 0x00, 0x08, 0x00, 0xce, 0xff, 0x88, 0xff, 0x52, 0xff, 0x2a, 0xff,
+0x18, 0xff, 0x38, 0xff, 0x5e, 0xff, 0x8e, 0xff, 0xda, 0xff, 0x16, 0x00, 0x54, 0x00, 0x84, 0x00,
+0xaa, 0x00, 0xb2, 0x00, 0xa4, 0x00, 0x74, 0x00, 0x38, 0x00, 0x02, 0x00, 0xc0, 0xff, 0x86, 0xff,
+0x56, 0xff, 0x40, 0xff, 0x3e, 0xff, 0x50, 0xff, 0x82, 0xff, 0xaa, 0xff, 0xf4, 0xff, 0x2e, 0x00,
+0x5a, 0x00, 0x90, 0x00, 0xa0, 0x00, 0xa8, 0x00, 0x94, 0x00, 0x66, 0x00, 0x32, 0x00, 0xf6, 0xff,
+0xc2, 0xff, 0x90, 0xff, 0x74, 0xff, 0x56, 0xff, 0x5c, 0xff, 0x72, 0xff, 0x90, 0xff, 0xc6, 0xff,
+0xfc, 0xff, 0x32, 0x00, 0x50, 0x00, 0x76, 0x00, 0x86, 0x00, 0x82, 0x00, 0x6e, 0x00, 0x40, 0x00,
+0x14, 0x00, 0xe6, 0xff, 0xbc, 0xff, 0x96, 0xff, 0x86, 0xff, 0x7a, 0xff, 0x74, 0xff, 0x88, 0xff,
+0xaa, 0xff, 0xdc, 0xff, 0xfe, 0xff, 0x30, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x62, 0x00, 0x54, 0x00,
+0x44, 0x00, 0x2a, 0x00, 0x02, 0x00, 0xe6, 0xff, 0xc2, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xa6, 0xff,
+0xb2, 0xff, 0xb0, 0xff, 0xc0, 0xff, 0xe2, 0xff, 0x08, 0x00, 0x1a, 0x00, 0x2c, 0x00, 0x2c, 0x00,
+0x32, 0x00, 0x28, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0xf6, 0xff, 0xe0, 0xff, 0xd4, 0xff, 0xc6, 0xff,
+0xc0, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc4, 0xff, 0xd6, 0xff, 0xea, 0xff, 0xee, 0xff, 0x00, 0x00,
+0xfc, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xe6, 0xff,
+0xf0, 0xff, 0xee, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xdc, 0xff, 0xd4, 0xff, 0xde, 0xff, 0xd8, 0xff,
+0xda, 0xff, 0xdc, 0xff, 0xd8, 0xff, 0xe0, 0xff, 0xd6, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xf6, 0xff,
+0x08, 0x00, 0x08, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0xfe, 0xff, 0xec, 0xff,
+0xdc, 0xff, 0xc8, 0xff, 0xba, 0xff, 0xb6, 0xff, 0xb0, 0xff, 0xb4, 0xff, 0xbc, 0xff, 0xc8, 0xff,
+0xea, 0xff, 0xfc, 0xff, 0x1a, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x2e, 0x00, 0x26, 0x00,
+0x10, 0x00, 0xf0, 0xff, 0xd6, 0xff, 0xc0, 0xff, 0x9a, 0xff, 0x8a, 0xff, 0x86, 0xff, 0x92, 0xff,
+0xa2, 0xff, 0xbe, 0xff, 0xec, 0xff, 0x0c, 0x00, 0x32, 0x00, 0x52, 0x00, 0x64, 0x00, 0x68, 0x00,
+0x58, 0x00, 0x4c, 0x00, 0x28, 0x00, 0xfc, 0xff, 0xd8, 0xff, 0xae, 0xff, 0x86, 0xff, 0x70, 0xff,
+0x6c, 0xff, 0x80, 0xff, 0x96, 0xff, 0xb6, 0xff, 0xf0, 0xff, 0x18, 0x00, 0x4c, 0x00, 0x72, 0x00,
+0x8c, 0x00, 0x84, 0x00, 0x74, 0x00, 0x5c, 0x00, 0x30, 0x00, 0x00, 0x00, 0xc6, 0xff, 0x90, 0xff,
+0x6a, 0xff, 0x56, 0xff, 0x46, 0xff, 0x60, 0xff, 0x8e, 0xff, 0xbc, 0xff, 0xfa, 0xff, 0x34, 0x00,
+0x60, 0x00, 0x96, 0x00, 0xa4, 0x00, 0x9c, 0x00, 0x90, 0x00, 0x54, 0x00, 0x22, 0x00, 0xf0, 0xff,
+0xaa, 0xff, 0x6c, 0xff, 0x44, 0xff, 0x34, 0xff, 0x3e, 0xff, 0x56, 0xff, 0x8c, 0xff, 0xd0, 0xff,
+0x04, 0x00, 0x46, 0x00, 0x80, 0x00, 0xa4, 0x00, 0xbc, 0x00, 0xae, 0x00, 0x88, 0x00, 0x52, 0x00,
+0x14, 0x00, 0xe2, 0xff, 0x96, 0xff, 0x5e, 0xff, 0x2e, 0xff, 0x18, 0xff, 0x32, 0xff, 0x58, 0xff,
+0x9c, 0xff, 0xd8, 0xff, 0x10, 0x00, 0x52, 0x00, 0x8c, 0x00, 0xa8, 0x00, 0xb4, 0x00, 0xa8, 0x00,
+0x80, 0x00, 0x3c, 0x00, 0xf8, 0xff, 0xc6, 0xff, 0x82, 0xff, 0x48, 0xff, 0x26, 0xff, 0x1c, 0xff,
+0x3e, 0xff, 0x5c, 0xff, 0xa2, 0xff, 0xe8, 0xff, 0x12, 0x00, 0x58, 0x00, 0x98, 0x00, 0xa2, 0x00,
+0xa2, 0x00, 0x9a, 0x00, 0x66, 0x00, 0x30, 0x00, 0xf0, 0xff, 0xba, 0xff, 0x7c, 0xff, 0x44, 0xff,
+0x30, 0xff, 0x38, 0xff, 0x4e, 0xff, 0x80, 0xff, 0xb8, 0xff, 0xfe, 0xff, 0x28, 0x00, 0x58, 0x00,
+0x8a, 0x00, 0x9a, 0x00, 0xa4, 0x00, 0x88, 0x00, 0x4e, 0x00, 0x14, 0x00, 0xe0, 0xff, 0xae, 0xff,
+0x7c, 0xff, 0x4a, 0xff, 0x4c, 0xff, 0x58, 0xff, 0x62, 0xff, 0x8e, 0xff, 0xd0, 0xff, 0x06, 0x00,
+0x36, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0x86, 0x00, 0x84, 0x00, 0x68, 0x00, 0x3c, 0x00, 0x0e, 0x00,
+0xd4, 0xff, 0xa0, 0xff, 0x88, 0xff, 0x70, 0xff, 0x66, 0xff, 0x7a, 0xff, 0x92, 0xff, 0xb2, 0xff,
+0xec, 0xff, 0x0a, 0x00, 0x3e, 0x00, 0x58, 0x00, 0x6a, 0x00, 0x6e, 0x00, 0x60, 0x00, 0x50, 0x00,
+0x2e, 0x00, 0xfc, 0xff, 0xdc, 0xff, 0xba, 0xff, 0xa2, 0xff, 0x9c, 0xff, 0x94, 0xff, 0x9a, 0xff,
+0xb2, 0xff, 0xd2, 0xff, 0xf4, 0xff, 0x08, 0x00, 0x24, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4a, 0x00,
+0x46, 0x00, 0x3a, 0x00, 0x10, 0x00, 0xfa, 0xff, 0xe4, 0xff, 0xc8, 0xff, 0xbc, 0xff, 0xba, 0xff,
+0xba, 0xff, 0xc2, 0xff, 0xc4, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0x02, 0x00, 0x0e, 0x00, 0x18, 0x00,
+0x14, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x12, 0x00, 0x06, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xe4, 0xff,
+0xda, 0xff, 0xe6, 0xff, 0xe2, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf0, 0xff,
+0xf8, 0xff, 0xf8, 0xff, 0xee, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xf6, 0xff,
+0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x04, 0x00, 0x02, 0x00, 0xf8, 0xff, 0xf6, 0xff, 0xee, 0xff,
+0xde, 0xff, 0xcc, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xca, 0xff, 0xd2, 0xff, 0xde, 0xff, 0xe8, 0xff,
+0xf2, 0xff, 0x08, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x22, 0x00, 0x28, 0x00, 0x22, 0x00, 0x16, 0x00,
+0xfa, 0xff, 0xe2, 0xff, 0xc2, 0xff, 0xac, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xb4, 0xff, 0xb6, 0xff,
+0xd2, 0xff, 0xf2, 0xff, 0x10, 0x00, 0x32, 0x00, 0x4a, 0x00, 0x54, 0x00, 0x54, 0x00, 0x4c, 0x00,
+0x30, 0x00, 0x12, 0x00, 0xf0, 0xff, 0xc2, 0xff, 0x92, 0xff, 0x86, 0xff, 0x70, 0xff, 0x72, 0xff,
+0x8e, 0xff, 0x98, 0xff, 0xce, 0xff, 0x08, 0x00, 0x2a, 0x00, 0x54, 0x00, 0x70, 0x00, 0x7c, 0x00,
+0x7a, 0x00, 0x5e, 0x00, 0x3e, 0x00, 0x0a, 0x00, 0xdc, 0xff, 0xb2, 0xff, 0x7c, 0xff, 0x5e, 0xff,
+0x54, 0xff, 0x5c, 0xff, 0x82, 0xff, 0xa8, 0xff, 0xd8, 0xff, 0x18, 0x00, 0x46, 0x00, 0x6e, 0x00,
+0xa6, 0x00, 0x9a, 0x00, 0x98, 0x00, 0x78, 0x00, 0x38, 0x00, 0x12, 0x00, 0xd8, 0xff, 0xa0, 0xff,
+0x5e, 0xff, 0x42, 0xff, 0x40, 0xff, 0x40, 0xff, 0x6a, 0xff, 0xa2, 0xff, 0xdc, 0xff, 0x14, 0x00,
+0x52, 0x00, 0x8e, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0x9c, 0x00, 0x74, 0x00, 0x36, 0x00, 0xfc, 0xff,
+0xc0, 0xff, 0x90, 0xff, 0x50, 0xff, 0x2e, 0xff, 0x30, 0xff, 0x3e, 0xff, 0x6a, 0xff, 0xb2, 0xff,
+0xec, 0xff, 0x1c, 0x00, 0x6a, 0x00, 0x9a, 0x00, 0xb0, 0x00, 0xae, 0x00, 0x94, 0x00, 0x6a, 0x00,
+0x2a, 0x00, 0xfe, 0xff, 0xb0, 0xff, 0x7a, 0xff, 0x48, 0xff, 0x2c, 0xff, 0x2e, 0xff, 0x56, 0xff,
+0x88, 0xff, 0xc4, 0xff, 0x00, 0x00, 0x32, 0x00, 0x6a, 0x00, 0x92, 0x00, 0xb2, 0x00, 0xaa, 0x00,
+0x8a, 0x00, 0x5a, 0x00, 0x10, 0x00, 0xdc, 0xff, 0xa4, 0xff, 0x64, 0xff, 0x46, 0xff, 0x2e, 0xff,
+0x38, 0xff, 0x60, 0xff, 0x8c, 0xff, 0xc4, 0xff, 0x06, 0x00, 0x36, 0x00, 0x6a, 0x00, 0x8c, 0x00,
+0x9c, 0x00, 0x96, 0x00, 0x72, 0x00, 0x40, 0x00, 0x0e, 0x00, 0xca, 0xff, 0x9e, 0xff, 0x78, 0xff,
+0x42, 0xff, 0x40, 0xff, 0x4e, 0xff, 0x70, 0xff, 0xa8, 0xff, 0xda, 0xff, 0x12, 0x00, 0x38, 0x00,
+0x6e, 0x00, 0x8c, 0x00, 0x8e, 0x00, 0x7c, 0x00, 0x5e, 0x00, 0x38, 0x00, 0xfe, 0xff, 0xc6, 0xff,
+0x9c, 0xff, 0x72, 0xff, 0x58, 0xff, 0x58, 0xff, 0x66, 0xff, 0x86, 0xff, 0xb8, 0xff, 0xe0, 0xff,
+0x12, 0x00, 0x42, 0x00, 0x50, 0x00, 0x64, 0x00, 0x66, 0x00, 0x64, 0x00, 0x4a, 0x00, 0x14, 0x00,
+0xf4, 0xff, 0xc2, 0xff, 0x98, 0xff, 0x8e, 0xff, 0x7c, 0xff, 0x82, 0xff, 0x82, 0xff, 0x9a, 0xff,
+0xc2, 0xff, 0xee, 0xff, 0x16, 0x00, 0x30, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x46, 0x00, 0x46, 0x00,
+0x42, 0x00, 0x0a, 0x00, 0xf6, 0xff, 0xe6, 0xff, 0xc0, 0xff, 0xbc, 0xff, 0xaa, 0xff, 0xa4, 0xff,
+0xa8, 0xff, 0xbe, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0x08, 0x00, 0x1a, 0x00, 0x12, 0x00, 0x1c, 0x00,
+0x2e, 0x00, 0x24, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0xee, 0xff, 0xd2, 0xff, 0xd0, 0xff,
+0xd4, 0xff, 0xc2, 0xff, 0xd4, 0xff, 0xdc, 0xff, 0xde, 0xff, 0xe8, 0xff, 0xee, 0xff, 0xee, 0xff,
+0xf2, 0xff, 0xfa, 0xff, 0x04, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00,
+0xf6, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xdc, 0xff, 0xdc, 0xff,
+0xde, 0xff, 0xd6, 0xff, 0xe2, 0xff, 0xea, 0xff, 0xee, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00,
+0x14, 0x00, 0x14, 0x00, 0x1e, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x02, 0x00, 0xfc, 0xff, 0xf0, 0xff,
+0xd2, 0xff, 0xc2, 0xff, 0xb4, 0xff, 0xae, 0xff, 0xb8, 0xff, 0xbc, 0xff, 0xc4, 0xff, 0xe0, 0xff,
+0xf6, 0xff, 0x14, 0x00, 0x28, 0x00, 0x34, 0x00, 0x3e, 0x00, 0x34, 0x00, 0x36, 0x00, 0x22, 0x00,
+0xfe, 0xff, 0xe6, 0xff, 0xbe, 0xff, 0x98, 0xff, 0x84, 0xff, 0x7e, 0xff, 0x92, 0xff, 0xa2, 0xff,
+0xb8, 0xff, 0xe0, 0xff, 0x00, 0x00, 0x2a, 0x00, 0x54, 0x00, 0x62, 0x00, 0x70, 0x00, 0x68, 0x00,
+0x4c, 0x00, 0x2e, 0x00, 0x08, 0x00, 0xd6, 0xff, 0x9a, 0xff, 0x74, 0xff, 0x5e, 0xff, 0x5a, 0xff,
+0x6e, 0xff, 0x84, 0xff, 0xa6, 0xff, 0xdc, 0xff, 0x12, 0x00, 0x4c, 0x00, 0x72, 0x00, 0x90, 0x00,
+0x8e, 0x00, 0x74, 0x00, 0x5a, 0x00, 0x32, 0x00, 0xfe, 0xff, 0xc4, 0xff, 0x84, 0xff, 0x54, 0xff,
+0x42, 0xff, 0x32, 0xff, 0x4e, 0xff, 0x74, 0xff, 0xac, 0xff, 0xe6, 0xff, 0x26, 0x00, 0x5a, 0x00,
+0x82, 0x00, 0xac, 0x00, 0x9c, 0x00, 0x92, 0x00, 0x66, 0x00, 0x30, 0x00, 0xfa, 0xff, 0xae, 0xff,
+0x78, 0xff, 0x48, 0xff, 0x2e, 0xff, 0x32, 0xff, 0x54, 0xff, 0x8e, 0xff, 0xce, 0xff, 0xfe, 0xff,
+0x32, 0x00, 0x6a, 0x00, 0x94, 0x00, 0xb2, 0x00, 0xa6, 0x00, 0x8e, 0x00, 0x56, 0x00, 0x10, 0x00,
+0xdc, 0xff, 0x9c, 0xff, 0x5e, 0xff, 0x3e, 0xff, 0x26, 0xff, 0x38, 0xff, 0x64, 0xff, 0x98, 0xff,
+0xd8, 0xff, 0x0c, 0x00, 0x42, 0x00, 0x78, 0x00, 0x92, 0x00, 0xb0, 0x00, 0x9c, 0x00, 0x70, 0x00,
+0x34, 0x00, 0xf2, 0xff, 0xc8, 0xff, 0x84, 0xff, 0x52, 0xff, 0x36, 0xff, 0x2c, 0xff, 0x42, 0xff,
+0x7a, 0xff, 0xb2, 0xff, 0xf4, 0xff, 0x20, 0x00, 0x50, 0x00, 0x82, 0x00, 0xaa, 0x00, 0xaa, 0x00,
+0x8c, 0x00, 0x6c, 0x00, 0x22, 0x00, 0xe0, 0xff, 0xbe, 0xff, 0x84, 0xff, 0x4c, 0xff, 0x3e, 0xff,
+0x42, 0xff, 0x5c, 0xff, 0x92, 0xff, 0xc8, 0xff, 0xf6, 0xff, 0x28, 0x00, 0x5a, 0x00, 0x7e, 0x00,
+0x9e, 0x00, 0x9e, 0x00, 0x7e, 0x00, 0x50, 0x00, 0x12, 0x00, 0xde, 0xff, 0xa4, 0xff, 0x80, 0xff,
+0x5c, 0xff, 0x46, 0xff, 0x4e, 0xff, 0x6a, 0xff, 0x98, 0xff, 0xc2, 0xff, 0xfa, 0xff, 0x24, 0x00,
+0x4e, 0x00, 0x66, 0x00, 0x7a, 0x00, 0x78, 0x00, 0x5c, 0x00, 0x44, 0x00, 0x00, 0x00, 0xde, 0xff,
+0xae, 0xff, 0x92, 0xff, 0x80, 0xff, 0x6c, 0xff, 0x70, 0xff, 0x84, 0xff, 0xac, 0xff, 0xd6, 0xff,
+0xf2, 0xff, 0x20, 0x00, 0x40, 0x00, 0x44, 0x00, 0x5e, 0x00, 0x5a, 0x00, 0x4a, 0x00, 0x22, 0x00,
+0x00, 0x00, 0xf0, 0xff, 0xba, 0xff, 0xa6, 0xff, 0x9e, 0xff, 0x94, 0xff, 0x98, 0xff, 0xa4, 0xff,
+0xc6, 0xff, 0xe4, 0xff, 0xf8, 0xff, 0x0e, 0x00, 0x18, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x26, 0x00,
+0x1c, 0x00, 0x06, 0x00, 0xf2, 0xff, 0xde, 0xff, 0xc6, 0xff, 0xba, 0xff, 0xc8, 0xff, 0xc2, 0xff,
+0xc6, 0xff, 0xc8, 0xff, 0xda, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0x0a, 0x00, 0x08, 0x00, 0x04, 0x00,
+0x1a, 0x00, 0x14, 0x00, 0x08, 0x00, 0xfc, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf0, 0xff,
+0xf4, 0xff, 0xe8, 0xff, 0xee, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xee, 0xff,
+0xe8, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0x02, 0x00, 0x08, 0x00, 0x0e, 0x00,
+0x06, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xfa, 0xff, 0xf0, 0xff, 0xe2, 0xff, 0xca, 0xff,
+0xca, 0xff, 0xc8, 0xff, 0xd0, 0xff, 0xd6, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xf4, 0xff, 0x08, 0x00,
+0x12, 0x00, 0x26, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x26, 0x00, 0x22, 0x00, 0x0c, 0x00, 0xfc, 0xff,
+0xe4, 0xff, 0xbc, 0xff, 0xa8, 0xff, 0xae, 0xff, 0xa6, 0xff, 0xb0, 0xff, 0xc0, 0xff, 0xd0, 0xff,
+0xf2, 0xff, 0x08, 0x00, 0x34, 0x00, 0x52, 0x00, 0x50, 0x00, 0x46, 0x00, 0x3a, 0x00, 0x36, 0x00,
+0x0e, 0x00, 0xe6, 0xff, 0xca, 0xff, 0x94, 0xff, 0x76, 0xff, 0x72, 0xff, 0x6c, 0xff, 0x8c, 0xff,
+0x92, 0xff, 0xc2, 0xff, 0xf4, 0xff, 0x22, 0x00, 0x58, 0x00, 0x64, 0x00, 0x7c, 0x00, 0x76, 0x00,
+0x54, 0x00, 0x44, 0x00, 0x10, 0x00, 0xe4, 0xff, 0xa8, 0xff, 0x74, 0xff, 0x64, 0xff, 0x4c, 0xff,
+0x54, 0xff, 0x6e, 0xff, 0x8e, 0xff, 0xc6, 0xff, 0x00, 0x00, 0x3e, 0x00, 0x6e, 0x00, 0x86, 0x00,
+0xa8, 0x00, 0x94, 0x00, 0x76, 0x00, 0x4a, 0x00, 0x16, 0x00, 0xd2, 0xff, 0xa2, 0xff, 0x6a, 0xff,
+0x40, 0xff, 0x36, 0xff, 0x3c, 0xff, 0x64, 0xff, 0x98, 0xff, 0xd8, 0xff, 0x0a, 0x00, 0x44, 0x00,
+0x86, 0x00, 0xa4, 0x00, 0xac, 0x00, 0xa2, 0x00, 0x76, 0x00, 0x3e, 0x00, 0x0c, 0x00, 0xd4, 0xff,
+0x92, 0xff, 0x5c, 0xff, 0x30, 0xff, 0x20, 0xff, 0x3e, 0xff, 0x68, 0xff, 0xa2, 0xff, 0xe0, 0xff,
+0x14, 0x00, 0x64, 0x00, 0x94, 0x00, 0xb8, 0x00, 0xc2, 0x00, 0xb0, 0x00, 0x8a, 0x00, 0x3c, 0x00,
+0x08, 0x00, 0xda, 0xff, 0x86, 0xff, 0x58, 0xff, 0x2e, 0xff, 0x22, 0xff, 0x3e, 0xff, 0x66, 0xff,
+0xb2, 0xff, 0xee, 0xff, 0x1e, 0x00, 0x6c, 0x00, 0x9c, 0x00, 0xba, 0x00, 0xba, 0x00, 0x9e, 0x00,
+0x72, 0x00, 0x2c, 0x00, 0xf8, 0xff, 0xb8, 0xff, 0x7a, 0xff, 0x48, 0xff, 0x28, 0xff, 0x26, 0xff,
+0x4c, 0xff, 0x80, 0xff, 0xba, 0xff, 0xfe, 0xff, 0x30, 0x00, 0x70, 0x00, 0xa2, 0x00, 0xa8, 0x00,
+0xa4, 0x00, 0x86, 0x00, 0x58, 0x00, 0x1a, 0x00, 0xdc, 0xff, 0xa8, 0xff, 0x6e, 0xff, 0x4c, 0xff,
+0x3c, 0xff, 0x48, 0xff, 0x74, 0xff, 0xa2, 0xff, 0xdc, 0xff, 0x1a, 0x00, 0x40, 0x00, 0x76, 0x00,
+0x8e, 0x00, 0x96, 0x00, 0x88, 0x00, 0x62, 0x00, 0x3a, 0x00, 0xf8, 0xff, 0xd0, 0xff, 0x9c, 0xff,
+0x70, 0xff, 0x54, 0xff, 0x52, 0xff, 0x58, 0xff, 0x80, 0xff, 0xac, 0xff, 0xe2, 0xff, 0x0e, 0x00,
+0x32, 0x00, 0x4e, 0x00, 0x62, 0x00, 0x6e, 0x00, 0x60, 0x00, 0x42, 0x00, 0x14, 0x00, 0xf4, 0xff,
+0xc6, 0xff, 0xa2, 0xff, 0x8e, 0xff, 0x74, 0xff, 0x78, 0xff, 0x84, 0xff, 0x96, 0xff, 0xc6, 0xff,
+0xec, 0xff, 0x0c, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x42, 0x00, 0x30, 0x00,
+0x06, 0x00, 0xee, 0xff, 0xd6, 0xff, 0xb4, 0xff, 0xae, 0xff, 0x9e, 0xff, 0xa0, 0xff, 0xb6, 0xff,
+0xc2, 0xff, 0xd0, 0xff, 0xee, 0xff, 0xfc, 0xff, 0x18, 0x00, 0x16, 0x00, 0x14, 0x00, 0x24, 0x00,
+0x14, 0x00, 0x14, 0x00, 0xf6, 0xff, 0xe8, 0xff, 0xe4, 0xff, 0xce, 0xff, 0xcc, 0xff, 0xc6, 0xff,
+0xc2, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xf6, 0xff, 0xfc, 0xff,
+0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0xfc, 0xff, 0xf8, 0xff, 0xf8, 0xff,
+0xfc, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xe2, 0xff,
+0xe0, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x0e, 0x00,
+0x12, 0x00, 0x16, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x16, 0x00, 0xf8, 0xff, 0xf0, 0xff, 0xd6, 0xff,
+0xd4, 0xff, 0xbc, 0xff, 0xac, 0xff, 0xc2, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xe2, 0xff, 0x04, 0x00,
+0x0a, 0x00, 0x2c, 0x00, 0x48, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x2c, 0x00, 0xfc, 0xff,
+0xea, 0xff, 0xc8, 0xff, 0x9a, 0xff, 0x90, 0xff, 0x92, 0xff, 0x92, 0xff, 0xa6, 0xff, 0xbe, 0xff,
+0xe2, 0xff, 0x0a, 0x00, 0x2c, 0x00, 0x58, 0x00, 0x68, 0x00, 0x76, 0x00, 0x60, 0x00, 0x46, 0x00,
+0x2c, 0x00, 0xfe, 0xff, 0xce, 0xff, 0x9c, 0xff, 0x7a, 0xff, 0x60, 0xff, 0x5e, 0xff, 0x6c, 0xff,
+0x86, 0xff, 0xa8, 0xff, 0xe2, 0xff, 0x10, 0x00, 0x3c, 0x00, 0x6c, 0x00, 0x80, 0x00, 0x8a, 0x00,
+0x74, 0x00, 0x54, 0x00, 0x22, 0x00, 0xec, 0xff, 0xb8, 0xff, 0x84, 0xff, 0x5e, 0xff, 0x46, 0xff,
+0x46, 0xff, 0x58, 0xff, 0x82, 0xff, 0xb0, 0xff, 0xee, 0xff, 0x22, 0x00, 0x5a, 0x00, 0x80, 0x00,
+0x9c, 0x00, 0xa0, 0x00, 0x8e, 0x00, 0x52, 0x00, 0x1a, 0x00, 0xe6, 0xff, 0xaa, 0xff, 0x7c, 0xff,
+0x52, 0xff, 0x38, 0xff, 0x3a, 0xff, 0x58, 0xff, 0x82, 0xff, 0xc2, 0xff, 0xfa, 0xff, 0x2e, 0x00,
+0x64, 0x00, 0x98, 0x00, 0xb2, 0x00, 0xa2, 0x00, 0x80, 0x00, 0x52, 0x00, 0x0e, 0x00, 0xda, 0xff,
+0xa4, 0xff, 0x6a, 0xff, 0x46, 0xff, 0x30, 0xff, 0x36, 0xff, 0x56, 0xff, 0x88, 0xff, 0xd6, 0xff,
+0x06, 0x00, 0x34, 0x00, 0x7c, 0x00, 0x9c, 0x00, 0xb8, 0x00, 0xaa, 0x00, 0x7c, 0x00, 0x42, 0x00,
+0x00, 0x00, 0xe0, 0xff, 0x9e, 0xff, 0x6a, 0xff, 0x42, 0xff, 0x2a, 0xff, 0x40, 0xff, 0x60, 0xff,
+0xa6, 0xff, 0xe6, 0xff, 0x1a, 0x00, 0x56, 0x00, 0x88, 0x00, 0xaa, 0x00, 0xba, 0x00, 0x9e, 0x00,
+0x7c, 0x00, 0x3c, 0x00, 0x06, 0x00, 0xca, 0xff, 0x8c, 0xff, 0x64, 0xff, 0x38, 0xff, 0x38, 0xff,
+0x54, 0xff, 0x78, 0xff, 0xb4, 0xff, 0xf0, 0xff, 0x20, 0x00, 0x56, 0x00, 0x8a, 0x00, 0xa0, 0x00,
+0xa6, 0x00, 0x8a, 0x00, 0x66, 0x00, 0x2e, 0x00, 0xf2, 0xff, 0xbc, 0xff, 0x92, 0xff, 0x6c, 0xff,
+0x4c, 0xff, 0x4a, 0xff, 0x64, 0xff, 0x88, 0xff, 0xbe, 0xff, 0xf8, 0xff, 0x26, 0x00, 0x56, 0x00,
+0x76, 0x00, 0x84, 0x00, 0x8a, 0x00, 0x72, 0x00, 0x54, 0x00, 0x24, 0x00, 0xf6, 0xff, 0xba, 0xff,
+0x90, 0xff, 0x88, 0xff, 0x68, 0xff, 0x6c, 0xff, 0x78, 0xff, 0x98, 0xff, 0xcc, 0xff, 0xec, 0xff,
+0x1a, 0x00, 0x40, 0x00, 0x54, 0x00, 0x62, 0x00, 0x54, 0x00, 0x52, 0x00, 0x36, 0x00, 0x04, 0x00,
+0xf0, 0xff, 0xca, 0xff, 0xa6, 0xff, 0x94, 0xff, 0x8c, 0xff, 0x90, 0xff, 0x8c, 0xff, 0xae, 0xff,
+0xd6, 0xff, 0xe8, 0xff, 0x0a, 0x00, 0x24, 0x00, 0x20, 0x00, 0x26, 0x00, 0x28, 0x00, 0x22, 0x00,
+0x06, 0x00, 0xfa, 0xff, 0xe6, 0xff, 0xd0, 0xff, 0xc2, 0xff, 0xba, 0xff, 0xb6, 0xff, 0xba, 0xff,
+0xc8, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0x0c, 0x00, 0xf8, 0xff, 0x06, 0x00,
+0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0xf2, 0xff, 0xe8, 0xff, 0xd2, 0xff, 0xdc, 0xff, 0xec, 0xff,
+0xde, 0xff, 0xea, 0xff, 0xe0, 0xff, 0xe6, 0xff, 0xde, 0xff, 0xe2, 0xff, 0xe8, 0xff, 0xea, 0xff,
+0xf4, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00,
+0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf2, 0xff, 0xf6, 0xff, 0xe4, 0xff, 0xde, 0xff, 0xda, 0xff,
+0xc8, 0xff, 0xc8, 0xff, 0xc6, 0xff, 0xd8, 0xff, 0xe6, 0xff, 0xf8, 0xff, 0x0a, 0x00, 0x18, 0x00,
+0x28, 0x00, 0x30, 0x00, 0x34, 0x00, 0x26, 0x00, 0x28, 0x00, 0x16, 0x00, 0xfa, 0xff, 0xdc, 0xff,
+0xd2, 0xff, 0xb4, 0xff, 0xac, 0xff, 0xae, 0xff, 0xba, 0xff, 0xbe, 0xff, 0xd2, 0xff, 0xfc, 0xff,
+0x14, 0x00, 0x3c, 0x00, 0x50, 0x00, 0x5e, 0x00, 0x5c, 0x00, 0x48, 0x00, 0x36, 0x00, 0x10, 0x00,
+0xf6, 0xff, 0xcc, 0xff, 0xa0, 0xff, 0x88, 0xff, 0x70, 0xff, 0x76, 0xff, 0x8a, 0xff, 0xaa, 0xff,
+0xcc, 0xff, 0xfc, 0xff, 0x24, 0x00, 0x5e, 0x00, 0x6c, 0x00, 0x78, 0x00, 0x7e, 0x00, 0x68, 0x00,
+0x4e, 0x00, 0x16, 0x00, 0xe8, 0xff, 0xae, 0xff, 0x86, 0xff, 0x64, 0xff, 0x48, 0xff, 0x54, 0xff,
+0x72, 0xff, 0x9c, 0xff, 0xce, 0xff, 0x00, 0x00, 0x32, 0x00, 0x6e, 0x00, 0x92, 0x00, 0x9e, 0x00,
+0x9e, 0x00, 0x82, 0x00, 0x44, 0x00, 0x06, 0x00, 0xdc, 0xff, 0x9c, 0xff, 0x64, 0xff, 0x3e, 0xff,
+0x26, 0xff, 0x34, 0xff, 0x4c, 0xff, 0x90, 0xff, 0xd2, 0xff, 0x02, 0x00, 0x46, 0x00, 0x7a, 0x00,
+0x9c, 0x00, 0xa8, 0x00, 0xa4, 0x00, 0x80, 0x00, 0x44, 0x00, 0xf8, 0xff, 0xc8, 0xff, 0x96, 0xff,
+0x58, 0xff, 0x32, 0xff, 0x14, 0xff, 0x3a, 0xff, 0x54, 0xff, 0x98, 0xff, 0xe6, 0xff, 0x02, 0x00,
+0x54, 0x00, 0x8c, 0x00, 0xa8, 0x00, 0xb8, 0x00, 0x9c, 0x00, 0x7a, 0x00, 0x32, 0x00, 0x02, 0x00,
+0xcc, 0xff, 0x7a, 0xff, 0x56, 0xff, 0x28, 0xff, 0x22, 0xff, 0x3a, 0xff, 0x6a, 0xff, 0xb6, 0xff,
+0xf4, 0xff, 0x12, 0x00, 0x5c, 0x00, 0x88, 0x00, 0xa6, 0x00, 0xb4, 0x00, 0x90, 0x00, 0x64, 0x00,
+0x12, 0x00, 0xea, 0xff, 0xb2, 0xff, 0x70, 0xff, 0x52, 0xff, 0x26, 0xff, 0x38, 0xff, 0x52, 0xff,
+0x7c, 0xff, 0xc8, 0xff, 0x04, 0x00, 0x30, 0x00, 0x6c, 0x00, 0x96, 0x00, 0x9e, 0x00, 0x9c, 0x00,
+0x84, 0x00, 0x58, 0x00, 0x1e, 0x00, 0xe2, 0xff, 0xa8, 0xff, 0x68, 0xff, 0x56, 0xff, 0x42, 0xff,
+0x4e, 0xff, 0x7c, 0xff, 0x9c, 0xff, 0xd0, 0xff, 0x08, 0x00, 0x3a, 0x00, 0x68, 0x00, 0x94, 0x00,
+0x98, 0x00, 0x8c, 0x00, 0x68, 0x00, 0x42, 0x00, 0x08, 0x00, 0xd0, 0xff, 0xa6, 0xff, 0x7e, 0xff,
+0x6e, 0xff, 0x52, 0xff, 0x66, 0xff, 0x80, 0xff, 0xa4, 0xff, 0xda, 0xff, 0x02, 0x00, 0x38, 0x00,
+0x4c, 0x00, 0x64, 0x00, 0x78, 0x00, 0x60, 0x00, 0x52, 0x00, 0x32, 0x00, 0x08, 0x00, 0xd6, 0xff,
+0xa4, 0xff, 0x9c, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x98, 0xff, 0xc2, 0xff, 0xe2, 0xff,
+0xfe, 0xff, 0x28, 0x00, 0x48, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4a, 0x00, 0x38, 0x00, 0x1e, 0x00,
+0x00, 0x00, 0xe0, 0xff, 0xc4, 0xff, 0xb0, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xb2, 0xff, 0xbc, 0xff,
+0xd4, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0x14, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x2a, 0x00, 0x24, 0x00,
+0x12, 0x00, 0x04, 0x00, 0xee, 0xff, 0xec, 0xff, 0xd4, 0xff, 0xda, 0xff, 0xdc, 0xff, 0xcc, 0xff,
+0xd2, 0xff, 0xce, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xf8, 0xff,
+0x00, 0x00, 0xfa, 0xff, 0xfe, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x02, 0x00,
+0x02, 0x00, 0xf8, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xdc, 0xff, 0xd4, 0xff, 0xd8, 0xff, 0xd6, 0xff,
+0xd4, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0x10, 0x00, 0x16, 0x00,
+0x28, 0x00, 0x1e, 0x00, 0x12, 0x00, 0x0e, 0x00, 0xf2, 0xff, 0xe8, 0xff, 0xce, 0xff, 0xca, 0xff,
+0xba, 0xff, 0xa6, 0xff, 0xb0, 0xff, 0xb6, 0xff, 0xc4, 0xff, 0xdc, 0xff, 0xec, 0xff, 0x06, 0x00,
+0x28, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3c, 0x00, 0x3a, 0x00, 0x26, 0x00, 0x0a, 0x00, 0xee, 0xff,
+0xd0, 0xff, 0xb0, 0xff, 0xa0, 0xff, 0x94, 0xff, 0x90, 0xff, 0x9c, 0xff, 0xb2, 0xff, 0xe0, 0xff,
+0xfe, 0xff, 0x16, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6c, 0x00, 0x66, 0x00, 0x46, 0x00, 0x38, 0x00,
+0x02, 0x00, 0xea, 0xff, 0xb4, 0xff, 0x88, 0xff, 0x7a, 0xff, 0x6e, 0xff, 0x6a, 0xff, 0x80, 0xff,
+0xa2, 0xff, 0xd6, 0xff, 0x06, 0x00, 0x32, 0x00, 0x60, 0x00, 0x80, 0x00, 0x88, 0x00, 0x78, 0x00,
+0x68, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0xd2, 0xff, 0xa0, 0xff, 0x78, 0xff, 0x56, 0xff, 0x4e, 0xff,
+0x52, 0xff, 0x74, 0xff, 0xa8, 0xff, 0xe4, 0xff, 0x24, 0x00, 0x52, 0x00, 0x7c, 0x00, 0x9e, 0x00,
+0xa8, 0x00, 0x98, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0xfe, 0xff, 0xc6, 0xff, 0x94, 0xff, 0x5a, 0xff,
+0x34, 0xff, 0x34, 0xff, 0x46, 0xff, 0x6c, 0xff, 0xaa, 0xff, 0xe8, 0xff, 0x22, 0x00, 0x62, 0x00,
+0x92, 0x00, 0xae, 0x00, 0xac, 0x00, 0x98, 0x00, 0x60, 0x00, 0x1e, 0x00, 0xee, 0xff, 0xb8, 0xff,
+0x6e, 0xff, 0x42, 0xff, 0x28, 0xff, 0x28, 0xff, 0x40, 0xff, 0x70, 0xff, 0xc0, 0xff, 0xf8, 0xff,
+0x28, 0x00, 0x6c, 0x00, 0x9a, 0x00, 0xae, 0x00, 0xae, 0x00, 0x88, 0x00, 0x5a, 0x00, 0x10, 0x00,
+0xdc, 0xff, 0xac, 0xff, 0x76, 0xff, 0x46, 0xff, 0x2e, 0xff, 0x40, 0xff, 0x5a, 0xff, 0x92, 0xff,
+0xe2, 0xff, 0x0c, 0x00, 0x42, 0x00, 0x80, 0x00, 0x9e, 0x00, 0xa8, 0x00, 0x98, 0x00, 0x7c, 0x00,
+0x3c, 0x00, 0x04, 0x00, 0xcc, 0xff, 0x98, 0xff, 0x60, 0xff, 0x44, 0xff, 0x38, 0xff, 0x48, 0xff,
+0x70, 0xff, 0xa4, 0xff, 0xe6, 0xff, 0x1e, 0x00, 0x44, 0x00, 0x74, 0x00, 0x98, 0x00, 0x9e, 0x00,
+0x88, 0x00, 0x66, 0x00, 0x2a, 0x00, 0xfc, 0xff, 0xc2, 0xff, 0x8e, 0xff, 0x64, 0xff, 0x4e, 0xff,
+0x4c, 0xff, 0x5a, 0xff, 0x86, 0xff, 0xc4, 0xff, 0xfc, 0xff, 0x30, 0x00, 0x5c, 0x00, 0x6c, 0x00,
+0x8e, 0x00, 0x8e, 0x00, 0x74, 0x00, 0x4e, 0x00, 0x22, 0x00, 0xea, 0xff, 0xb4, 0xff, 0x8c, 0xff,
+0x7a, 0xff, 0x68, 0xff, 0x68, 0xff, 0x86, 0xff, 0xa2, 0xff, 0xd2, 0xff, 0xfc, 0xff, 0x26, 0x00,
+0x4a, 0x00, 0x52, 0x00, 0x56, 0x00, 0x52, 0x00, 0x52, 0x00, 0x34, 0x00, 0x06, 0x00, 0xe8, 0xff,
+0xbc, 0xff, 0xa4, 0xff, 0xa0, 0xff, 0x94, 0xff, 0xa0, 0xff, 0x98, 0xff, 0xbc, 0xff, 0xf6, 0xff,
+0x02, 0x00, 0x10, 0x00, 0x24, 0x00, 0x36, 0x00, 0x38, 0x00, 0x34, 0x00, 0x36, 0x00, 0x16, 0x00,
+0x00, 0x00, 0xf2, 0xff, 0xd6, 0xff, 0xc4, 0xff, 0xc2, 0xff, 0xc4, 0xff, 0xc6, 0xff, 0xca, 0xff,
+0xd8, 0xff, 0xea, 0xff, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x14, 0x00,
+0x10, 0x00, 0x04, 0x00, 0xf8, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe2, 0xff, 0xe0, 0xff,
+0xe2, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xe4, 0xff, 0xda, 0xff, 0xe6, 0xff, 0xde, 0xff, 0xe4, 0xff,
+0xea, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x0e, 0x00,
+0x06, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xbc, 0xff,
+0xbe, 0xff, 0xc6, 0xff, 0xc2, 0xff, 0xda, 0xff, 0xf2, 0xff, 0x00, 0x00, 0x0c, 0x00, 0x22, 0x00,
+0x2a, 0x00, 0x32, 0x00, 0x26, 0x00, 0x22, 0x00, 0x12, 0x00, 0xfa, 0xff, 0xe4, 0xff, 0xc6, 0xff,
+0xac, 0xff, 0x8e, 0xff, 0x94, 0xff, 0xa6, 0xff, 0xb4, 0xff, 0xbe, 0xff, 0xe2, 0xff, 0xfe, 0xff,
+0x1e, 0x00, 0x4c, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x46, 0x00, 0x3e, 0x00, 0x2a, 0x00, 0xf6, 0xff,
+0xd8, 0xff, 0xaa, 0xff, 0x7e, 0xff, 0x70, 0xff, 0x6c, 0xff, 0x7a, 0xff, 0x9a, 0xff, 0xbc, 0xff,
+0xea, 0xff, 0x16, 0x00, 0x40, 0x00, 0x6a, 0x00, 0x82, 0x00, 0x8e, 0x00, 0x76, 0x00, 0x54, 0x00,
+0x32, 0x00, 0xfe, 0xff, 0xcc, 0xff, 0x92, 0xff, 0x70, 0xff, 0x5c, 0xff, 0x56, 0xff, 0x6c, 0xff,
+0x8c, 0xff, 0xc0, 0xff, 0xf4, 0xff, 0x24, 0x00, 0x60, 0x00, 0x82, 0x00, 0x94, 0x00, 0xa2, 0x00,
+0x92, 0x00, 0x5a, 0x00, 0x26, 0x00, 0xf4, 0xff, 0xae, 0xff, 0x86, 0xff, 0x52, 0xff, 0x3c, 0xff,
+0x40, 0xff, 0x52, 0xff, 0x88, 0xff, 0xc6, 0xff, 0xfe, 0xff, 0x28, 0x00, 0x70, 0x00, 0x98, 0x00,
+0xb0, 0x00, 0xac, 0x00, 0x8e, 0x00, 0x5c, 0x00, 0x24, 0x00, 0xee, 0xff, 0xae, 0xff, 0x74, 0xff,
+0x48, 0xff, 0x34, 0xff, 0x38, 0xff, 0x5a, 0xff, 0x8e, 0xff, 0xd2, 0xff, 0x0a, 0x00, 0x3e, 0x00,
+0x7a, 0x00, 0xa6, 0x00, 0xb8, 0x00, 0xb0, 0x00, 0x86, 0x00, 0x4a, 0x00, 0x0c, 0x00, 0xda, 0xff,
+0xa0, 0xff, 0x58, 0xff, 0x38, 0xff, 0x28, 0xff, 0x3a, 0xff, 0x58, 0xff, 0x98, 0xff, 0xe4, 0xff,
+0x10, 0x00, 0x50, 0x00, 0x84, 0x00, 0xaa, 0x00, 0xa6, 0x00, 0x9a, 0x00, 0x72, 0x00, 0x36, 0x00,
+0xf6, 0xff, 0xba, 0xff, 0x88, 0xff, 0x4c, 0xff, 0x32, 0xff, 0x30, 0xff, 0x4a, 0xff, 0x72, 0xff,
+0xa8, 0xff, 0xf4, 0xff, 0x22, 0x00, 0x5e, 0x00, 0x92, 0x00, 0xa8, 0x00, 0x9e, 0x00, 0x84, 0x00,
+0x5c, 0x00, 0x1a, 0x00, 0xf4, 0xff, 0xb0, 0xff, 0x7e, 0xff, 0x56, 0xff, 0x3c, 0xff, 0x40, 0xff,
+0x5a, 0xff, 0x90, 0xff, 0xc6, 0xff, 0x02, 0x00, 0x28, 0x00, 0x66, 0x00, 0x80, 0x00, 0x90, 0x00,
+0x92, 0x00, 0x62, 0x00, 0x46, 0x00, 0x10, 0x00, 0xe2, 0xff, 0xb4, 0xff, 0x82, 0xff, 0x68, 0xff,
+0x60, 0xff, 0x62, 0xff, 0x7e, 0xff, 0x96, 0xff, 0xc8, 0xff, 0x08, 0x00, 0x2e, 0x00, 0x54, 0x00,
+0x66, 0x00, 0x68, 0x00, 0x70, 0x00, 0x60, 0x00, 0x3c, 0x00, 0x14, 0x00, 0xee, 0xff, 0xbe, 0xff,
+0xae, 0xff, 0xa2, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0xa2, 0xff, 0xc2, 0xff, 0xe8, 0xff, 0x08, 0x00,
+0x20, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4c, 0x00, 0x3a, 0x00, 0x1a, 0x00, 0x02, 0x00,
+0xfe, 0xff, 0xda, 0xff, 0xc2, 0xff, 0xbe, 0xff, 0xb2, 0xff, 0xba, 0xff, 0xc2, 0xff, 0xdc, 0xff,
+0xf2, 0xff, 0x00, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x0c, 0x00,
+0x06, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xe6, 0xff, 0xe4, 0xff,
+0xf0, 0xff, 0xfa, 0xff, 0x00, 0x00, 0x06, 0x00, 0xfe, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf4, 0xff,
+0xee, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfc, 0xff,
+0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xea, 0xff, 0xe0, 0xff, 0xd0, 0xff, 0xca, 0xff, 0xc8, 0xff,
+0xba, 0xff, 0xbc, 0xff, 0xca, 0xff, 0xda, 0xff, 0xee, 0xff, 0x0a, 0x00, 0x1a, 0x00, 0x2a, 0x00,
+0x1c, 0x00, 0x20, 0x00, 0x20, 0x00, 0x06, 0x00, 0xf2, 0xff, 0xe2, 0xff, 0xc4, 0xff, 0xa2, 0xff,
+0x98, 0xff, 0x9a, 0xff, 0x9e, 0xff, 0xa6, 0xff, 0xce, 0xff, 0xe8, 0xff, 0x08, 0x00, 0x32, 0x00,
+0x48, 0x00, 0x56, 0x00, 0x56, 0x00, 0x40, 0x00, 0x30, 0x00, 0x14, 0x00, 0xe8, 0xff, 0xc6, 0xff,
+0xa2, 0xff, 0x82, 0xff, 0x7a, 0xff, 0x74, 0xff, 0x8c, 0xff, 0xa2, 0xff, 0xd4, 0xff, 0x04, 0x00,
+0x2a, 0x00, 0x4c, 0x00, 0x62, 0x00, 0x6e, 0x00, 0x62, 0x00, 0x4c, 0x00, 0x2a, 0x00, 0x02, 0x00,
+0xd2, 0xff, 0xa8, 0xff, 0x80, 0xff, 0x64, 0xff, 0x60, 0xff, 0x62, 0xff, 0x7c, 0xff, 0xa6, 0xff,
+0xda, 0xff, 0x0e, 0x00, 0x46, 0x00, 0x74, 0x00, 0x84, 0x00, 0x92, 0x00, 0x82, 0x00, 0x6e, 0x00,
+0x40, 0x00, 0x08, 0x00, 0xd8, 0xff, 0x9e, 0xff, 0x7a, 0xff, 0x56, 0xff, 0x4a, 0xff, 0x50, 0xff,
+0x78, 0xff, 0xae, 0xff, 0xea, 0xff, 0x1c, 0x00, 0x5a, 0x00, 0x8a, 0x00, 0xa0, 0x00, 0xba, 0x00,
+0xa6, 0x00, 0x7e, 0x00, 0x42, 0x00, 0x02, 0x00, 0xd2, 0xff, 0x96, 0xff, 0x62, 0xff, 0x48, 0xff,
+0x2c, 0xff, 0x40, 0xff, 0x70, 0xff, 0xae, 0xff, 0xea, 0xff, 0x28, 0x00, 0x58, 0x00, 0x8c, 0x00,
+0xaa, 0x00, 0xb6, 0x00, 0xae, 0x00, 0x72, 0x00, 0x38, 0x00, 0xfc, 0xff, 0xc8, 0xff, 0x88, 0xff,
+0x5c, 0xff, 0x38, 0xff, 0x3a, 0xff, 0x50, 0xff, 0x7c, 0xff, 0xc6, 0xff, 0xfa, 0xff, 0x34, 0x00,
+0x74, 0x00, 0x98, 0x00, 0xb8, 0x00, 0xb2, 0x00, 0x94, 0x00, 0x66, 0x00, 0x26, 0x00, 0xea, 0xff,
+0xb4, 0xff, 0x78, 0xff, 0x48, 0xff, 0x30, 0xff, 0x3e, 0xff, 0x5c, 0xff, 0x90, 0xff, 0xc8, 0xff,
+0x00, 0x00, 0x36, 0x00, 0x6c, 0x00, 0x8e, 0x00, 0xa4, 0x00, 0x9e, 0x00, 0x78, 0x00, 0x40, 0x00,
+0xfe, 0xff, 0xce, 0xff, 0x9c, 0xff, 0x6c, 0xff, 0x40, 0xff, 0x2a, 0xff, 0x42, 0xff, 0x6a, 0xff,
+0x96, 0xff, 0xd2, 0xff, 0x02, 0x00, 0x34, 0x00, 0x58, 0x00, 0x84, 0x00, 0x94, 0x00, 0x80, 0x00,
+0x60, 0x00, 0x2a, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xa0, 0xff, 0x72, 0xff, 0x5e, 0xff, 0x54, 0xff,
+0x66, 0xff, 0x8c, 0xff, 0xa6, 0xff, 0xe6, 0xff, 0x0a, 0x00, 0x42, 0x00, 0x62, 0x00, 0x78, 0x00,
+0x76, 0x00, 0x62, 0x00, 0x56, 0x00, 0x20, 0x00, 0xfc, 0xff, 0xc2, 0xff, 0xa0, 0xff, 0x7e, 0xff,
+0x72, 0xff, 0x74, 0xff, 0x7a, 0xff, 0x98, 0xff, 0xba, 0xff, 0xea, 0xff, 0x0c, 0x00, 0x3a, 0x00,
+0x46, 0x00, 0x5c, 0x00, 0x60, 0x00, 0x4e, 0x00, 0x32, 0x00, 0x04, 0x00, 0xf6, 0xff, 0xdc, 0xff,
+0xae, 0xff, 0xa4, 0xff, 0xa6, 0xff, 0x9e, 0xff, 0xa8, 0xff, 0xc6, 0xff, 0xe6, 0xff, 0x00, 0x00,
+0x0a, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x36, 0x00, 0x26, 0x00, 0x06, 0x00,
+0xf8, 0xff, 0xec, 0xff, 0xd8, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd8, 0xff,
+0xee, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x0a, 0x00, 0x10, 0x00, 0x10, 0x00, 0x16, 0x00, 0x0c, 0x00,
+0x06, 0x00, 0x04, 0x00, 0xfa, 0xff, 0xf8, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xe6, 0xff,
+0xe4, 0xff, 0xda, 0xff, 0xe2, 0xff, 0xe0, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0xf2, 0xff,
+0xfc, 0xff, 0xfc, 0xff, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0a, 0x00,
+0x12, 0x00, 0x04, 0x00, 0xec, 0xff, 0xec, 0xff, 0xd0, 0xff, 0xca, 0xff, 0xbe, 0xff, 0xc6, 0xff,
+0xce, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xec, 0xff, 0xfe, 0xff, 0x0e, 0x00, 0x1e, 0x00, 0x2e, 0x00,
+0x38, 0x00, 0x30, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0xf4, 0xff, 0xd8, 0xff, 0xc2, 0xff, 0xa2, 0xff,
+0x88, 0xff, 0x90, 0xff, 0x9e, 0xff, 0xa6, 0xff, 0xb6, 0xff, 0xd6, 0xff, 0x00, 0x00, 0x12, 0x00,
+0x38, 0x00, 0x58, 0x00, 0x62, 0x00, 0x4e, 0x00, 0x2e, 0x00, 0x24, 0x00, 0x04, 0x00, 0xe0, 0xff,
+0xac, 0xff, 0x8e, 0xff, 0x7e, 0xff, 0x78, 0xff, 0x86, 0xff, 0x9c, 0xff, 0xb6, 0xff, 0xe0, 0xff,
+0x0e, 0x00, 0x3a, 0x00, 0x62, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x6e, 0x00, 0x4e, 0x00, 0x28, 0x00,
+0x00, 0x00, 0xcc, 0xff, 0x98, 0xff, 0x74, 0xff, 0x5c, 0xff, 0x5c, 0xff, 0x66, 0xff, 0x84, 0xff,
+0xb4, 0xff, 0xe4, 0xff, 0x20, 0x00, 0x4a, 0x00, 0x7a, 0x00, 0x8c, 0x00, 0x94, 0x00, 0x80, 0x00,
+0x56, 0x00, 0x20, 0x00, 0xee, 0xff, 0xc0, 0xff, 0x88, 0xff, 0x58, 0xff, 0x46, 0xff, 0x46, 0xff,
+0x5c, 0xff, 0x88, 0xff, 0xc0, 0xff, 0xfe, 0xff, 0x30, 0x00, 0x68, 0x00, 0x92, 0x00, 0xac, 0x00,
+0xaa, 0x00, 0x92, 0x00, 0x5e, 0x00, 0x1e, 0x00, 0xea, 0xff, 0xb6, 0xff, 0x7a, 0xff, 0x4e, 0xff,
+0x3a, 0xff, 0x3a, 0xff, 0x52, 0xff, 0x8c, 0xff, 0xd6, 0xff, 0x06, 0x00, 0x3c, 0x00, 0x72, 0x00,
+0xa8, 0x00, 0xb2, 0x00, 0xaa, 0x00, 0x8a, 0x00, 0x52, 0x00, 0x08, 0x00, 0xe2, 0xff, 0xa0, 0xff,
+0x6a, 0xff, 0x44, 0xff, 0x34, 0xff, 0x44, 0xff, 0x5e, 0xff, 0x9a, 0xff, 0xe6, 0xff, 0x18, 0x00,
+0x48, 0x00, 0x82, 0x00, 0xa2, 0x00, 0xb8, 0x00, 0xa4, 0x00, 0x82, 0x00, 0x3a, 0x00, 0x0e, 0x00,
+0xdc, 0xff, 0x9e, 0xff, 0x64, 0xff, 0x48, 0xff, 0x40, 0xff, 0x46, 0xff, 0x74, 0xff, 0xb0, 0xff,
+0xec, 0xff, 0x1a, 0x00, 0x54, 0x00, 0x8a, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x90, 0x00, 0x74, 0x00,
+0x3c, 0x00, 0xfc, 0xff, 0xc0, 0xff, 0x8a, 0xff, 0x6a, 0xff, 0x4e, 0xff, 0x44, 0xff, 0x56, 0xff,
+0x84, 0xff, 0xb8, 0xff, 0xf4, 0xff, 0x20, 0x00, 0x54, 0x00, 0x78, 0x00, 0x82, 0x00, 0x86, 0x00,
+0x6c, 0x00, 0x50, 0x00, 0x1a, 0x00, 0xea, 0xff, 0xc0, 0xff, 0x8c, 0xff, 0x70, 0xff, 0x68, 0xff,
+0x70, 0xff, 0x88, 0xff, 0x9c, 0xff, 0xd0, 0xff, 0x02, 0x00, 0x28, 0x00, 0x4c, 0x00, 0x5a, 0x00,
+0x6c, 0x00, 0x58, 0x00, 0x48, 0x00, 0x30, 0x00, 0xfe, 0xff, 0xe2, 0xff, 0xb0, 0xff, 0x96, 0xff,
+0x92, 0xff, 0x80, 0xff, 0x8e, 0xff, 0x9e, 0xff, 0xc0, 0xff, 0xe6, 0xff, 0x02, 0x00, 0x12, 0x00,
+0x2e, 0x00, 0x38, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x1c, 0x00, 0x0a, 0x00, 0xee, 0xff, 0xce, 0xff,
+0xc2, 0xff, 0xaa, 0xff, 0xae, 0xff, 0xb0, 0xff, 0xa4, 0xff, 0xc4, 0xff, 0xd4, 0xff, 0xec, 0xff,
+0x06, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x12, 0x00, 0xfe, 0xff,
+0xec, 0xff, 0xf2, 0xff, 0xdc, 0xff, 0xcc, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xe0, 0xff, 0xdc, 0xff,
+0xe6, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0x0a, 0x00, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0x04, 0x00,
+0x00, 0x00, 0xfe, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xf4, 0xff,
+0xee, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xd8, 0xff, 0xe4, 0xff, 0xe0, 0xff,
+0xd8, 0xff, 0xea, 0xff, 0xf6, 0xff, 0x02, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x26, 0x00, 0x28, 0x00,
+0x22, 0x00, 0x1c, 0x00, 0x0a, 0x00, 0x02, 0x00, 0xee, 0xff, 0xd6, 0xff, 0xb6, 0xff, 0xac, 0xff,
+0xac, 0xff, 0xbc, 0xff, 0xc8, 0xff, 0xdc, 0xff, 0xfe, 0xff, 0x10, 0x00, 0x28, 0x00, 0x4e, 0x00,
+0x5a, 0x00, 0x52, 0x00, 0x4c, 0x00, 0x42, 0x00, 0x1a, 0x00, 0xfa, 0xff, 0xd4, 0xff, 0xa6, 0xff,
+0x88, 0xff, 0x6c, 0xff, 0x7e, 0xff, 0x8c, 0xff, 0x94, 0xff, 0xce, 0xff, 0xee, 0xff, 0x1e, 0x00,
+0x46, 0x00, 0x5e, 0x00, 0x7a, 0x00, 0x72, 0x00, 0x5c, 0x00, 0x46, 0x00, 0x1a, 0x00, 0xee, 0xff,
+0xba, 0xff, 0x74, 0xff, 0x66, 0xff, 0x5e, 0xff, 0x60, 0xff, 0x82, 0xff, 0x94, 0xff, 0xc2, 0xff,
+0x06, 0x00, 0x34, 0x00, 0x62, 0x00, 0x7c, 0x00, 0x98, 0x00, 0x8e, 0x00, 0x74, 0x00, 0x46, 0x00,
+0x10, 0x00, 0xd8, 0xff, 0xa2, 0xff, 0x70, 0xff, 0x4a, 0xff, 0x40, 0xff, 0x4e, 0xff, 0x78, 0xff,
+0x9c, 0xff, 0xce, 0xff, 0x14, 0x00, 0x42, 0x00, 0x74, 0x00, 0xa0, 0x00, 0xa6, 0x00, 0x98, 0x00,
+0x76, 0x00, 0x3e, 0x00, 0xfe, 0xff, 0xc6, 0xff, 0x8c, 0xff, 0x5e, 0xff, 0x34, 0xff, 0x2c, 0xff,
+0x38, 0xff, 0x62, 0xff, 0x9e, 0xff, 0xe6, 0xff, 0x14, 0x00, 0x40, 0x00, 0x88, 0x00, 0xaa, 0x00,
+0xb8, 0x00, 0xa4, 0x00, 0x76, 0x00, 0x36, 0x00, 0xfc, 0xff, 0xd2, 0xff, 0x90, 0xff, 0x62, 0xff,
+0x3e, 0xff, 0x2a, 0xff, 0x46, 0xff, 0x6a, 0xff, 0xb8, 0xff, 0xf6, 0xff, 0x16, 0x00, 0x58, 0x00,
+0x92, 0x00, 0xba, 0x00, 0xb4, 0x00, 0x92, 0x00, 0x74, 0x00, 0x2e, 0x00, 0xec, 0xff, 0xc4, 0xff,
+0x84, 0xff, 0x4e, 0xff, 0x3c, 0xff, 0x32, 0xff, 0x4c, 0xff, 0x80, 0xff, 0xba, 0xff, 0xfa, 0xff,
+0x28, 0x00, 0x66, 0x00, 0x90, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0x98, 0x00, 0x5c, 0x00, 0x18, 0x00,
+0xe4, 0xff, 0xb2, 0xff, 0x80, 0xff, 0x4c, 0xff, 0x3e, 0xff, 0x44, 0xff, 0x5e, 0xff, 0x96, 0xff,
+0xc4, 0xff, 0x0a, 0x00, 0x30, 0x00, 0x60, 0x00, 0x88, 0x00, 0x90, 0x00, 0xa0, 0x00, 0x84, 0x00,
+0x3e, 0x00, 0x08, 0x00, 0xe6, 0xff, 0xb4, 0xff, 0x88, 0xff, 0x68, 0xff, 0x58, 0xff, 0x6a, 0xff,
+0x80, 0xff, 0xa2, 0xff, 0xdc, 0xff, 0x02, 0x00, 0x36, 0x00, 0x56, 0x00, 0x6e, 0x00, 0x6c, 0x00,
+0x62, 0x00, 0x4a, 0x00, 0x22, 0x00, 0xf0, 0xff, 0xca, 0xff, 0x9e, 0xff, 0x8a, 0xff, 0x82, 0xff,
+0x76, 0xff, 0x8e, 0xff, 0x98, 0xff, 0xbe, 0xff, 0xf6, 0xff, 0x12, 0x00, 0x38, 0x00, 0x4c, 0x00,
+0x56, 0x00, 0x4a, 0x00, 0x3c, 0x00, 0x30, 0x00, 0x04, 0x00, 0xe2, 0xff, 0xc0, 0xff, 0xae, 0xff,
+0x98, 0xff, 0x9a, 0xff, 0xa0, 0xff, 0x9e, 0xff, 0xb4, 0xff, 0xd8, 0xff, 0xfe, 0xff, 0x0c, 0x00,
+0x28, 0x00, 0x36, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x26, 0x00, 0x18, 0x00, 0x02, 0x00, 0xf2, 0xff,
+0xe8, 0xff, 0xce, 0xff, 0xbe, 0xff, 0xc6, 0xff, 0xc4, 0xff, 0xc2, 0xff, 0xca, 0xff, 0xd6, 0xff,
+0xf2, 0xff, 0xf4, 0xff, 0x02, 0x00, 0x06, 0x00, 0xf6, 0xff, 0x04, 0x00, 0x04, 0x00, 0xfc, 0xff,
+0x02, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xec, 0xff,
+0xe8, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xde, 0xff, 0xe6, 0xff, 0xe4, 0xff, 0xe6, 0xff,
+0xf8, 0xff, 0xf4, 0xff, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x10, 0x00,
+0x1c, 0x00, 0x04, 0x00, 0xf8, 0xff, 0xe8, 0xff, 0xd6, 0xff, 0xce, 0xff, 0xb8, 0xff, 0xc6, 0xff,
+0xc2, 0xff, 0xc6, 0xff, 0xe0, 0xff, 0xec, 0xff, 0x06, 0x00, 0x14, 0x00, 0x32, 0x00, 0x40, 0x00,
+0x2e, 0x00, 0x38, 0x00, 0x2e, 0x00, 0x12, 0x00, 0xfe, 0xff, 0xe2, 0xff, 0xae, 0xff, 0x98, 0xff,
+0x94, 0xff, 0x86, 0xff, 0xa2, 0xff, 0xa0, 0xff, 0xc6, 0xff, 0xf0, 0xff, 0x0a, 0x00, 0x44, 0x00,
+0x56, 0x00, 0x6c, 0x00, 0x6a, 0x00, 0x58, 0x00, 0x50, 0x00, 0x1e, 0x00, 0xf8, 0xff, 0xca, 0xff,
+0xa0, 0xff, 0x7e, 0xff, 0x6a, 0xff, 0x72, 0xff, 0x80, 0xff, 0x9a, 0xff, 0xc4, 0xff, 0xfe, 0xff,
+0x26, 0x00, 0x50, 0x00, 0x78, 0x00, 0x86, 0x00, 0x74, 0x00, 0x64, 0x00, 0x3a, 0x00, 0x0c, 0x00,
+0xd8, 0xff, 0xaa, 0xff, 0x7e, 0xff, 0x4e, 0xff, 0x48, 0xff, 0x5a, 0xff, 0x72, 0xff, 0xaa, 0xff,
+0xe0, 0xff, 0x0a, 0x00, 0x46, 0x00, 0x78, 0x00, 0x98, 0x00, 0x9e, 0x00, 0x86, 0x00, 0x56, 0x00,
+0x24, 0x00, 0xfe, 0xff, 0xc0, 0xff, 0x7a, 0xff, 0x52, 0xff, 0x32, 0xff, 0x2a, 0xff, 0x4a, 0xff,
+0x7a, 0xff, 0xb2, 0xff, 0xf8, 0xff, 0x30, 0x00, 0x70, 0x00, 0x98, 0x00, 0xb4, 0x00, 0xbe, 0x00,
+0x98, 0x00, 0x66, 0x00, 0x28, 0x00, 0xea, 0xff, 0xb8, 0xff, 0x66, 0xff, 0x3a, 0xff, 0x20, 0xff,
+0x1c, 0xff, 0x4e, 0xff, 0x78, 0xff, 0xc6, 0xff, 0x08, 0x00, 0x34, 0x00, 0x7c, 0x00, 0xa4, 0x00,
+0xc0, 0x00, 0xba, 0x00, 0x94, 0x00, 0x5c, 0x00, 0x10, 0x00, 0xe6, 0xff, 0x9e, 0xff, 0x58, 0xff,
+0x30, 0xff, 0x20, 0xff, 0x30, 0xff, 0x50, 0xff, 0x9e, 0xff, 0xe4, 0xff, 0x16, 0x00, 0x50, 0x00,
+0x86, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xb0, 0x00, 0x8a, 0x00, 0x4c, 0x00, 0x12, 0x00, 0xc6, 0xff,
+0x8a, 0xff, 0x52, 0xff, 0x36, 0xff, 0x2e, 0xff, 0x3a, 0xff, 0x64, 0xff, 0xa6, 0xff, 0xec, 0xff,
+0x22, 0x00, 0x58, 0x00, 0x96, 0x00, 0xb2, 0x00, 0xbc, 0x00, 0xa8, 0x00, 0x7e, 0x00, 0x4a, 0x00,
+0xfc, 0xff, 0xc2, 0xff, 0x82, 0xff, 0x58, 0xff, 0x3a, 0xff, 0x36, 0xff, 0x50, 0xff, 0x70, 0xff,
+0xae, 0xff, 0xe6, 0xff, 0x20, 0x00, 0x5c, 0x00, 0x7e, 0x00, 0x8e, 0x00, 0x94, 0x00, 0x84, 0x00,
+0x5c, 0x00, 0x28, 0x00, 0xf6, 0xff, 0xb4, 0xff, 0x8a, 0xff, 0x7e, 0xff, 0x60, 0xff, 0x60, 0xff,
+0x7a, 0xff, 0x9a, 0xff, 0xc4, 0xff, 0xfa, 0xff, 0x26, 0x00, 0x48, 0x00, 0x5a, 0x00, 0x6e, 0x00,
+0x64, 0x00, 0x58, 0x00, 0x3e, 0x00, 0x0e, 0x00, 0xea, 0xff, 0xba, 0xff, 0xa0, 0xff, 0x9a, 0xff,
+0x90, 0xff, 0x8a, 0xff, 0x90, 0xff, 0xb2, 0xff, 0xda, 0xff, 0xf6, 0xff, 0x12, 0x00, 0x2c, 0x00,
+0x40, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x34, 0x00, 0x1e, 0x00, 0x0a, 0x00, 0xe8, 0xff, 0xcc, 0xff,
+0xb0, 0xff, 0xb8, 0xff, 0xb6, 0xff, 0xa8, 0xff, 0xba, 0xff, 0xca, 0xff, 0xda, 0xff, 0xf8, 0xff,
+0x04, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x20, 0x00, 0x12, 0x00, 0x0c, 0x00, 0xf6, 0xff,
+0xf2, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xe2, 0xff, 0xe6, 0xff, 0xd6, 0xff, 0xea, 0xff,
+0xec, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xfa, 0xff,
+0xf6, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0x04, 0x00, 0x06, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfc, 0xff,
+0xf8, 0xff, 0xf0, 0xff, 0xe4, 0xff, 0xd6, 0xff, 0xca, 0xff, 0xc8, 0xff, 0xcc, 0xff, 0xc8, 0xff,
+0xd6, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0x0e, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x2a, 0x00,
+0x2e, 0x00, 0x10, 0x00, 0x02, 0x00, 0xe8, 0xff, 0xd2, 0xff, 0xc2, 0xff, 0x9e, 0xff, 0xa6, 0xff,
+0xb2, 0xff, 0xb8, 0xff, 0xce, 0xff, 0xea, 0xff, 0xfe, 0xff, 0x22, 0x00, 0x52, 0x00, 0x5e, 0x00,
+0x58, 0x00, 0x52, 0x00, 0x46, 0x00, 0x2c, 0x00, 0x08, 0x00, 0xea, 0xff, 0xc0, 0xff, 0x92, 0xff,
+0x88, 0xff, 0x7e, 0xff, 0x84, 0xff, 0x92, 0xff, 0xb4, 0xff, 0xe2, 0xff, 0x04, 0x00, 0x3a, 0x00,
+0x5c, 0x00, 0x72, 0x00, 0x7e, 0x00, 0x6c, 0x00, 0x4a, 0x00, 0x30, 0x00, 0xfe, 0xff, 0xce, 0xff,
+0x9c, 0xff, 0x7e, 0xff, 0x62, 0xff, 0x62, 0xff, 0x70, 0xff, 0x82, 0xff, 0xac, 0xff, 0xe4, 0xff,
+0x24, 0x00, 0x50, 0x00, 0x7a, 0x00, 0x8e, 0x00, 0x90, 0x00, 0x80, 0x00, 0x54, 0x00, 0x20, 0x00,
+0xec, 0xff, 0xba, 0xff, 0x86, 0xff, 0x58, 0xff, 0x38, 0xff, 0x42, 0xff, 0x52, 0xff, 0x88, 0xff,
+0xbe, 0xff, 0xf2, 0xff, 0x2e, 0x00, 0x66, 0x00, 0x98, 0x00, 0xa6, 0x00, 0xa0, 0x00, 0x82, 0x00,
+0x50, 0x00, 0x0e, 0x00, 0xda, 0xff, 0x9a, 0xff, 0x62, 0xff, 0x40, 0xff, 0x24, 0xff, 0x28, 0xff,
+0x4a, 0xff, 0x84, 0xff, 0xcc, 0xff, 0x02, 0x00, 0x40, 0x00, 0x82, 0x00, 0xac, 0x00, 0xb4, 0x00,
+0xaa, 0x00, 0x84, 0x00, 0x4e, 0x00, 0xfe, 0xff, 0xd2, 0xff, 0x8c, 0xff, 0x5a, 0xff, 0x3c, 0xff,
+0x20, 0xff, 0x38, 0xff, 0x62, 0xff, 0xa0, 0xff, 0xe0, 0xff, 0x1c, 0x00, 0x5e, 0x00, 0x96, 0x00,
+0xb2, 0x00, 0xc2, 0x00, 0x9e, 0x00, 0x7a, 0x00, 0x32, 0x00, 0xf0, 0xff, 0xc6, 0xff, 0x7c, 0xff,
+0x4a, 0xff, 0x34, 0xff, 0x2c, 0xff, 0x3a, 0xff, 0x6e, 0xff, 0xb4, 0xff, 0xf6, 0xff, 0x24, 0x00,
+0x66, 0x00, 0x8e, 0x00, 0xa4, 0x00, 0xa6, 0x00, 0x8a, 0x00, 0x58, 0x00, 0x1e, 0x00, 0xe2, 0xff,
+0xa8, 0xff, 0x7c, 0xff, 0x58, 0xff, 0x42, 0xff, 0x40, 0xff, 0x66, 0xff, 0x90, 0xff, 0xc8, 0xff,
+0x08, 0x00, 0x40, 0x00, 0x68, 0x00, 0x8c, 0x00, 0x9a, 0x00, 0x94, 0x00, 0x78, 0x00, 0x4c, 0x00,
+0x10, 0x00, 0xde, 0xff, 0xae, 0xff, 0x88, 0xff, 0x6a, 0xff, 0x54, 0xff, 0x62, 0xff, 0x78, 0xff,
+0xa8, 0xff, 0xe0, 0xff, 0x08, 0x00, 0x32, 0x00, 0x58, 0x00, 0x6e, 0x00, 0x82, 0x00, 0x72, 0x00,
+0x50, 0x00, 0x32, 0x00, 0xf8, 0xff, 0xe0, 0xff, 0xaa, 0xff, 0x90, 0xff, 0x7c, 0xff, 0x74, 0xff,
+0x80, 0xff, 0x92, 0xff, 0xba, 0xff, 0xe0, 0xff, 0x06, 0x00, 0x32, 0x00, 0x48, 0x00, 0x46, 0x00,
+0x60, 0x00, 0x58, 0x00, 0x44, 0x00, 0x24, 0x00, 0x02, 0x00, 0xdc, 0xff, 0xc6, 0xff, 0xb4, 0xff,
+0xa6, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0xb4, 0xff, 0xce, 0xff, 0xdc, 0xff, 0xfa, 0xff, 0x14, 0x00,
+0x26, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x1e, 0x00, 0x12, 0x00, 0xf6, 0xff, 0xe6, 0xff,
+0xcc, 0xff, 0xc2, 0xff, 0xbe, 0xff, 0xb8, 0xff, 0xc2, 0xff, 0xc4, 0xff, 0xd2, 0xff, 0xda, 0xff,
+0xe4, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xf2, 0xff,
+0xf0, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xee, 0xff, 0xe2, 0xff, 0xe6, 0xff, 0xe4, 0xff, 0xe2, 0xff,
+0xe4, 0xff, 0xe0, 0xff, 0xd6, 0xff, 0xce, 0xff, 0xde, 0xff, 0xe0, 0xff, 0xdc, 0xff, 0xf4, 0xff,
+0xf6, 0xff, 0xfc, 0xff, 0x0e, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x14, 0x00,
+0xfc, 0xff, 0xf8, 0xff, 0xe0, 0xff, 0xc4, 0xff, 0xb4, 0xff, 0xb2, 0xff, 0xc0, 0xff, 0xb8, 0xff,
+0xba, 0xff, 0xda, 0xff, 0xe8, 0xff, 0x06, 0x00, 0x22, 0x00, 0x34, 0x00, 0x38, 0x00, 0x32, 0x00,
+0x36, 0x00, 0x38, 0x00, 0x18, 0x00, 0xf8, 0xff, 0xdc, 0xff, 0xb2, 0xff, 0x9e, 0xff, 0x92, 0xff,
+0x98, 0xff, 0x9e, 0xff, 0xb0, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0x1c, 0x00, 0x3e, 0x00, 0x58, 0x00,
+0x64, 0x00, 0x6e, 0x00, 0x5c, 0x00, 0x56, 0x00, 0x24, 0x00, 0xfe, 0xff, 0xcc, 0xff, 0x98, 0xff,
+0x84, 0xff, 0x6c, 0xff, 0x76, 0xff, 0x82, 0xff, 0xa2, 0xff, 0xc8, 0xff, 0xf2, 0xff, 0x26, 0x00,
+0x58, 0x00, 0x7c, 0x00, 0x86, 0x00, 0x84, 0x00, 0x78, 0x00, 0x44, 0x00, 0x20, 0x00, 0xf0, 0xff,
+0xac, 0xff, 0x76, 0xff, 0x44, 0xff, 0x3c, 0xff, 0x4c, 0xff, 0x68, 0xff, 0x94, 0xff, 0xc8, 0xff,
+0xf8, 0xff, 0x38, 0x00, 0x70, 0x00, 0x94, 0x00, 0xae, 0x00, 0xa2, 0x00, 0x88, 0x00, 0x46, 0x00,
+0x10, 0x00, 0xe2, 0xff, 0x9a, 0xff, 0x5c, 0xff, 0x36, 0xff, 0x30, 0xff, 0x3c, 0xff, 0x60, 0xff,
+0xa0, 0xff, 0xe0, 0xff, 0x12, 0x00, 0x52, 0x00, 0x8c, 0x00, 0xae, 0x00, 0xb8, 0x00, 0xae, 0x00,
+0x7e, 0x00, 0x32, 0x00, 0x00, 0x00, 0xb6, 0xff, 0x74, 0xff, 0x48, 0xff, 0x24, 0xff, 0x16, 0xff,
+0x30, 0xff, 0x60, 0xff, 0xaa, 0xff, 0xea, 0xff, 0x1a, 0x00, 0x5c, 0x00, 0x90, 0x00, 0xac, 0x00,
+0xb0, 0x00, 0xa0, 0x00, 0x64, 0x00, 0x1e, 0x00, 0xe2, 0xff, 0xa8, 0xff, 0x68, 0xff, 0x36, 0xff,
+0x1c, 0xff, 0x22, 0xff, 0x46, 0xff, 0x72, 0xff, 0xb8, 0xff, 0xf8, 0xff, 0x32, 0x00, 0x70, 0x00,
+0x9a, 0x00, 0xae, 0x00, 0xa6, 0x00, 0x8a, 0x00, 0x4c, 0x00, 0x06, 0x00, 0xe0, 0xff, 0xa6, 0xff,
+0x6e, 0xff, 0x46, 0xff, 0x30, 0xff, 0x48, 0xff, 0x64, 0xff, 0xa0, 0xff, 0xd4, 0xff, 0x0e, 0x00,
+0x40, 0x00, 0x6a, 0x00, 0x8e, 0x00, 0x9c, 0x00, 0x8a, 0x00, 0x6a, 0x00, 0x38, 0x00, 0xf8, 0xff,
+0xce, 0xff, 0x8e, 0xff, 0x76, 0xff, 0x58, 0xff, 0x4e, 0xff, 0x64, 0xff, 0x7e, 0xff, 0xac, 0xff,
+0xe4, 0xff, 0x18, 0x00, 0x40, 0x00, 0x6a, 0x00, 0x80, 0x00, 0x7e, 0x00, 0x72, 0x00, 0x54, 0x00,
+0x20, 0x00, 0xfe, 0xff, 0xd0, 0xff, 0xa2, 0xff, 0x94, 0xff, 0x80, 0xff, 0x7a, 0xff, 0x84, 0xff,
+0x9a, 0xff, 0xca, 0xff, 0xf0, 0xff, 0x1c, 0x00, 0x3c, 0x00, 0x54, 0x00, 0x62, 0x00, 0x6a, 0x00,
+0x64, 0x00, 0x46, 0x00, 0x10, 0x00, 0xfc, 0xff, 0xe0, 0xff, 0xa8, 0xff, 0xa4, 0xff, 0x94, 0xff,
+0x90, 0xff, 0x92, 0xff, 0xa4, 0xff, 0xc6, 0xff, 0xf4, 0xff, 0x10, 0x00, 0x24, 0x00, 0x30, 0x00,
+0x40, 0x00, 0x36, 0x00, 0x32, 0x00, 0x20, 0x00, 0x04, 0x00, 0xf4, 0xff, 0xdc, 0xff, 0xc6, 0xff,
+0xbc, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xce, 0xff, 0xe8, 0xff, 0xf4, 0xff, 0xfc, 0xff,
+0x0a, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0c, 0x00, 0xfe, 0xff, 0xfa, 0xff, 0xf6, 0xff,
+0xe8, 0xff, 0xe8, 0xff, 0xee, 0xff, 0xe8, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xe4, 0xff,
+0xe6, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xea, 0xff, 0xdc, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xe8, 0xff,
+0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x16, 0x00, 0x06, 0x00, 0x04, 0x00, 0xf6, 0xff, 0xf6, 0xff,
+0xec, 0xff, 0xda, 0xff, 0xce, 0xff, 0xba, 0xff, 0xba, 0xff, 0xc2, 0xff, 0xc0, 0xff, 0xc0, 0xff,
+0xe4, 0xff, 0xf0, 0xff, 0x04, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x2a, 0x00, 0x2a, 0x00,
+0x1e, 0x00, 0x12, 0x00, 0xf4, 0xff, 0xdc, 0xff, 0xb6, 0xff, 0xa4, 0xff, 0xa6, 0xff, 0xa8, 0xff,
+0xaa, 0xff, 0xb2, 0xff, 0xce, 0xff, 0xf0, 0xff, 0x0e, 0x00, 0x36, 0x00, 0x46, 0x00, 0x4c, 0x00,
+0x4a, 0x00, 0x42, 0x00, 0x28, 0x00, 0x06, 0x00, 0xf0, 0xff, 0xbc, 0xff, 0x96, 0xff, 0x82, 0xff,
+0x7e, 0xff, 0x78, 0xff, 0x94, 0xff, 0xa4, 0xff, 0xd8, 0xff, 0x02, 0x00, 0x36, 0x00, 0x56, 0x00,
+0x72, 0x00, 0x7c, 0x00, 0x70, 0x00, 0x52, 0x00, 0x30, 0x00, 0x0a, 0x00, 0xdc, 0xff, 0xa2, 0xff,
+0x78, 0xff, 0x68, 0xff, 0x52, 0xff, 0x60, 0xff, 0x80, 0xff, 0xb8, 0xff, 0xee, 0xff, 0x1e, 0x00,
+0x54, 0x00, 0x7c, 0x00, 0x9e, 0x00, 0x94, 0x00, 0x8a, 0x00, 0x60, 0x00, 0x38, 0x00, 0x00, 0x00,
+0xc4, 0xff, 0x8a, 0xff, 0x52, 0xff, 0x3a, 0xff, 0x32, 0xff, 0x4c, 0xff, 0x7e, 0xff, 0xb6, 0xff,
+0xee, 0xff, 0x16, 0x00, 0x5e, 0x00, 0x96, 0x00, 0xa4, 0x00, 0xac, 0x00, 0x94, 0x00, 0x6c, 0x00,
+0x22, 0x00, 0xf4, 0xff, 0xbe, 0xff, 0x76, 0xff, 0x4a, 0xff, 0x36, 0xff, 0x2a, 0xff, 0x4a, 0xff,
+0x82, 0xff, 0xbe, 0xff, 0xf4, 0xff, 0x2c, 0x00, 0x7a, 0x00, 0xaa, 0x00, 0xb6, 0x00, 0xb2, 0x00,
+0x9e, 0x00, 0x60, 0x00, 0x1e, 0x00, 0xee, 0xff, 0xb0, 0xff, 0x72, 0xff, 0x40, 0xff, 0x22, 0xff,
+0x30, 0xff, 0x56, 0xff, 0x86, 0xff, 0xd8, 0xff, 0x0c, 0x00, 0x48, 0x00, 0x80, 0x00, 0xa2, 0x00,
+0xba, 0x00, 0xb8, 0x00, 0x82, 0x00, 0x40, 0x00, 0x04, 0x00, 0xc4, 0xff, 0x8c, 0xff, 0x4e, 0xff,
+0x2e, 0xff, 0x1e, 0xff, 0x32, 0xff, 0x5e, 0xff, 0x98, 0xff, 0xe2, 0xff, 0x18, 0x00, 0x4e, 0x00,
+0x78, 0x00, 0x9c, 0x00, 0xa8, 0x00, 0x9c, 0x00, 0x70, 0x00, 0x2a, 0x00, 0xf4, 0xff, 0xb4, 0xff,
+0x80, 0xff, 0x5c, 0xff, 0x3e, 0xff, 0x2c, 0xff, 0x5a, 0xff, 0x84, 0xff, 0xb0, 0xff, 0xee, 0xff,
+0x2a, 0x00, 0x5e, 0x00, 0x78, 0x00, 0x92, 0x00, 0x8e, 0x00, 0x82, 0x00, 0x48, 0x00, 0x14, 0x00,
+0xe0, 0xff, 0xb0, 0xff, 0x86, 0xff, 0x5a, 0xff, 0x4c, 0xff, 0x4e, 0xff, 0x6e, 0xff, 0x86, 0xff,
+0xca, 0xff, 0xfc, 0xff, 0x1e, 0x00, 0x52, 0x00, 0x66, 0x00, 0x76, 0x00, 0x62, 0x00, 0x56, 0x00,
+0x38, 0x00, 0x06, 0x00, 0xe2, 0xff, 0xbc, 0xff, 0x98, 0xff, 0x82, 0xff, 0x6e, 0xff, 0x7c, 0xff,
+0x90, 0xff, 0xb4, 0xff, 0xea, 0xff, 0x00, 0x00, 0x20, 0x00, 0x3a, 0x00, 0x4c, 0x00, 0x60, 0x00,
+0x52, 0x00, 0x4c, 0x00, 0x28, 0x00, 0xfe, 0xff, 0xee, 0xff, 0xce, 0xff, 0xbc, 0xff, 0xae, 0xff,
+0xae, 0xff, 0xaa, 0xff, 0xba, 0xff, 0xd0, 0xff, 0xee, 0xff, 0xfe, 0xff, 0x06, 0x00, 0x22, 0x00,
+0x1e, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x1e, 0x00, 0x08, 0x00, 0xfe, 0xff, 0xf0, 0xff, 0xe0, 0xff,
+0xe2, 0xff, 0xdc, 0xff, 0xd8, 0xff, 0xcc, 0xff, 0xd6, 0xff, 0xe0, 0xff, 0xee, 0xff, 0xfa, 0xff,
+0xfa, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0xff,
+0x0a, 0x00, 0x04, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xee, 0xff,
+0xea, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xda, 0xff, 0xde, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xee, 0xff,
+0xf6, 0xff, 0xf4, 0xff, 0x0c, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x14, 0x00,
+0x02, 0x00, 0xde, 0xff, 0xc4, 0xff, 0xb6, 0xff, 0xaa, 0xff, 0xa4, 0xff, 0xa8, 0xff, 0xb6, 0xff,
+0xbc, 0xff, 0xdc, 0xff, 0xf0, 0xff, 0x0a, 0x00, 0x2c, 0x00, 0x3e, 0x00, 0x4c, 0x00, 0x44, 0x00,
+0x3c, 0x00, 0x1e, 0x00, 0xf6, 0xff, 0xdc, 0xff, 0xb6, 0xff, 0x94, 0xff, 0x8c, 0xff, 0x82, 0xff,
+0x8c, 0xff, 0x96, 0xff, 0xb6, 0xff, 0xea, 0xff, 0x06, 0x00, 0x34, 0x00, 0x52, 0x00, 0x68, 0x00,
+0x76, 0x00, 0x5a, 0x00, 0x52, 0x00, 0x26, 0x00, 0xf8, 0xff, 0xce, 0xff, 0x98, 0xff, 0x80, 0xff,
+0x62, 0xff, 0x5a, 0xff, 0x66, 0xff, 0x8e, 0xff, 0xba, 0xff, 0xe6, 0xff, 0x10, 0x00, 0x52, 0x00,
+0x70, 0x00, 0x8c, 0x00, 0x96, 0x00, 0x70, 0x00, 0x54, 0x00, 0x28, 0x00, 0xf0, 0xff, 0xb6, 0xff,
+0x86, 0xff, 0x64, 0xff, 0x48, 0xff, 0x4c, 0xff, 0x62, 0xff, 0x92, 0xff, 0xbc, 0xff, 0xfc, 0xff,
+0x3e, 0x00, 0x74, 0x00, 0x9c, 0x00, 0xb0, 0x00, 0xac, 0x00, 0x8c, 0x00, 0x50, 0x00, 0x1c, 0x00,
+0xec, 0xff, 0xb2, 0xff, 0x82, 0xff, 0x46, 0xff, 0x34, 0xff, 0x4c, 0xff, 0x5e, 0xff, 0xa2, 0xff,
+0xd2, 0xff, 0x12, 0x00, 0x52, 0x00, 0x88, 0x00, 0xb0, 0x00, 0xb6, 0x00, 0xac, 0x00, 0x78, 0x00,
+0x48, 0x00, 0x06, 0x00, 0xdc, 0xff, 0x9a, 0xff, 0x56, 0xff, 0x2c, 0xff, 0x26, 0xff, 0x48, 0xff,
+0x5e, 0xff, 0xae, 0xff, 0xee, 0xff, 0x16, 0x00, 0x5e, 0x00, 0x94, 0x00, 0xb8, 0x00, 0xb0, 0x00,
+0xa4, 0x00, 0x78, 0x00, 0x38, 0x00, 0x04, 0x00, 0xc0, 0xff, 0x86, 0xff, 0x54, 0xff, 0x32, 0xff,
+0x2a, 0xff, 0x4c, 0xff, 0x7c, 0xff, 0xba, 0xff, 0xfe, 0xff, 0x2a, 0x00, 0x6c, 0x00, 0x96, 0x00,
+0xb0, 0x00, 0xac, 0x00, 0x98, 0x00, 0x68, 0x00, 0x1e, 0x00, 0xe6, 0xff, 0xba, 0xff, 0x76, 0xff,
+0x44, 0xff, 0x2a, 0xff, 0x24, 0xff, 0x4e, 0xff, 0x84, 0xff, 0xc8, 0xff, 0x02, 0x00, 0x32, 0x00,
+0x62, 0x00, 0x8c, 0x00, 0x96, 0x00, 0x96, 0x00, 0x7a, 0x00, 0x44, 0x00, 0x12, 0x00, 0xde, 0xff,
+0xa2, 0xff, 0x70, 0xff, 0x4e, 0xff, 0x42, 0xff, 0x42, 0xff, 0x70, 0xff, 0xa4, 0xff, 0xe0, 0xff,
+0x16, 0x00, 0x3a, 0x00, 0x64, 0x00, 0x74, 0x00, 0x8e, 0x00, 0x7e, 0x00, 0x5c, 0x00, 0x32, 0x00,
+0x02, 0x00, 0xe2, 0xff, 0xa4, 0xff, 0x84, 0xff, 0x70, 0xff, 0x62, 0xff, 0x78, 0xff, 0x8a, 0xff,
+0xae, 0xff, 0xe4, 0xff, 0x10, 0x00, 0x34, 0x00, 0x4a, 0x00, 0x58, 0x00, 0x60, 0x00, 0x4e, 0x00,
+0x40, 0x00, 0x1a, 0x00, 0xf6, 0xff, 0xde, 0xff, 0xa8, 0xff, 0x9c, 0xff, 0x9a, 0xff, 0x8e, 0xff,
+0x9a, 0xff, 0xa4, 0xff, 0xc8, 0xff, 0xec, 0xff, 0x08, 0x00, 0x28, 0x00, 0x2e, 0x00, 0x34, 0x00,
+0x34, 0x00, 0x3c, 0x00, 0x30, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xd2, 0xff, 0xd4, 0xff,
+0xd0, 0xff, 0xc2, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xdc, 0xff, 0xee, 0xff, 0xfc, 0xff, 0x04, 0x00,
+0x0c, 0x00, 0x12, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x0a, 0x00, 0xfc, 0xff, 0xfa, 0xff,
+0xf0, 0xff, 0xe8, 0xff, 0xee, 0xff, 0xe6, 0xff, 0xe0, 0xff, 0xd2, 0xff, 0xda, 0xff, 0xe2, 0xff,
+0xdc, 0xff, 0xde, 0xff, 0xe4, 0xff, 0xee, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0x02, 0x00, 0x06, 0x00,
+0x0e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x04, 0x00, 0xfe, 0xff, 0xf8, 0xff, 0xf0, 0xff,
+0xe2, 0xff, 0xd2, 0xff, 0xc2, 0xff, 0xbe, 0xff, 0xcc, 0xff, 0xd2, 0xff, 0xde, 0xff, 0xf0, 0xff,
+0xfc, 0xff, 0x10, 0x00, 0x16, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x16, 0x00,
+0x00, 0x00, 0xf0, 0xff, 0xd0, 0xff, 0xb0, 0xff, 0x98, 0xff, 0x9a, 0xff, 0x9e, 0xff, 0xa0, 0xff,
+0xb8, 0xff, 0xd4, 0xff, 0xee, 0xff, 0x0e, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x48, 0x00,
+0x3a, 0x00, 0x28, 0x00, 0x08, 0x00, 0xe0, 0xff, 0xc6, 0xff, 0x92, 0xff, 0x78, 0xff, 0x6e, 0xff,
+0x76, 0xff, 0x88, 0xff, 0xa0, 0xff, 0xd6, 0xff, 0xfe, 0xff, 0x2e, 0x00, 0x54, 0x00, 0x64, 0x00,
+0x7c, 0x00, 0x78, 0x00, 0x5c, 0x00, 0x3e, 0x00, 0x10, 0x00, 0xde, 0xff, 0xaa, 0xff, 0x7e, 0xff,
+0x56, 0xff, 0x44, 0xff, 0x5e, 0xff, 0x82, 0xff, 0xa2, 0xff, 0xd6, 0xff, 0x06, 0x00, 0x42, 0x00,
+0x6e, 0x00, 0x90, 0x00, 0x9c, 0x00, 0x86, 0x00, 0x6a, 0x00, 0x36, 0x00, 0x02, 0x00, 0xcc, 0xff,
+0x8c, 0xff, 0x5a, 0xff, 0x40, 0xff, 0x40, 0xff, 0x50, 0xff, 0x78, 0xff, 0xb0, 0xff, 0xee, 0xff,
+0x24, 0x00, 0x56, 0x00, 0x84, 0x00, 0x9e, 0x00, 0xb2, 0x00, 0x96, 0x00, 0x72, 0x00, 0x2e, 0x00,
+0xfa, 0xff, 0xc4, 0xff, 0x80, 0xff, 0x5a, 0xff, 0x38, 0xff, 0x40, 0xff, 0x58, 0xff, 0x7e, 0xff,
+0xce, 0xff, 0xf0, 0xff, 0x26, 0x00, 0x6a, 0x00, 0x92, 0x00, 0xb2, 0x00, 0xaa, 0x00, 0x9a, 0x00,
+0x62, 0x00, 0x20, 0x00, 0xf8, 0xff, 0xb6, 0xff, 0x76, 0xff, 0x4a, 0xff, 0x2a, 0xff, 0x3a, 0xff,
+0x5c, 0xff, 0x8c, 0xff, 0xcc, 0xff, 0xfa, 0xff, 0x32, 0x00, 0x6e, 0x00, 0x96, 0x00, 0xba, 0x00,
+0x9c, 0x00, 0x86, 0x00, 0x5a, 0x00, 0x10, 0x00, 0xe0, 0xff, 0x98, 0xff, 0x60, 0xff, 0x44, 0xff,
+0x2c, 0xff, 0x3e, 0xff, 0x5c, 0xff, 0x96, 0xff, 0xda, 0xff, 0x10, 0x00, 0x4a, 0x00, 0x7e, 0x00,
+0xae, 0x00, 0xb8, 0x00, 0xaa, 0x00, 0x76, 0x00, 0x44, 0x00, 0xfc, 0xff, 0xc2, 0xff, 0x96, 0xff,
+0x56, 0xff, 0x44, 0xff, 0x34, 0xff, 0x50, 0xff, 0x72, 0xff, 0xa8, 0xff, 0xe4, 0xff, 0x1a, 0x00,
+0x56, 0x00, 0x88, 0x00, 0x9a, 0x00, 0x94, 0x00, 0x80, 0x00, 0x48, 0x00, 0x1c, 0x00, 0xf0, 0xff,
+0xac, 0xff, 0x82, 0xff, 0x68, 0xff, 0x50, 0xff, 0x58, 0xff, 0x6c, 0xff, 0x90, 0xff, 0xba, 0xff,
+0xf4, 0xff, 0x22, 0x00, 0x46, 0x00, 0x62, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x50, 0x00, 0x40, 0x00,
+0x02, 0x00, 0xe8, 0xff, 0xc4, 0xff, 0x96, 0xff, 0x90, 0xff, 0x8e, 0xff, 0x86, 0xff, 0x92, 0xff,
+0xb6, 0xff, 0xdc, 0xff, 0x04, 0x00, 0x20, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00,
+0x36, 0x00, 0x16, 0x00, 0xf8, 0xff, 0xdc, 0xff, 0xcc, 0xff, 0xba, 0xff, 0xae, 0xff, 0xa6, 0xff,
+0xa2, 0xff, 0xb6, 0xff, 0xd2, 0xff, 0xea, 0xff, 0xfc, 0xff, 0x00, 0x00, 0x16, 0x00, 0x0e, 0x00,
+0x1a, 0x00, 0x20, 0x00, 0x06, 0x00, 0x0a, 0x00, 0xf2, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xcc, 0xff,
+0xd6, 0xff, 0xe0, 0xff, 0xd0, 0xff, 0xde, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0x00, 0x00,
+0x04, 0x00, 0xfc, 0xff, 0xfe, 0xff, 0x02, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0x04, 0x00,
+0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x04, 0x00, 0xfc, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xe4, 0xff,
+0xe4, 0xff, 0xd0, 0xff, 0xd6, 0xff, 0xe0, 0xff, 0xc6, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xec, 0xff,
+0x00, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x0c, 0x00, 0xfe, 0xff,
+0xec, 0xff, 0xd4, 0xff, 0xb8, 0xff, 0xac, 0xff, 0xaa, 0xff, 0xb4, 0xff, 0xb6, 0xff, 0xc6, 0xff,
+0xe0, 0xff, 0xf8, 0xff, 0x0e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x40, 0x00, 0x3e, 0x00,
+0x16, 0x00, 0xfe, 0xff, 0xe8, 0xff, 0xbe, 0xff, 0xa2, 0xff, 0x8c, 0xff, 0x86, 0xff, 0x8a, 0xff,
+0xa4, 0xff, 0xc0, 0xff, 0xe6, 0xff, 0x0c, 0x00, 0x34, 0x00, 0x5c, 0x00, 0x6a, 0x00, 0x72, 0x00,
+0x62, 0x00, 0x48, 0x00, 0x20, 0x00, 0xea, 0xff, 0xc4, 0xff, 0x90, 0xff, 0x68, 0xff, 0x56, 0xff,
+0x5c, 0xff, 0x62, 0xff, 0x80, 0xff, 0xae, 0xff, 0xec, 0xff, 0x1a, 0x00, 0x52, 0x00, 0x7c, 0x00,
+0x8c, 0x00, 0x96, 0x00, 0x74, 0x00, 0x56, 0x00, 0x26, 0x00, 0xf0, 0xff, 0xba, 0xff, 0x82, 0xff,
+0x54, 0xff, 0x42, 0xff, 0x3a, 0xff, 0x58, 0xff, 0x8c, 0xff, 0xc0, 0xff, 0xfe, 0xff, 0x30, 0x00,
+0x70, 0x00, 0x96, 0x00, 0xae, 0x00, 0xae, 0x00, 0x94, 0x00, 0x60, 0x00, 0x26, 0x00, 0xe2, 0xff,
+0xa8, 0xff, 0x70, 0xff, 0x44, 0xff, 0x30, 0xff, 0x30, 0xff, 0x4a, 0xff, 0x80, 0xff, 0xc2, 0xff,
+0xfc, 0xff, 0x3e, 0x00, 0x76, 0x00, 0x9a, 0x00, 0xb6, 0x00, 0xac, 0x00, 0x8e, 0x00, 0x4e, 0x00,
+0x0c, 0x00, 0xda, 0xff, 0x9c, 0xff, 0x5c, 0xff, 0x3a, 0xff, 0x20, 0xff, 0x32, 0xff, 0x5e, 0xff,
+0x94, 0xff, 0xe4, 0xff, 0x00, 0x00, 0x52, 0x00, 0x90, 0x00, 0xbe, 0x00, 0xc8, 0x00, 0xb0, 0x00,
+0x84, 0x00, 0x4c, 0x00, 0x0a, 0x00, 0xd4, 0xff, 0x9c, 0xff, 0x58, 0xff, 0x36, 0xff, 0x26, 0xff,
+0x42, 0xff, 0x68, 0xff, 0xb4, 0xff, 0xe8, 0xff, 0x22, 0x00, 0x6a, 0x00, 0x96, 0x00, 0xbc, 0x00,
+0xb2, 0x00, 0x96, 0x00, 0x6c, 0x00, 0x30, 0x00, 0xf0, 0xff, 0xb8, 0xff, 0x88, 0xff, 0x50, 0xff,
+0x34, 0xff, 0x36, 0xff, 0x4c, 0xff, 0x82, 0xff, 0xc4, 0xff, 0x00, 0x00, 0x2c, 0x00, 0x66, 0x00,
+0x8c, 0x00, 0xa4, 0x00, 0x98, 0x00, 0x74, 0x00, 0x5a, 0x00, 0x1a, 0x00, 0xec, 0xff, 0xb8, 0xff,
+0x82, 0xff, 0x64, 0xff, 0x4e, 0xff, 0x5a, 0xff, 0x7c, 0xff, 0x98, 0xff, 0xd4, 0xff, 0x08, 0x00,
+0x38, 0x00, 0x68, 0x00, 0x7a, 0x00, 0x84, 0x00, 0x76, 0x00, 0x64, 0x00, 0x36, 0x00, 0x18, 0x00,
+0xe6, 0xff, 0xb2, 0xff, 0x92, 0xff, 0x6a, 0xff, 0x66, 0xff, 0x6c, 0xff, 0x82, 0xff, 0xb8, 0xff,
+0xe8, 0xff, 0xfc, 0xff, 0x26, 0x00, 0x40, 0x00, 0x4e, 0x00, 0x5a, 0x00, 0x60, 0x00, 0x44, 0x00,
+0x1c, 0x00, 0xfa, 0xff, 0xde, 0xff, 0xaa, 0xff, 0x94, 0xff, 0x94, 0xff, 0x84, 0xff, 0x92, 0xff,
+0x9e, 0xff, 0xd4, 0xff, 0xe8, 0xff, 0xf8, 0xff, 0x14, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x36, 0x00,
+0x3c, 0x00, 0x30, 0x00, 0x1a, 0x00, 0xf8, 0xff, 0xea, 0xff, 0xc4, 0xff, 0xb8, 0xff, 0xc2, 0xff,
+0xae, 0xff, 0xb8, 0xff, 0xbe, 0xff, 0xd6, 0xff, 0xea, 0xff, 0xf6, 0xff, 0x00, 0x00, 0x08, 0x00,
+0x12, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x14, 0x00, 0xfe, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xda, 0xff,
+0xe2, 0xff, 0xde, 0xff, 0xd4, 0xff, 0xe0, 0xff, 0xda, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe4, 0xff,
+0xea, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0x06, 0x00, 0x08, 0x00,
+0x14, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x08, 0x00, 0xfc, 0xff, 0xee, 0xff, 0xe4, 0xff,
+0xde, 0xff, 0xce, 0xff, 0xc6, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xdc, 0xff, 0xf0, 0xff, 0xfa, 0xff,
+0x0e, 0x00, 0x1c, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x24, 0x00, 0x28, 0x00, 0x22, 0x00, 0xfc, 0xff,
+0xf0, 0xff, 0xda, 0xff, 0xc0, 0xff, 0xaa, 0xff, 0x98, 0xff, 0xa4, 0xff, 0xb0, 0xff, 0xb8, 0xff,
+0xd4, 0xff, 0xf2, 0xff, 0x06, 0x00, 0x36, 0x00, 0x52, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x4c, 0x00,
+0x3a, 0x00, 0x12, 0x00, 0xf0, 0xff, 0xc4, 0xff, 0xa0, 0xff, 0x90, 0xff, 0x80, 0xff, 0x7a, 0xff,
+0x8a, 0xff, 0xa6, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0x1e, 0x00, 0x52, 0x00, 0x62, 0x00, 0x76, 0x00,
+0x7a, 0x00, 0x5e, 0x00, 0x3e, 0x00, 0x08, 0x00, 0xe4, 0xff, 0xb4, 0xff, 0x86, 0xff, 0x64, 0xff,
+0x56, 0xff, 0x54, 0xff, 0x74, 0xff, 0xa0, 0xff, 0xc8, 0xff, 0x02, 0x00, 0x2a, 0x00, 0x62, 0x00,
+0x7e, 0x00, 0x88, 0x00, 0x82, 0x00, 0x64, 0x00, 0x32, 0x00, 0x00, 0x00, 0xce, 0xff, 0x94, 0xff,
+0x5e, 0xff, 0x4a, 0xff, 0x3c, 0xff, 0x4c, 0xff, 0x70, 0xff, 0xaa, 0xff, 0xda, 0xff, 0x0a, 0x00,
+0x48, 0x00, 0x84, 0x00, 0x98, 0x00, 0xa8, 0x00, 0xa0, 0x00, 0x68, 0x00, 0x2e, 0x00, 0xf0, 0xff,
+0xb8, 0xff, 0x7e, 0xff, 0x4e, 0xff, 0x34, 0xff, 0x28, 0xff, 0x3e, 0xff, 0x6e, 0xff, 0xa0, 0xff,
+0xea, 0xff, 0x1e, 0x00, 0x66, 0x00, 0x9e, 0x00, 0xae, 0x00, 0xb4, 0x00, 0x96, 0x00, 0x6a, 0x00,
+0x1e, 0x00, 0xe6, 0xff, 0xb4, 0xff, 0x78, 0xff, 0x40, 0xff, 0x16, 0xff, 0x20, 0xff, 0x42, 0xff,
+0x7c, 0xff, 0xc2, 0xff, 0xfe, 0xff, 0x2a, 0x00, 0x78, 0x00, 0xa4, 0x00, 0xba, 0x00, 0xb8, 0x00,
+0x92, 0x00, 0x66, 0x00, 0x10, 0x00, 0xdc, 0xff, 0xa4, 0xff, 0x64, 0xff, 0x4c, 0xff, 0x30, 0xff,
+0x3a, 0xff, 0x62, 0xff, 0x90, 0xff, 0xe0, 0xff, 0x14, 0x00, 0x46, 0x00, 0x84, 0x00, 0xa4, 0x00,
+0xba, 0x00, 0xac, 0x00, 0x7c, 0x00, 0x48, 0x00, 0x06, 0x00, 0xc8, 0xff, 0xa4, 0xff, 0x66, 0xff,
+0x56, 0xff, 0x44, 0xff, 0x48, 0xff, 0x72, 0xff, 0xaa, 0xff, 0xe8, 0xff, 0x22, 0x00, 0x46, 0x00,
+0x78, 0x00, 0x90, 0x00, 0x92, 0x00, 0x8a, 0x00, 0x60, 0x00, 0x32, 0x00, 0xf8, 0xff, 0xce, 0xff,
+0x9a, 0xff, 0x78, 0xff, 0x62, 0xff, 0x5e, 0xff, 0x72, 0xff, 0x88, 0xff, 0xc0, 0xff, 0xf2, 0xff,
+0x16, 0x00, 0x56, 0x00, 0x5e, 0x00, 0x70, 0x00, 0x76, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x1a, 0x00,
+0xf4, 0xff, 0xce, 0xff, 0x98, 0xff, 0x94, 0xff, 0x86, 0xff, 0x88, 0xff, 0x8c, 0xff, 0xa6, 0xff,
+0xcc, 0xff, 0xec, 0xff, 0x12, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x32, 0x00,
+0x22, 0x00, 0x04, 0x00, 0xe8, 0xff, 0xcc, 0xff, 0xb6, 0xff, 0xa6, 0xff, 0xaa, 0xff, 0xa6, 0xff,
+0xa8, 0xff, 0xbe, 0xff, 0xd6, 0xff, 0xf6, 0xff, 0x02, 0x00, 0x10, 0x00, 0x14, 0x00, 0x12, 0x00,
+0x14, 0x00, 0x12, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xec, 0xff, 0xec, 0xff, 0xd4, 0xff, 0xc8, 0xff,
+0xd4, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xd8, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xee, 0xff,
+0xf6, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0x00, 0x00,
+0xf4, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xe6, 0xff, 0xd2, 0xff,
+0xd8, 0xff, 0xca, 0xff, 0xda, 0xff, 0xda, 0xff, 0xea, 0xff, 0xf2, 0xff, 0xee, 0xff, 0x08, 0x00,
+0x0a, 0x00, 0x2a, 0x00, 0x20, 0x00, 0x14, 0x00, 0x12, 0x00, 0x06, 0x00, 0x06, 0x00, 0xf6, 0xff,
+0xe2, 0xff, 0xca, 0xff, 0xba, 0xff, 0xb4, 0xff, 0xb8, 0xff, 0xc0, 0xff, 0xc6, 0xff, 0xe6, 0xff,
+0x00, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x46, 0x00, 0x46, 0x00, 0x30, 0x00,
+0x14, 0x00, 0xfa, 0xff, 0xd0, 0xff, 0x9e, 0xff, 0x9c, 0xff, 0x92, 0xff, 0x96, 0xff, 0xa6, 0xff,
+0xb4, 0xff, 0xda, 0xff, 0xfc, 0xff, 0x34, 0x00, 0x54, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0x00,
+0x5a, 0x00, 0x34, 0x00, 0x08, 0x00, 0xe2, 0xff, 0xac, 0xff, 0x82, 0xff, 0x78, 0xff, 0x5c, 0xff,
+0x74, 0xff, 0x8c, 0xff, 0xaa, 0xff, 0xea, 0xff, 0x16, 0x00, 0x4c, 0x00, 0x6a, 0x00, 0x80, 0x00,
+0x8e, 0x00, 0x8a, 0x00, 0x66, 0x00, 0x30, 0x00, 0x02, 0x00, 0xce, 0xff, 0x92, 0xff, 0x68, 0xff,
+0x40, 0xff, 0x42, 0xff, 0x54, 0xff, 0x7e, 0xff, 0xb2, 0xff, 0xee, 0xff, 0x2a, 0x00, 0x5c, 0x00,
+0x8a, 0x00, 0xa2, 0x00, 0xa6, 0x00, 0x8c, 0x00, 0x6c, 0x00, 0x24, 0x00, 0xea, 0xff, 0xb6, 0xff,
+0x70, 0xff, 0x4a, 0xff, 0x28, 0xff, 0x1a, 0xff, 0x4a, 0xff, 0x76, 0xff, 0xbe, 0xff, 0x00, 0x00,
+0x20, 0x00, 0x60, 0x00, 0x8c, 0x00, 0xa6, 0x00, 0xb0, 0x00, 0x8a, 0x00, 0x4c, 0x00, 0x08, 0x00,
+0xd8, 0xff, 0x9a, 0xff, 0x58, 0xff, 0x3c, 0xff, 0x1e, 0xff, 0x26, 0xff, 0x5e, 0xff, 0x8c, 0xff,
+0xd6, 0xff, 0x04, 0x00, 0x34, 0x00, 0x7c, 0x00, 0xa4, 0x00, 0xac, 0x00, 0xa8, 0x00, 0x78, 0x00,
+0x38, 0x00, 0x04, 0x00, 0xca, 0xff, 0x92, 0xff, 0x4e, 0xff, 0x2c, 0xff, 0x2e, 0xff, 0x48, 0xff,
+0x6a, 0xff, 0xa0, 0xff, 0xe2, 0xff, 0x18, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x9a, 0x00, 0xa0, 0x00,
+0x9c, 0x00, 0x5e, 0x00, 0x20, 0x00, 0xf4, 0xff, 0xaa, 0xff, 0x88, 0xff, 0x60, 0xff, 0x3e, 0xff,
+0x44, 0xff, 0x50, 0xff, 0x7c, 0xff, 0xba, 0xff, 0xf8, 0xff, 0x2a, 0x00, 0x56, 0x00, 0x80, 0x00,
+0x9a, 0x00, 0x8e, 0x00, 0x7e, 0x00, 0x5c, 0x00, 0x2a, 0x00, 0xf6, 0xff, 0xba, 0xff, 0x86, 0xff,
+0x68, 0xff, 0x5e, 0xff, 0x68, 0xff, 0x86, 0xff, 0xa2, 0xff, 0xda, 0xff, 0x02, 0x00, 0x36, 0x00,
+0x66, 0x00, 0x72, 0x00, 0x8c, 0x00, 0x82, 0x00, 0x62, 0x00, 0x46, 0x00, 0x0c, 0x00, 0xe4, 0xff,
+0xae, 0xff, 0x8e, 0xff, 0x80, 0xff, 0x7a, 0xff, 0x84, 0xff, 0x94, 0xff, 0xb0, 0xff, 0xe0, 0xff,
+0x0c, 0x00, 0x2e, 0x00, 0x4c, 0x00, 0x56, 0x00, 0x66, 0x00, 0x5a, 0x00, 0x4e, 0x00, 0x28, 0x00,
+0xf6, 0xff, 0xe6, 0xff, 0xb0, 0xff, 0xa0, 0xff, 0xa2, 0xff, 0x92, 0xff, 0x9c, 0xff, 0xb6, 0xff,
+0xca, 0xff, 0xee, 0xff, 0x06, 0x00, 0x20, 0x00, 0x36, 0x00, 0x3a, 0x00, 0x4e, 0x00, 0x40, 0x00,
+0x24, 0x00, 0x08, 0x00, 0xf4, 0xff, 0xd8, 0xff, 0xca, 0xff, 0xba, 0xff, 0xc0, 0xff, 0xb4, 0xff,
+0xbe, 0xff, 0xca, 0xff, 0xcc, 0xff, 0xea, 0xff, 0xf6, 0xff, 0x00, 0x00, 0x14, 0x00, 0x0e, 0x00,
+0xfc, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xe8, 0xff, 0xec, 0xff, 0xd4, 0xff, 0xe4, 0xff,
+0xdc, 0xff, 0xda, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xe2, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xe6, 0xff,
+0xe4, 0xff, 0xda, 0xff, 0xe4, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xea, 0xff, 0x02, 0x00, 0x0e, 0x00,
+0x14, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf6, 0xff, 0xe8, 0xff, 0xde, 0xff,
+0xbc, 0xff, 0xaa, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb4, 0xff, 0xce, 0xff, 0xdc, 0xff, 0xee, 0xff,
+0x10, 0x00, 0x22, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x1a, 0x00, 0xf4, 0xff,
+0xdc, 0xff, 0xbe, 0xff, 0xa4, 0xff, 0x98, 0xff, 0x8c, 0xff, 0x98, 0xff, 0xa6, 0xff, 0xba, 0xff,
+0xe6, 0xff, 0xfe, 0xff, 0x20, 0x00, 0x4a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x4e, 0x00, 0x44, 0x00,
+0x2a, 0x00, 0x00, 0x00, 0xde, 0xff, 0xaa, 0xff, 0x84, 0xff, 0x84, 0xff, 0x7a, 0xff, 0x7c, 0xff,
+0x9e, 0xff, 0xc4, 0xff, 0xe4, 0xff, 0x14, 0x00, 0x48, 0x00, 0x6e, 0x00, 0x8a, 0x00, 0x7c, 0x00,
+0x64, 0x00, 0x50, 0x00, 0x24, 0x00, 0xf6, 0xff, 0xb2, 0xff, 0x8a, 0xff, 0x6e, 0xff, 0x56, 0xff,
+0x58, 0xff, 0x68, 0xff, 0x92, 0xff, 0xb6, 0xff, 0xfe, 0xff, 0x2e, 0x00, 0x5a, 0x00, 0x86, 0x00,
+0x98, 0x00, 0x90, 0x00, 0x6e, 0x00, 0x40, 0x00, 0x10, 0x00, 0xe8, 0xff, 0xb0, 0xff, 0x78, 0xff,
+0x5a, 0xff, 0x48, 0xff, 0x42, 0xff, 0x5c, 0xff, 0xac, 0xff, 0xe4, 0xff, 0x0e, 0x00, 0x4a, 0x00,
+0x78, 0x00, 0xa2, 0x00, 0xac, 0x00, 0xa0, 0x00, 0x7a, 0x00, 0x30, 0x00, 0x02, 0x00, 0xdc, 0xff,
+0x8e, 0xff, 0x58, 0xff, 0x40, 0xff, 0x26, 0xff, 0x4a, 0xff, 0x72, 0xff, 0xa8, 0xff, 0xee, 0xff,
+0x1c, 0x00, 0x58, 0x00, 0x8e, 0x00, 0xae, 0x00, 0xa4, 0x00, 0x8c, 0x00, 0x5e, 0x00, 0x2c, 0x00,
+0xee, 0xff, 0xba, 0xff, 0x6e, 0xff, 0x40, 0xff, 0x2c, 0xff, 0x28, 0xff, 0x4c, 0xff, 0x76, 0xff,
+0xc4, 0xff, 0xf6, 0xff, 0x26, 0x00, 0x68, 0x00, 0x96, 0x00, 0xb4, 0x00, 0xa8, 0x00, 0x8a, 0x00,
+0x56, 0x00, 0x1a, 0x00, 0xe4, 0xff, 0xae, 0xff, 0x74, 0xff, 0x44, 0xff, 0x36, 0xff, 0x3e, 0xff,
+0x5c, 0xff, 0x84, 0xff, 0xc6, 0xff, 0x06, 0x00, 0x32, 0x00, 0x6a, 0x00, 0x88, 0x00, 0xa4, 0x00,
+0x96, 0x00, 0x6c, 0x00, 0x44, 0x00, 0x10, 0x00, 0xd2, 0xff, 0x9e, 0xff, 0x70, 0xff, 0x4e, 0xff,
+0x46, 0xff, 0x48, 0xff, 0x66, 0xff, 0x98, 0xff, 0xd4, 0xff, 0x0a, 0x00, 0x48, 0x00, 0x64, 0x00,
+0x7c, 0x00, 0x8a, 0x00, 0x74, 0x00, 0x5e, 0x00, 0x2a, 0x00, 0xfa, 0xff, 0xd0, 0xff, 0xa2, 0xff,
+0x82, 0xff, 0x68, 0xff, 0x5e, 0xff, 0x72, 0xff, 0x8e, 0xff, 0xb4, 0xff, 0xf0, 0xff, 0x12, 0x00,
+0x3a, 0x00, 0x52, 0x00, 0x62, 0x00, 0x66, 0x00, 0x52, 0x00, 0x3c, 0x00, 0x1c, 0x00, 0xfa, 0xff,
+0xd6, 0xff, 0xac, 0xff, 0x92, 0xff, 0x7e, 0xff, 0x84, 0xff, 0x8c, 0xff, 0xa2, 0xff, 0xc8, 0xff,
+0xee, 0xff, 0x10, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x3e, 0x00, 0x2e, 0x00,
+0x12, 0x00, 0xf6, 0xff, 0xce, 0xff, 0xb8, 0xff, 0xb6, 0xff, 0xae, 0xff, 0xa4, 0xff, 0xb0, 0xff,
+0xc2, 0xff, 0xe2, 0xff, 0x00, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1a, 0x00, 0x2e, 0x00,
+0x24, 0x00, 0x1e, 0x00, 0x04, 0x00, 0xea, 0xff, 0xe4, 0xff, 0xd0, 0xff, 0xca, 0xff, 0xd8, 0xff,
+0xce, 0xff, 0xce, 0xff, 0xe0, 0xff, 0xe6, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf8, 0xff,
+0xfc, 0xff, 0xfe, 0xff, 0x04, 0x00, 0xfa, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xea, 0xff,
+0xe2, 0xff, 0xea, 0xff, 0xe8, 0xff, 0xec, 0xff, 0xee, 0xff, 0xe0, 0xff, 0xd8, 0xff, 0xd8, 0xff,
+0xd6, 0xff, 0xd6, 0xff, 0xda, 0xff, 0xdc, 0xff, 0xee, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0x0a, 0x00,
+0x12, 0x00, 0x18, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x04, 0x00, 0xfc, 0xff, 0xde, 0xff,
+0xc4, 0xff, 0xba, 0xff, 0xb2, 0xff, 0xbc, 0xff, 0xb4, 0xff, 0xbe, 0xff, 0xde, 0xff, 0xf6, 0xff,
+0x0a, 0x00, 0x20, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00,
+0xf2, 0xff, 0xc2, 0xff, 0xaa, 0xff, 0x98, 0xff, 0x7c, 0xff, 0x90, 0xff, 0x9e, 0xff, 0xa4, 0xff,
+0xd4, 0xff, 0xf0, 0xff, 0x10, 0x00, 0x44, 0x00, 0x58, 0x00, 0x68, 0x00, 0x62, 0x00, 0x52, 0x00,
+0x3e, 0x00, 0x0a, 0x00, 0xea, 0xff, 0xb6, 0xff, 0x80, 0xff, 0x78, 0xff, 0x6e, 0xff, 0x72, 0xff,
+0x90, 0xff, 0xac, 0xff, 0xde, 0xff, 0x10, 0x00, 0x36, 0x00, 0x6e, 0x00, 0x8c, 0x00, 0x96, 0x00,
+0x84, 0x00, 0x6e, 0x00, 0x4a, 0x00, 0x06, 0x00, 0xdc, 0xff, 0xac, 0xff, 0x70, 0xff, 0x58, 0xff,
+0x4e, 0xff, 0x60, 0xff, 0x82, 0xff, 0xae, 0xff, 0xe2, 0xff, 0x1c, 0x00, 0x52, 0x00, 0x82, 0x00,
+0x98, 0x00, 0xa4, 0x00, 0x9e, 0x00, 0x6c, 0x00, 0x28, 0x00, 0xf6, 0xff, 0xb6, 0xff, 0x80, 0xff,
+0x54, 0xff, 0x30, 0xff, 0x30, 0xff, 0x4c, 0xff, 0x78, 0xff, 0xc0, 0xff, 0xf2, 0xff, 0x1c, 0x00,
+0x64, 0x00, 0x94, 0x00, 0xac, 0x00, 0xb2, 0x00, 0x90, 0x00, 0x5e, 0x00, 0x16, 0x00, 0xdc, 0xff,
+0xac, 0xff, 0x5e, 0xff, 0x44, 0xff, 0x2c, 0xff, 0x2c, 0xff, 0x5c, 0xff, 0x86, 0xff, 0xcc, 0xff,
+0x08, 0x00, 0x38, 0x00, 0x7e, 0x00, 0xa2, 0x00, 0xc0, 0x00, 0xba, 0x00, 0x90, 0x00, 0x48, 0x00,
+0x04, 0x00, 0xda, 0xff, 0x9c, 0xff, 0x5a, 0xff, 0x3e, 0xff, 0x28, 0xff, 0x36, 0xff, 0x5e, 0xff,
+0x9c, 0xff, 0xd0, 0xff, 0x06, 0x00, 0x48, 0x00, 0x80, 0x00, 0xae, 0x00, 0xb2, 0x00, 0x98, 0x00,
+0x74, 0x00, 0x34, 0x00, 0xee, 0xff, 0xb0, 0xff, 0x7e, 0xff, 0x58, 0xff, 0x38, 0xff, 0x30, 0xff,
+0x3a, 0xff, 0x76, 0xff, 0xa6, 0xff, 0xdc, 0xff, 0x20, 0x00, 0x58, 0x00, 0x8e, 0x00, 0xa2, 0x00,
+0x9e, 0x00, 0x86, 0x00, 0x4e, 0x00, 0x1a, 0x00, 0xec, 0xff, 0xb6, 0xff, 0x8a, 0xff, 0x66, 0xff,
+0x54, 0xff, 0x5c, 0xff, 0x76, 0xff, 0x90, 0xff, 0xc2, 0xff, 0xf8, 0xff, 0x26, 0x00, 0x60, 0x00,
+0x76, 0x00, 0x7e, 0x00, 0x7c, 0x00, 0x66, 0x00, 0x3e, 0x00, 0x0e, 0x00, 0xd8, 0xff, 0x98, 0xff,
+0x72, 0xff, 0x70, 0xff, 0x86, 0xff, 0xaa, 0xff, 0xde, 0xff, 0x0a, 0x00, 0x2e, 0x00, 0x44, 0x00,
+0x58, 0x00, 0x60, 0x00, 0x52, 0x00, 0x42, 0x00, 0x20, 0x00, 0x08, 0x00, 0xe4, 0xff, 0xc6, 0xff,
+0xb0, 0xff, 0xa8, 0xff, 0xb0, 0xff, 0xa2, 0xff, 0xac, 0xff, 0xd0, 0xff, 0xee, 0xff, 0x0e, 0x00,
+0x1c, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x30, 0x00, 0x22, 0x00, 0x10, 0x00, 0xfc, 0xff,
+0xf6, 0xff, 0xde, 0xff, 0xca, 0xff, 0xd0, 0xff, 0xbe, 0xff, 0xc4, 0xff, 0xca, 0xff, 0xd6, 0xff,
+0xfa, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0x08, 0x00, 0x08, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x04, 0x00,
+0x0a, 0x00, 0x02, 0x00, 0xfa, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xe4, 0xff,
+0xe6, 0xff, 0xe2, 0xff, 0xde, 0xff, 0xec, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xea, 0xff, 0xe0, 0xff,
+0xf4, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x06, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x08, 0x00,
+0x08, 0x00, 0xf4, 0xff, 0xee, 0xff, 0xe6, 0xff, 0xc8, 0xff, 0xc2, 0xff, 0xb2, 0xff, 0xac, 0xff,
+0xb8, 0xff, 0xbc, 0xff, 0xcc, 0xff, 0xe0, 0xff, 0xf4, 0xff, 0x10, 0x00, 0x22, 0x00, 0x28, 0x00,
+0x26, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x0a, 0x00, 0xf8, 0xff, 0xd8, 0xff, 0xb4, 0xff, 0x98, 0xff,
+0x8a, 0xff, 0x82, 0xff, 0x98, 0xff, 0xaa, 0xff, 0xc0, 0xff, 0xf0, 0xff, 0x14, 0x00, 0x32, 0x00,
+0x56, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x4c, 0x00, 0x34, 0x00, 0x1e, 0x00, 0xfa, 0xff, 0xd2, 0xff,
+0x9e, 0xff, 0x84, 0xff, 0x6e, 0xff, 0x66, 0xff, 0x7c, 0xff, 0x92, 0xff, 0xca, 0xff, 0x08, 0x00,
+0x26, 0x00, 0x58, 0x00, 0x6c, 0x00, 0x7c, 0x00, 0x82, 0x00, 0x62, 0x00, 0x4e, 0x00, 0x20, 0x00,
+0xec, 0xff, 0xb2, 0xff, 0x76, 0xff, 0x60, 0xff, 0x46, 0xff, 0x3c, 0xff, 0x5c, 0xff, 0x8e, 0xff,
+0xd0, 0xff, 0x02, 0x00, 0x3e, 0x00, 0x60, 0x00, 0x8a, 0x00, 0xa6, 0x00, 0x9c, 0x00, 0x88, 0x00,
+0x56, 0x00, 0x20, 0x00, 0xec, 0xff, 0xa6, 0xff, 0x74, 0xff, 0x48, 0xff, 0x3c, 0xff, 0x3c, 0xff,
+0x52, 0xff, 0xa2, 0xff, 0xd8, 0xff, 0x10, 0x00, 0x4c, 0x00, 0x82, 0x00, 0xac, 0x00, 0xbc, 0x00,
+0xa4, 0x00, 0x8a, 0x00, 0x4c, 0x00, 0x0c, 0x00, 0xdc, 0xff, 0x90, 0xff, 0x52, 0xff, 0x3e, 0xff,
+0x20, 0xff, 0x3c, 0xff, 0x68, 0xff, 0xa0, 0xff, 0xe6, 0xff, 0x06, 0x00, 0x4e, 0x00, 0x8a, 0x00,
+0xa2, 0x00, 0xc2, 0x00, 0xae, 0x00, 0x7e, 0x00, 0x3a, 0x00, 0xee, 0xff, 0xc8, 0xff, 0x76, 0xff,
+0x50, 0xff, 0x3a, 0xff, 0x2a, 0xff, 0x48, 0xff, 0x68, 0xff, 0xb0, 0xff, 0xf6, 0xff, 0x18, 0x00,
+0x5e, 0x00, 0x92, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xa2, 0x00, 0x6c, 0x00, 0x24, 0x00, 0xe6, 0xff,
+0xac, 0xff, 0x78, 0xff, 0x48, 0xff, 0x2a, 0xff, 0x36, 0xff, 0x52, 0xff, 0x8a, 0xff, 0xbc, 0xff,
+0xf6, 0xff, 0x2a, 0x00, 0x5c, 0x00, 0x90, 0x00, 0x9c, 0x00, 0x9a, 0x00, 0x78, 0x00, 0x4a, 0x00,
+0x1c, 0x00, 0xce, 0xff, 0xa0, 0xff, 0x6e, 0xff, 0x4a, 0xff, 0x46, 0xff, 0x48, 0xff, 0x78, 0xff,
+0x9c, 0xff, 0xd0, 0xff, 0x08, 0x00, 0x38, 0x00, 0x58, 0x00, 0x7e, 0x00, 0x96, 0x00, 0x84, 0x00,
+0x60, 0x00, 0x2c, 0x00, 0xf0, 0xff, 0xcc, 0xff, 0x9e, 0xff, 0x7c, 0xff, 0x6e, 0xff, 0x58, 0xff,
+0x72, 0xff, 0x90, 0xff, 0xb8, 0xff, 0xec, 0xff, 0x16, 0x00, 0x40, 0x00, 0x5e, 0x00, 0x6a, 0x00,
+0x6c, 0x00, 0x5a, 0x00, 0x42, 0x00, 0x10, 0x00, 0xee, 0xff, 0xce, 0xff, 0x98, 0xff, 0x90, 0xff,
+0x84, 0xff, 0x7a, 0xff, 0x94, 0xff, 0xac, 0xff, 0xce, 0xff, 0xf2, 0xff, 0x0a, 0x00, 0x2c, 0x00,
+0x3c, 0x00, 0x50, 0x00, 0x4e, 0x00, 0x40, 0x00, 0x1c, 0x00, 0xfc, 0xff, 0xe2, 0xff, 0xce, 0xff,
+0xbe, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb0, 0xff, 0xb2, 0xff, 0xca, 0xff, 0xe2, 0xff, 0xfe, 0xff,
+0x0a, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0xfa, 0xff,
+0xde, 0xff, 0xde, 0xff, 0xd6, 0xff, 0xe0, 0xff, 0xea, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xd8, 0xff,
+0xe6, 0xff, 0xea, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xf8, 0xff, 0xfc, 0xff,
+0x00, 0x00, 0xf4, 0xff, 0xf6, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+0x00, 0x00, 0xf8, 0xff, 0xec, 0xff, 0xe2, 0xff, 0xca, 0xff, 0xc8, 0xff, 0xce, 0xff, 0xd4, 0xff,
+0xd2, 0xff, 0xe0, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0x1a, 0x00, 0x2a, 0x00, 0x2c, 0x00, 0x2c, 0x00,
+0x30, 0x00, 0x28, 0x00, 0x0e, 0x00, 0x04, 0x00, 0xe0, 0xff, 0xc2, 0xff, 0xac, 0xff, 0xa6, 0xff,
+0xa8, 0xff, 0xaa, 0xff, 0xc0, 0xff, 0xd6, 0xff, 0xec, 0xff, 0x08, 0x00, 0x22, 0x00, 0x44, 0x00,
+0x48, 0x00, 0x40, 0x00, 0x40, 0x00, 0x1c, 0x00, 0x02, 0x00, 0xf2, 0xff, 0xca, 0xff, 0xa6, 0xff,
+0x9c, 0xff, 0x7e, 0xff, 0x84, 0xff, 0x98, 0xff, 0xa2, 0xff, 0xd2, 0xff, 0xfa, 0xff, 0x1a, 0x00,
+0x4c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x4c, 0x00, 0x4a, 0x00, 0x30, 0x00, 0x0c, 0x00, 0xf8, 0xff,
+0xba, 0xff, 0x92, 0xff, 0x7a, 0xff, 0x6a, 0xff, 0x74, 0xff, 0x8c, 0xff, 0xa8, 0xff, 0xd0, 0xff,
+0x00, 0x00, 0x30, 0x00, 0x56, 0x00, 0x72, 0x00, 0x7c, 0x00, 0x76, 0x00, 0x5a, 0x00, 0x32, 0x00,
+0xfe, 0xff, 0xd4, 0xff, 0xa0, 0xff, 0x7a, 0xff, 0x6a, 0xff, 0x48, 0xff, 0x50, 0xff, 0x78, 0xff,
+0xa6, 0xff, 0xd4, 0xff, 0x0c, 0x00, 0x54, 0x00, 0x76, 0x00, 0x96, 0x00, 0xa0, 0x00, 0x80, 0x00,
+0x60, 0x00, 0x20, 0x00, 0xfa, 0xff, 0xd0, 0xff, 0x8c, 0xff, 0x5e, 0xff, 0x3e, 0xff, 0x2e, 0xff,
+0x4c, 0xff, 0x7a, 0xff, 0xb8, 0xff, 0xfa, 0xff, 0x30, 0x00, 0x74, 0x00, 0x9e, 0x00, 0xba, 0x00,
+0xbc, 0x00, 0xa0, 0x00, 0x6a, 0x00, 0x22, 0x00, 0xea, 0xff, 0xc0, 0xff, 0x66, 0xff, 0x46, 0xff,
+0x28, 0xff, 0x1a, 0xff, 0x4c, 0xff, 0x84, 0xff, 0xd0, 0xff, 0x0a, 0x00, 0x44, 0x00, 0x8c, 0x00,
+0xb0, 0x00, 0xcc, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x62, 0x00, 0x10, 0x00, 0xd8, 0xff, 0x9c, 0xff,
+0x5a, 0xff, 0x2a, 0xff, 0x1e, 0xff, 0x20, 0xff, 0x48, 0xff, 0x90, 0xff, 0xdc, 0xff, 0x20, 0x00,
+0x5c, 0x00, 0x90, 0x00, 0xb4, 0x00, 0xc4, 0x00, 0xb6, 0x00, 0x82, 0x00, 0x48, 0x00, 0x10, 0x00,
+0xc4, 0xff, 0x94, 0xff, 0x56, 0xff, 0x28, 0xff, 0x26, 0xff, 0x40, 0xff, 0x6e, 0xff, 0xaa, 0xff,
+0xf8, 0xff, 0x2e, 0x00, 0x60, 0x00, 0x9a, 0x00, 0xb4, 0x00, 0xac, 0x00, 0x90, 0x00, 0x64, 0x00,
+0x28, 0x00, 0xf8, 0xff, 0xc0, 0xff, 0x82, 0xff, 0x6c, 0xff, 0x46, 0xff, 0x48, 0xff, 0x64, 0xff,
+0x80, 0xff, 0xba, 0xff, 0xf4, 0xff, 0x2a, 0x00, 0x52, 0x00, 0x6c, 0x00, 0x7a, 0x00, 0x7a, 0x00,
+0x5a, 0x00, 0x3e, 0x00, 0x0e, 0x00, 0xea, 0xff, 0xc2, 0xff, 0x90, 0xff, 0x82, 0xff, 0x76, 0xff,
+0x72, 0xff, 0x86, 0xff, 0xa2, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0x14, 0x00, 0x3e, 0x00, 0x4a, 0x00,
+0x52, 0x00, 0x50, 0x00, 0x3c, 0x00, 0x22, 0x00, 0x04, 0x00, 0xea, 0xff, 0xd4, 0xff, 0xba, 0xff,
+0xaa, 0xff, 0xa2, 0xff, 0x9c, 0xff, 0xa8, 0xff, 0xc6, 0xff, 0xe2, 0xff, 0xf4, 0xff, 0x06, 0x00,
+0x1c, 0x00, 0x16, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0xfa, 0xff, 0xee, 0xff,
+0xda, 0xff, 0xca, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xd4, 0xff, 0xd6, 0xff, 0xd0, 0xff, 0xe6, 0xff,
+0xf8, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xee, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x06, 0x00,
+0xfc, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x02, 0x00, 0xf8, 0xff, 0xfa, 0xff, 0xf0, 0xff,
+0xe8, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xe6, 0xff, 0xdc, 0xff, 0xe8, 0xff,
+0xf6, 0xff, 0xf6, 0xff, 0x00, 0x00, 0x04, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x22, 0x00,
+0x10, 0x00, 0x00, 0x00, 0xf4, 0xff, 0xdc, 0xff, 0xcc, 0xff, 0xb8, 0xff, 0xb4, 0xff, 0xba, 0xff,
+0xbc, 0xff, 0xc8, 0xff, 0xe4, 0xff, 0xfc, 0xff, 0x12, 0x00, 0x28, 0x00, 0x34, 0x00, 0x3a, 0x00,
+0x36, 0x00, 0x2a, 0x00, 0x20, 0x00, 0x06, 0x00, 0xe8, 0xff, 0xce, 0xff, 0xa4, 0xff, 0xa2, 0xff,
+0x9a, 0xff, 0xa2, 0xff, 0xb0, 0xff, 0xc6, 0xff, 0xf6, 0xff, 0x08, 0x00, 0x30, 0x00, 0x50, 0x00,
+0x5a, 0x00, 0x5c, 0x00, 0x52, 0x00, 0x44, 0x00, 0x20, 0x00, 0xfa, 0xff, 0xd6, 0xff, 0xa0, 0xff,
+0x86, 0xff, 0x78, 0xff, 0x6a, 0xff, 0x7e, 0xff, 0x92, 0xff, 0xc0, 0xff, 0xf0, 0xff, 0x12, 0x00,
+0x3c, 0x00, 0x62, 0x00, 0x72, 0x00, 0x74, 0x00, 0x6a, 0x00, 0x4e, 0x00, 0x1c, 0x00, 0xe8, 0xff,
+0xb6, 0xff, 0x7c, 0xff, 0x5e, 0xff, 0x52, 0xff, 0x4c, 0xff, 0x68, 0xff, 0x86, 0xff, 0xb6, 0xff,
+0xf2, 0xff, 0x24, 0x00, 0x58, 0x00, 0x82, 0x00, 0x9c, 0x00, 0x96, 0x00, 0x88, 0x00, 0x54, 0x00,
+0x1c, 0x00, 0xe4, 0xff, 0xae, 0xff, 0x76, 0xff, 0x42, 0xff, 0x38, 0xff, 0x40, 0xff, 0x4e, 0xff,
+0x94, 0xff, 0xc8, 0xff, 0xfc, 0xff, 0x2a, 0x00, 0x68, 0x00, 0x8e, 0x00, 0xa8, 0x00, 0xa6, 0x00,
+0x7c, 0x00, 0x4c, 0x00, 0xfe, 0xff, 0xcc, 0xff, 0x8c, 0xff, 0x54, 0xff, 0x38, 0xff, 0x2a, 0xff,
+0x34, 0xff, 0x56, 0xff, 0x90, 0xff, 0xd6, 0xff, 0x08, 0x00, 0x4c, 0x00, 0x88, 0x00, 0xa2, 0x00,
+0xb8, 0x00, 0xa4, 0x00, 0x78, 0x00, 0x3a, 0x00, 0xfc, 0xff, 0xd4, 0xff, 0x86, 0xff, 0x5e, 0xff,
+0x36, 0xff, 0x2a, 0xff, 0x52, 0xff, 0x70, 0xff, 0xb0, 0xff, 0xf8, 0xff, 0x1c, 0x00, 0x5e, 0x00,
+0x98, 0x00, 0xb4, 0x00, 0xb0, 0x00, 0xa0, 0x00, 0x6e, 0x00, 0x22, 0x00, 0x00, 0x00, 0xbe, 0xff,
+0x80, 0xff, 0x5a, 0xff, 0x36, 0xff, 0x36, 0xff, 0x52, 0xff, 0x84, 0xff, 0xb8, 0xff, 0xfe, 0xff,
+0x28, 0x00, 0x58, 0x00, 0x96, 0x00, 0xa6, 0x00, 0xa2, 0x00, 0x86, 0x00, 0x56, 0x00, 0x26, 0x00,
+0xe8, 0xff, 0xb4, 0xff, 0x86, 0xff, 0x60, 0xff, 0x46, 0xff, 0x48, 0xff, 0x7a, 0xff, 0x9c, 0xff,
+0xd0, 0xff, 0x00, 0x00, 0x3e, 0x00, 0x60, 0x00, 0x80, 0x00, 0xa0, 0x00, 0x90, 0x00, 0x72, 0x00,
+0x58, 0x00, 0x14, 0x00, 0xdc, 0xff, 0xbc, 0xff, 0x90, 0xff, 0x78, 0xff, 0x6c, 0xff, 0x70, 0xff,
+0x86, 0xff, 0xa0, 0xff, 0xd2, 0xff, 0x00, 0x00, 0x2e, 0x00, 0x4c, 0x00, 0x60, 0x00, 0x68, 0x00,
+0x5c, 0x00, 0x4a, 0x00, 0x24, 0x00, 0x02, 0x00, 0xd8, 0xff, 0xb2, 0xff, 0x9e, 0xff, 0x8c, 0xff,
+0x86, 0xff, 0x90, 0xff, 0x9a, 0xff, 0xba, 0xff, 0xdc, 0xff, 0xfa, 0xff, 0x1c, 0x00, 0x32, 0x00,
+0x3e, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0xe8, 0xff, 0xd0, 0xff,
+0xce, 0xff, 0xbc, 0xff, 0xba, 0xff, 0xb2, 0xff, 0xc6, 0xff, 0xd8, 0xff, 0xf0, 0xff, 0x02, 0x00,
+0x08, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x12, 0x00, 0x04, 0x00, 0xf4, 0xff,
+0xf4, 0xff, 0xe6, 0xff, 0xd6, 0xff, 0xdc, 0xff, 0xd6, 0xff, 0xd0, 0xff, 0xd6, 0xff, 0xe2, 0xff,
+0xda, 0xff, 0xe0, 0xff, 0xec, 0xff, 0xea, 0xff, 0xf4, 0xff, 0xee, 0xff, 0xf0, 0xff, 0x00, 0x00,
+0xf6, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xf6, 0xff,
+0xf2, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xdc, 0xff, 0xe0, 0xff, 0xdc, 0xff,
+0xe2, 0xff, 0xf6, 0xff, 0x02, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x26, 0x00,
+0x2a, 0x00, 0x10, 0x00, 0xfe, 0xff, 0xee, 0xff, 0xd2, 0xff, 0xbe, 0xff, 0xb0, 0xff, 0xb4, 0xff,
+0xae, 0xff, 0xb0, 0xff, 0xc2, 0xff, 0xde, 0xff, 0xfc, 0xff, 0x1e, 0x00, 0x42, 0x00, 0x40, 0x00,
+0x50, 0x00, 0x4a, 0x00, 0x3e, 0x00, 0x24, 0x00, 0x02, 0x00, 0xe0, 0xff, 0xb8, 0xff, 0x94, 0xff,
+0x88, 0xff, 0x80, 0xff, 0x88, 0xff, 0x92, 0xff, 0xbc, 0xff, 0xee, 0xff, 0x12, 0x00, 0x48, 0x00,
+0x6a, 0x00, 0x76, 0x00, 0x88, 0x00, 0x7a, 0x00, 0x5a, 0x00, 0x30, 0x00, 0xfc, 0xff, 0xc6, 0xff,
+0x9c, 0xff, 0x7c, 0xff, 0x5c, 0xff, 0x60, 0xff, 0x64, 0xff, 0x86, 0xff, 0xb8, 0xff, 0xf6, 0xff,
+0x30, 0x00, 0x6a, 0x00, 0x84, 0x00, 0x96, 0x00, 0x96, 0x00, 0x76, 0x00, 0x46, 0x00, 0x1a, 0x00,
+0xe2, 0xff, 0xa6, 0xff, 0x6a, 0xff, 0x3c, 0xff, 0x26, 0xff, 0x30, 0xff, 0x5a, 0xff, 0x8e, 0xff,
+0xca, 0xff, 0x0e, 0x00, 0x50, 0x00, 0x84, 0x00, 0xa8, 0x00, 0xae, 0x00, 0xa4, 0x00, 0x80, 0x00,
+0x40, 0x00, 0x0c, 0x00, 0xcc, 0xff, 0x86, 0xff, 0x58, 0xff, 0x2a, 0xff, 0x22, 0xff, 0x42, 0xff,
+0x6a, 0xff, 0xb4, 0xff, 0xee, 0xff, 0x24, 0x00, 0x64, 0x00, 0x92, 0x00, 0xb0, 0x00, 0xb4, 0x00,
+0xa4, 0x00, 0x76, 0x00, 0x30, 0x00, 0xf2, 0xff, 0xb8, 0xff, 0x70, 0xff, 0x44, 0xff, 0x2e, 0xff,
+0x26, 0xff, 0x46, 0xff, 0x72, 0xff, 0xb2, 0xff, 0xf0, 0xff, 0x22, 0x00, 0x68, 0x00, 0x94, 0x00,
+0xa8, 0x00, 0xa6, 0x00, 0x90, 0x00, 0x54, 0x00, 0x12, 0x00, 0xe4, 0xff, 0xaa, 0xff, 0x6e, 0xff,
+0x42, 0xff, 0x2c, 0xff, 0x34, 0xff, 0x58, 0xff, 0x86, 0xff, 0xca, 0xff, 0x0a, 0x00, 0x3a, 0x00,
+0x72, 0x00, 0x9e, 0x00, 0xae, 0x00, 0xa6, 0x00, 0x8a, 0x00, 0x54, 0x00, 0x16, 0x00, 0xda, 0xff,
+0xa8, 0xff, 0x6e, 0xff, 0x40, 0xff, 0x40, 0xff, 0x4e, 0xff, 0x6c, 0xff, 0x9e, 0xff, 0xdc, 0xff,
+0x14, 0x00, 0x3e, 0x00, 0x70, 0x00, 0x8e, 0x00, 0x98, 0x00, 0x8c, 0x00, 0x66, 0x00, 0x3e, 0x00,
+0x00, 0x00, 0xcc, 0xff, 0x98, 0xff, 0x78, 0xff, 0x5e, 0xff, 0x52, 0xff, 0x64, 0xff, 0x7e, 0xff,
+0xae, 0xff, 0xe6, 0xff, 0x0e, 0x00, 0x46, 0x00, 0x5c, 0x00, 0x72, 0x00, 0x80, 0x00, 0x6c, 0x00,
+0x54, 0x00, 0x26, 0x00, 0x00, 0x00, 0xc6, 0xff, 0xa8, 0xff, 0x98, 0xff, 0x7c, 0xff, 0x84, 0xff,
+0x8a, 0xff, 0xaa, 0xff, 0xd0, 0xff, 0xf6, 0xff, 0x20, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x5a, 0x00,
+0x52, 0x00, 0x4e, 0x00, 0x2e, 0x00, 0x10, 0x00, 0xf8, 0xff, 0xd2, 0xff, 0xb4, 0xff, 0xa4, 0xff,
+0x9a, 0xff, 0x96, 0xff, 0xa0, 0xff, 0xb2, 0xff, 0xca, 0xff, 0xea, 0xff, 0x00, 0x00, 0x1c, 0x00,
+0x26, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x2a, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xfa, 0xff, 0xdc, 0xff,
+0xc2, 0xff, 0xc6, 0xff, 0xc0, 0xff, 0xba, 0xff, 0xc6, 0xff, 0xce, 0xff, 0xda, 0xff, 0xe8, 0xff,
+0xf6, 0xff, 0x02, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x18, 0x00, 0x14, 0x00, 0x06, 0x00,
+0xfe, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xea, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xde, 0xff, 0xd8, 0xff,
+0xce, 0xff, 0xd0, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xde, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xfa, 0xff,
+0xfc, 0xff, 0xfc, 0xff, 0x12, 0x00, 0x16, 0x00, 0x18, 0x00, 0x16, 0x00, 0x14, 0x00, 0x00, 0x00,
+0xea, 0xff, 0xdc, 0xff, 0xc4, 0xff, 0xc0, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xbc, 0xff, 0xc0, 0xff,
+0xc8, 0xff, 0xe4, 0xff, 0xf2, 0xff, 0x12, 0x00, 0x32, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x40, 0x00,
+0x36, 0x00, 0x24, 0x00, 0x06, 0x00, 0xf0, 0xff, 0xc8, 0xff, 0xac, 0xff, 0x9e, 0xff, 0x92, 0xff,
+0x98, 0xff, 0xa2, 0xff, 0xb6, 0xff, 0xe0, 0xff, 0xf4, 0xff, 0x16, 0x00, 0x42, 0x00, 0x58, 0x00,
+0x66, 0x00, 0x50, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x08, 0x00, 0xe4, 0xff, 0xb2, 0xff, 0x94, 0xff,
+0x78, 0xff, 0x66, 0xff, 0x6e, 0xff, 0x94, 0xff, 0xa6, 0xff, 0xd6, 0xff, 0x04, 0x00, 0x30, 0x00,
+0x6c, 0x00, 0x86, 0x00, 0x8a, 0x00, 0x7e, 0x00, 0x5c, 0x00, 0x3c, 0x00, 0x08, 0x00, 0xd6, 0xff,
+0xa0, 0xff, 0x74, 0xff, 0x5c, 0xff, 0x50, 0xff, 0x5c, 0xff, 0x86, 0xff, 0xac, 0xff, 0xec, 0xff,
+0x28, 0x00, 0x56, 0x00, 0x8c, 0x00, 0x9c, 0x00, 0xa2, 0x00, 0x8a, 0x00, 0x5e, 0x00, 0x2a, 0x00,
+0xf4, 0xff, 0xb2, 0xff, 0x7e, 0xff, 0x50, 0xff, 0x2e, 0xff, 0x3a, 0xff, 0x4a, 0xff, 0x80, 0xff,
+0xbe, 0xff, 0xf8, 0xff, 0x2e, 0x00, 0x68, 0x00, 0x98, 0x00, 0xae, 0x00, 0xa6, 0x00, 0x88, 0x00,
+0x54, 0x00, 0x10, 0x00, 0xda, 0xff, 0x94, 0xff, 0x62, 0xff, 0x3e, 0xff, 0x22, 0xff, 0x36, 0xff,
+0x54, 0xff, 0x8e, 0xff, 0xde, 0xff, 0x12, 0x00, 0x48, 0x00, 0x82, 0x00, 0xae, 0x00, 0xb6, 0x00,
+0xaa, 0x00, 0x80, 0x00, 0x4e, 0x00, 0x02, 0x00, 0xce, 0xff, 0x90, 0xff, 0x52, 0xff, 0x3c, 0xff,
+0x20, 0xff, 0x38, 0xff, 0x60, 0xff, 0x96, 0xff, 0xe0, 0xff, 0x16, 0x00, 0x4c, 0x00, 0x8a, 0x00,
+0xac, 0x00, 0xb2, 0x00, 0x9a, 0x00, 0x72, 0x00, 0x32, 0x00, 0xf4, 0xff, 0xc0, 0xff, 0x7e, 0xff,
+0x4e, 0xff, 0x36, 0xff, 0x34, 0xff, 0x3c, 0xff, 0x6a, 0xff, 0xac, 0xff, 0xe2, 0xff, 0x2a, 0x00,
+0x5c, 0x00, 0x8e, 0x00, 0xac, 0x00, 0xa4, 0x00, 0x8a, 0x00, 0x60, 0x00, 0x2c, 0x00, 0xea, 0xff,
+0xb6, 0xff, 0x90, 0xff, 0x60, 0xff, 0x4a, 0xff, 0x44, 0xff, 0x68, 0xff, 0x92, 0xff, 0xcc, 0xff,
+0x06, 0x00, 0x3c, 0x00, 0x66, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x8c, 0x00, 0x6c, 0x00, 0x46, 0x00,
+0x16, 0x00, 0xdc, 0xff, 0xba, 0xff, 0x8c, 0xff, 0x6a, 0xff, 0x60, 0xff, 0x70, 0xff, 0x88, 0xff,
+0xa2, 0xff, 0xde, 0xff, 0x04, 0x00, 0x30, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x60, 0x00, 0x5c, 0x00,
+0x4a, 0x00, 0x28, 0x00, 0x02, 0x00, 0xe4, 0xff, 0xc0, 0xff, 0x9c, 0xff, 0xa0, 0xff, 0x96, 0xff,
+0x9c, 0xff, 0xa8, 0xff, 0xc0, 0xff, 0xe8, 0xff, 0x08, 0x00, 0x22, 0x00, 0x32, 0x00, 0x3a, 0x00,
+0x36, 0x00, 0x36, 0x00, 0x28, 0x00, 0x12, 0x00, 0x00, 0x00, 0xea, 0xff, 0xd8, 0xff, 0xba, 0xff,
+0xc4, 0xff, 0xc2, 0xff, 0xba, 0xff, 0xc2, 0xff, 0xd8, 0xff, 0xf6, 0xff, 0x00, 0x00, 0x00, 0x00,
+0x0a, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0xfe, 0xff, 0xee, 0xff, 0xf2, 0xff,
+0xea, 0xff, 0xd4, 0xff, 0xe2, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xf0, 0xff,
+0xd6, 0xff, 0xde, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf6, 0xff,
+0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf2, 0xff, 0xf2, 0xff,
+0xf0, 0xff, 0xd6, 0xff, 0xd0, 0xff, 0xc4, 0xff, 0xca, 0xff, 0xd6, 0xff, 0xca, 0xff, 0xda, 0xff,
+0xea, 0xff, 0xf8, 0xff, 0x00, 0x00, 0x16, 0x00, 0x24, 0x00, 0x24, 0x00, 0x26, 0x00, 0x10, 0x00,
+0x0c, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xd2, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xa2, 0xff, 0xa2, 0xff,
+0xb0, 0xff, 0xc4, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0x26, 0x00, 0x44, 0x00, 0x44, 0x00, 0x50, 0x00,
+0x3a, 0x00, 0x3e, 0x00, 0x20, 0x00, 0xfa, 0xff, 0xdc, 0xff, 0xb0, 0xff, 0x98, 0xff, 0x8a, 0xff,
+0x86, 0xff, 0x98, 0xff, 0xa2, 0xff, 0xd4, 0xff, 0xfa, 0xff, 0x1a, 0x00, 0x4c, 0x00, 0x60, 0x00,
+0x70, 0x00, 0x70, 0x00, 0x60, 0x00, 0x4e, 0x00, 0x24, 0x00, 0xec, 0xff, 0xbc, 0xff, 0x92, 0xff,
+0x78, 0xff, 0x64, 0xff, 0x64, 0xff, 0x7c, 0xff, 0xa0, 0xff, 0xd2, 0xff, 0x06, 0x00, 0x34, 0x00,
+0x5e, 0x00, 0x7c, 0x00, 0x94, 0x00, 0x8e, 0x00, 0x76, 0x00, 0x4e, 0x00, 0x10, 0x00, 0xd6, 0xff,
+0xa2, 0xff, 0x6c, 0xff, 0x4a, 0xff, 0x3c, 0xff, 0x46, 0xff, 0x66, 0xff, 0x9c, 0xff, 0xd4, 0xff,
+0x12, 0x00, 0x48, 0x00, 0x80, 0x00, 0x9c, 0x00, 0xb2, 0x00, 0xae, 0x00, 0x86, 0x00, 0x4c, 0x00,
+0x00, 0x00, 0xc8, 0xff, 0x88, 0xff, 0x46, 0xff, 0x2a, 0xff, 0x20, 0xff, 0x2e, 0xff, 0x5a, 0xff,
+0xa0, 0xff, 0xe2, 0xff, 0x1a, 0x00, 0x5c, 0x00, 0x96, 0x00, 0xb6, 0x00, 0xc4, 0x00, 0xa8, 0x00,
+0x84, 0x00, 0x36, 0x00, 0xe8, 0xff, 0xb2, 0xff, 0x68, 0xff, 0x2e, 0xff, 0x18, 0xff, 0x0c, 0xff,
+0x2e, 0xff, 0x5a, 0xff, 0xa8, 0xff, 0xf4, 0xff, 0x1e, 0x00, 0x68, 0x00, 0x98, 0x00, 0xba, 0x00,
+0xba, 0x00, 0xa0, 0x00, 0x66, 0x00, 0x16, 0x00, 0xd6, 0xff, 0xa2, 0xff, 0x58, 0xff, 0x2e, 0xff,
+0x12, 0xff, 0x1e, 0xff, 0x48, 0xff, 0x7a, 0xff, 0xc8, 0xff, 0x08, 0x00, 0x36, 0x00, 0x78, 0x00,
+0xaa, 0x00, 0xc4, 0x00, 0xba, 0x00, 0x98, 0x00, 0x54, 0x00, 0x0e, 0x00, 0xd4, 0xff, 0x9c, 0xff,
+0x68, 0xff, 0x3c, 0xff, 0x2a, 0xff, 0x36, 0xff, 0x5c, 0xff, 0x92, 0xff, 0xd2, 0xff, 0x10, 0x00,
+0x48, 0x00, 0x72, 0x00, 0x9a, 0x00, 0xac, 0x00, 0x9a, 0x00, 0x76, 0x00, 0x40, 0x00, 0x04, 0x00,
+0xca, 0xff, 0x8c, 0xff, 0x70, 0xff, 0x54, 0xff, 0x4c, 0xff, 0x60, 0xff, 0x78, 0xff, 0xa4, 0xff,
+0xe2, 0xff, 0x18, 0x00, 0x40, 0x00, 0x64, 0x00, 0x7e, 0x00, 0x84, 0x00, 0x68, 0x00, 0x58, 0x00,
+0x2c, 0x00, 0xfa, 0xff, 0xcc, 0xff, 0xa2, 0xff, 0x94, 0xff, 0x7c, 0xff, 0x80, 0xff, 0x90, 0xff,
+0xa2, 0xff, 0xd0, 0xff, 0xf4, 0xff, 0x10, 0x00, 0x3e, 0x00, 0x4c, 0x00, 0x56, 0x00, 0x4a, 0x00,
+0x48, 0x00, 0x32, 0x00, 0x0a, 0x00, 0xf0, 0xff, 0xda, 0xff, 0xb8, 0xff, 0xb0, 0xff, 0xa8, 0xff,
+0xaa, 0xff, 0xb2, 0xff, 0xc4, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0x00, 0x00, 0x1e, 0x00, 0x18, 0x00,
+0x22, 0x00, 0x26, 0x00, 0x14, 0x00, 0x0a, 0x00, 0xfc, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xde, 0xff,
+0xde, 0xff, 0xda, 0xff, 0xd4, 0xff, 0xda, 0xff, 0xe0, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xf8, 0xff,
+0xf2, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff,
+0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xf4, 0xff, 0xf0, 0xff, 0xe4, 0xff, 0xe0, 0xff,
+0xe2, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xce, 0xff, 0xc6, 0xff, 0xd4, 0xff, 0xe0, 0xff, 0xe4, 0xff,
+0xfc, 0xff, 0xfe, 0xff, 0x14, 0x00, 0x1e, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+0xf2, 0xff, 0xd6, 0xff, 0xc6, 0xff, 0xae, 0xff, 0xaa, 0xff, 0xac, 0xff, 0xaa, 0xff, 0xc0, 0xff,
+0xd6, 0xff, 0xf0, 0xff, 0x02, 0x00, 0x28, 0x00, 0x36, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x32, 0x00,
+0x28, 0x00, 0x04, 0x00, 0xf8, 0xff, 0xd2, 0xff, 0xb2, 0xff, 0xa0, 0xff, 0x88, 0xff, 0x8c, 0xff,
+0x96, 0xff, 0xa4, 0xff, 0xcc, 0xff, 0xf2, 0xff, 0x14, 0x00, 0x30, 0x00, 0x54, 0x00, 0x60, 0x00,
+0x52, 0x00, 0x44, 0x00, 0x34, 0x00, 0x0e, 0x00, 0xe4, 0xff, 0xbc, 0xff, 0x9a, 0xff, 0x7a, 0xff,
+0x68, 0xff, 0x66, 0xff, 0x8c, 0xff, 0xa0, 0xff, 0xc6, 0xff, 0xfe, 0xff, 0x2e, 0x00, 0x5c, 0x00,
+0x76, 0x00, 0x88, 0x00, 0x7a, 0x00, 0x6e, 0x00, 0x42, 0x00, 0x10, 0x00, 0xe0, 0xff, 0xae, 0xff,
+0x7c, 0xff, 0x5e, 0xff, 0x54, 0xff, 0x58, 0xff, 0x7c, 0xff, 0xa8, 0xff, 0xda, 0xff, 0x20, 0x00,
+0x54, 0x00, 0x82, 0x00, 0x96, 0x00, 0x9e, 0x00, 0x94, 0x00, 0x64, 0x00, 0x36, 0x00, 0x04, 0x00,
+0xca, 0xff, 0x8c, 0xff, 0x58, 0xff, 0x3a, 0xff, 0x3e, 0xff, 0x4c, 0xff, 0x70, 0xff, 0xb4, 0xff,
+0xf0, 0xff, 0x28, 0x00, 0x66, 0x00, 0x90, 0x00, 0xaa, 0x00, 0xb0, 0x00, 0x8e, 0x00, 0x6c, 0x00,
+0x24, 0x00, 0xe6, 0xff, 0xb8, 0xff, 0x76, 0xff, 0x4e, 0xff, 0x30, 0xff, 0x2e, 0xff, 0x56, 0xff,
+0x8c, 0xff, 0xd8, 0xff, 0x02, 0x00, 0x3c, 0x00, 0x7a, 0x00, 0xa2, 0x00, 0xbc, 0x00, 0xa8, 0x00,
+0x88, 0x00, 0x58, 0x00, 0x04, 0x00, 0xd2, 0xff, 0xa8, 0xff, 0x68, 0xff, 0x3a, 0xff, 0x26, 0xff,
+0x3c, 0xff, 0x5c, 0xff, 0x96, 0xff, 0xe4, 0xff, 0x12, 0x00, 0x46, 0x00, 0x74, 0x00, 0x8e, 0x00,
+0xa4, 0x00, 0x94, 0x00, 0x6a, 0x00, 0x34, 0x00, 0xf0, 0xff, 0xb8, 0xff, 0x8c, 0xff, 0x4e, 0xff,
+0x3c, 0xff, 0x30, 0xff, 0x44, 0xff, 0x72, 0xff, 0x9c, 0xff, 0xe4, 0xff, 0x20, 0x00, 0x56, 0x00,
+0x7a, 0x00, 0x92, 0x00, 0x98, 0x00, 0x80, 0x00, 0x5e, 0x00, 0x2e, 0x00, 0xf4, 0xff, 0xb8, 0xff,
+0x82, 0xff, 0x5c, 0xff, 0x48, 0xff, 0x4e, 0xff, 0x6a, 0xff, 0x8e, 0xff, 0xc2, 0xff, 0xf6, 0xff,
+0x28, 0x00, 0x4c, 0x00, 0x6e, 0x00, 0x8c, 0x00, 0x82, 0x00, 0x68, 0x00, 0x42, 0x00, 0x02, 0x00,
+0xde, 0xff, 0xae, 0xff, 0x88, 0xff, 0x6c, 0xff, 0x5a, 0xff, 0x6a, 0xff, 0x86, 0xff, 0xa8, 0xff,
+0xd6, 0xff, 0x04, 0x00, 0x2a, 0x00, 0x52, 0x00, 0x5e, 0x00, 0x60, 0x00, 0x5c, 0x00, 0x4c, 0x00,
+0x1c, 0x00, 0xfc, 0xff, 0xe8, 0xff, 0xb0, 0xff, 0x9c, 0xff, 0x92, 0xff, 0x90, 0xff, 0xa4, 0xff,
+0xae, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0x10, 0x00, 0x24, 0x00, 0x3a, 0x00, 0x48, 0x00, 0x44, 0x00,
+0x44, 0x00, 0x36, 0x00, 0x18, 0x00, 0xfe, 0xff, 0xea, 0xff, 0xcc, 0xff, 0xb4, 0xff, 0xbc, 0xff,
+0xc4, 0xff, 0xca, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xee, 0xff, 0x04, 0x00, 0x0a, 0x00, 0x1c, 0x00,
+0x1a, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x14, 0x00, 0x0c, 0x00, 0xf8, 0xff, 0xee, 0xff, 0xec, 0xff,
+0xe8, 0xff, 0xe6, 0xff, 0xee, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xea, 0xff,
+0xe4, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0x04, 0x00,
+0x08, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x04, 0x00, 0xf2, 0xff, 0xe8, 0xff,
+0xd8, 0xff, 0xc6, 0xff, 0xb6, 0xff, 0xb8, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xd0, 0xff, 0xe0, 0xff,
+0xf0, 0xff, 0x02, 0x00, 0x1a, 0x00, 0x2a, 0x00, 0x2c, 0x00, 0x2a, 0x00, 0x1a, 0x00, 0x14, 0x00,
+0x06, 0x00, 0xe8, 0xff, 0xca, 0xff, 0xb0, 0xff, 0x9e, 0xff, 0x9a, 0xff, 0xa2, 0xff, 0xaa, 0xff,
+0xbe, 0xff, 0xd4, 0xff, 0xea, 0xff, 0x0a, 0x00, 0x28, 0x00, 0x3a, 0x00, 0x4e, 0x00, 0x4a, 0x00,
+0x3c, 0x00, 0x22, 0x00, 0x02, 0x00, 0xe4, 0xff, 0xb6, 0xff, 0x9e, 0xff, 0x8e, 0xff, 0x7c, 0xff,
+0x7c, 0xff, 0x92, 0xff, 0xaa, 0xff, 0xce, 0xff, 0xfa, 0xff, 0x2c, 0x00, 0x5a, 0x00, 0x64, 0x00,
+0x6a, 0x00, 0x62, 0x00, 0x4c, 0x00, 0x2a, 0x00, 0xf8, 0xff, 0xd2, 0xff, 0x94, 0xff, 0x6e, 0xff,
+0x56, 0xff, 0x50, 0xff, 0x66, 0xff, 0x84, 0xff, 0xa6, 0xff, 0xdc, 0xff, 0x10, 0x00, 0x4a, 0x00,
+0x78, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x84, 0x00, 0x50, 0x00, 0x22, 0x00, 0xf4, 0xff, 0xb8, 0xff,
+0x7a, 0xff, 0x4e, 0xff, 0x44, 0xff, 0x3e, 0xff, 0x5a, 0xff, 0x88, 0xff, 0xc4, 0xff, 0xfc, 0xff,
+0x3a, 0x00, 0x78, 0x00, 0xa6, 0x00, 0xb8, 0x00, 0xb4, 0x00, 0x92, 0x00, 0x56, 0x00, 0x18, 0x00,
+0xe0, 0xff, 0x98, 0xff, 0x62, 0xff, 0x44, 0xff, 0x2c, 0xff, 0x3e, 0xff, 0x64, 0xff, 0x9a, 0xff,
+0xe0, 0xff, 0x16, 0x00, 0x5c, 0x00, 0x92, 0x00, 0xc0, 0x00, 0xc8, 0x00, 0xa8, 0x00, 0x88, 0x00,
+0x3a, 0x00, 0xf6, 0xff, 0xc6, 0xff, 0x82, 0xff, 0x50, 0xff, 0x2e, 0xff, 0x20, 0xff, 0x46, 0xff,
+0x68, 0xff, 0xaa, 0xff, 0xf4, 0xff, 0x22, 0x00, 0x6a, 0x00, 0x98, 0x00, 0xae, 0x00, 0xbe, 0x00,
+0x96, 0x00, 0x6c, 0x00, 0x2e, 0x00, 0xf0, 0xff, 0xc0, 0xff, 0x76, 0xff, 0x52, 0xff, 0x3c, 0xff,
+0x38, 0xff, 0x54, 0xff, 0x82, 0xff, 0xb2, 0xff, 0xfc, 0xff, 0x2e, 0x00, 0x60, 0x00, 0x90, 0x00,
+0xa4, 0x00, 0xa2, 0x00, 0x8a, 0x00, 0x50, 0x00, 0x24, 0x00, 0xe4, 0xff, 0xae, 0xff, 0x86, 0xff,
+0x50, 0xff, 0x44, 0xff, 0x4e, 0xff, 0x5e, 0xff, 0x84, 0xff, 0xbc, 0xff, 0xfa, 0xff, 0x2e, 0x00,
+0x5a, 0x00, 0x88, 0x00, 0x86, 0x00, 0x7e, 0x00, 0x6a, 0x00, 0x38, 0x00, 0x0a, 0x00, 0xe4, 0xff,
+0xaa, 0xff, 0x7e, 0xff, 0x58, 0xff, 0x5a, 0xff, 0x60, 0xff, 0x72, 0xff, 0xa2, 0xff, 0xd6, 0xff,
+0x02, 0x00, 0x34, 0x00, 0x5a, 0x00, 0x68, 0x00, 0x70, 0x00, 0x68, 0x00, 0x50, 0x00, 0x32, 0x00,
+0x00, 0x00, 0xda, 0xff, 0xb0, 0xff, 0x90, 0xff, 0x84, 0xff, 0x80, 0xff, 0x92, 0xff, 0x92, 0xff,
+0xb8, 0xff, 0xe8, 0xff, 0x04, 0x00, 0x28, 0x00, 0x40, 0x00, 0x44, 0x00, 0x46, 0x00, 0x3a, 0x00,
+0x30, 0x00, 0x12, 0x00, 0xf0, 0xff, 0xde, 0xff, 0xc0, 0xff, 0xa2, 0xff, 0xa6, 0xff, 0xaa, 0xff,
+0xa4, 0xff, 0xb8, 0xff, 0xce, 0xff, 0xec, 0xff, 0xfa, 0xff, 0x10, 0x00, 0x24, 0x00, 0x16, 0x00,
+0x20, 0x00, 0x28, 0x00, 0x0a, 0x00, 0x02, 0x00, 0xfa, 0xff, 0xee, 0xff, 0xda, 0xff, 0xd4, 0xff,
+0xda, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xda, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xfa, 0xff,
+0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x02, 0x00, 0x06, 0x00, 0xfe, 0xff, 0xfe, 0xff,
+0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xe2, 0xff,
+0xd8, 0xff, 0xd4, 0xff, 0xd8, 0xff, 0xd6, 0xff, 0xd8, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xfc, 0xff,
+0x02, 0x00, 0x14, 0x00, 0x1e, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x18, 0x00, 0x08, 0x00, 0xfc, 0xff,
+0xea, 0xff, 0xdc, 0xff, 0xc8, 0xff, 0xb6, 0xff, 0xb4, 0xff, 0xba, 0xff, 0xc6, 0xff, 0xe0, 0xff,
+0xf0, 0xff, 0x06, 0x00, 0x1a, 0x00, 0x44, 0x00, 0x52, 0x00, 0x3e, 0x00, 0x3c, 0x00, 0x30, 0x00,
+0x1a, 0x00, 0x00, 0x00, 0xec, 0xff, 0xb8, 0xff, 0x98, 0xff, 0x8c, 0xff, 0x88, 0xff, 0x98, 0xff,
+0xa0, 0xff, 0xca, 0xff, 0xf2, 0xff, 0x08, 0x00, 0x38, 0x00, 0x5e, 0x00, 0x62, 0x00, 0x68, 0x00,
+0x5c, 0x00, 0x40, 0x00, 0x16, 0x00, 0xf0, 0xff, 0xc0, 0xff, 0x90, 0xff, 0x6a, 0xff, 0x5a, 0xff,
+0x64, 0xff, 0x7a, 0xff, 0x92, 0xff, 0xce, 0xff, 0x00, 0x00, 0x26, 0x00, 0x5c, 0x00, 0x80, 0x00,
+0x94, 0x00, 0x88, 0x00, 0x72, 0x00, 0x4c, 0x00, 0x1c, 0x00, 0xe6, 0xff, 0xa8, 0xff, 0x80, 0xff,
+0x58, 0xff, 0x44, 0xff, 0x56, 0xff, 0x6e, 0xff, 0x9a, 0xff, 0xd4, 0xff, 0x08, 0x00, 0x40, 0x00,
+0x74, 0x00, 0x96, 0x00, 0xa2, 0x00, 0x9a, 0x00, 0x78, 0x00, 0x3a, 0x00, 0x04, 0x00, 0xcc, 0xff,
+0x90, 0xff, 0x58, 0xff, 0x38, 0xff, 0x28, 0xff, 0x3a, 0xff, 0x64, 0xff, 0xa0, 0xff, 0xde, 0xff,
+0x12, 0x00, 0x4e, 0x00, 0x88, 0x00, 0xb2, 0x00, 0xb6, 0x00, 0xa0, 0x00, 0x76, 0x00, 0x36, 0x00,
+0x00, 0x00, 0xce, 0xff, 0x80, 0xff, 0x4a, 0xff, 0x38, 0xff, 0x34, 0xff, 0x52, 0xff, 0x78, 0xff,
+0xb4, 0xff, 0xfa, 0xff, 0x24, 0x00, 0x6a, 0x00, 0x98, 0x00, 0xb4, 0x00, 0xbc, 0x00, 0x98, 0x00,
+0x70, 0x00, 0x2a, 0x00, 0xf6, 0xff, 0xb4, 0xff, 0x78, 0xff, 0x4a, 0xff, 0x2e, 0xff, 0x32, 0xff,
+0x48, 0xff, 0x82, 0xff, 0xc2, 0xff, 0xf6, 0xff, 0x2c, 0x00, 0x6a, 0x00, 0x90, 0x00, 0xb2, 0x00,
+0xa8, 0x00, 0x84, 0x00, 0x56, 0x00, 0x12, 0x00, 0xe4, 0xff, 0xac, 0xff, 0x74, 0xff, 0x4c, 0xff,
+0x3a, 0xff, 0x4c, 0xff, 0x68, 0xff, 0x94, 0xff, 0xce, 0xff, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00,
+0x8e, 0x00, 0x9c, 0x00, 0xa0, 0x00, 0x72, 0x00, 0x4c, 0x00, 0x18, 0x00, 0xd8, 0xff, 0xac, 0xff,
+0x7c, 0xff, 0x60, 0xff, 0x50, 0xff, 0x68, 0xff, 0x7c, 0xff, 0xa0, 0xff, 0xde, 0xff, 0x0c, 0x00,
+0x38, 0x00, 0x60, 0x00, 0x70, 0x00, 0x7c, 0x00, 0x78, 0x00, 0x4a, 0x00, 0x22, 0x00, 0x00, 0x00,
+0xd2, 0xff, 0xa0, 0xff, 0x8e, 0xff, 0x78, 0xff, 0x6a, 0xff, 0x86, 0xff, 0x94, 0xff, 0xb6, 0xff,
+0xe4, 0xff, 0x0e, 0x00, 0x38, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x54, 0x00, 0x52, 0x00, 0x36, 0x00,
+0x0e, 0x00, 0xf2, 0xff, 0xcc, 0xff, 0xb0, 0xff, 0xa8, 0xff, 0xa6, 0xff, 0x98, 0xff, 0x9e, 0xff,
+0xbc, 0xff, 0xd8, 0xff, 0xf4, 0xff, 0x10, 0x00, 0x1c, 0x00, 0x26, 0x00, 0x3a, 0x00, 0x30, 0x00,
+0x2e, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf2, 0xff, 0xda, 0xff, 0xca, 0xff, 0xbc, 0xff, 0xc0, 0xff,
+0xb4, 0xff, 0xb6, 0xff, 0xc0, 0xff, 0xdc, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0x12, 0x00, 0x0c, 0x00,
+0x16, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x10, 0x00, 0xfe, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xe2, 0xff,
+0xd8, 0xff, 0xd6, 0xff, 0xd4, 0xff, 0xce, 0xff, 0xd8, 0xff, 0xea, 0xff, 0xec, 0xff, 0xee, 0xff,
+0x02, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0e, 0x00,
+0x0c, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf8, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xdc, 0xff,
+0xce, 0xff, 0xc4, 0xff, 0xc8, 0xff, 0xd0, 0xff, 0xcc, 0xff, 0xda, 0xff, 0xf6, 0xff, 0xf6, 0xff,
+0x06, 0x00, 0x22, 0x00, 0x30, 0x00, 0x34, 0x00, 0x26, 0x00, 0x20, 0x00, 0x0a, 0x00, 0xfc, 0xff,
+0xec, 0xff, 0xd0, 0xff, 0xb4, 0xff, 0xa2, 0xff, 0x9c, 0xff, 0xa4, 0xff, 0xb4, 0xff, 0xc2, 0xff,
+0xe6, 0xff, 0xfe, 0xff, 0x1e, 0x00, 0x40, 0x00, 0x54, 0x00, 0x56, 0x00, 0x50, 0x00, 0x3c, 0x00,
+0x28, 0x00, 0x02, 0x00, 0xee, 0xff, 0xbc, 0xff, 0x96, 0xff, 0x92, 0xff, 0x76, 0xff, 0x7c, 0xff,
+0xa0, 0xff, 0xaa, 0xff, 0xdc, 0xff, 0x06, 0x00, 0x34, 0x00, 0x5c, 0x00, 0x6e, 0x00, 0x7c, 0x00,
+0x62, 0x00, 0x50, 0x00, 0x2a, 0x00, 0xfc, 0xff, 0xce, 0xff, 0xa6, 0xff, 0x7a, 0xff, 0x58, 0xff,
+0x52, 0xff, 0x60, 0xff, 0x82, 0xff, 0xac, 0xff, 0xe0, 0xff, 0x1a, 0x00, 0x54, 0x00, 0x74, 0x00,
+0x8c, 0x00, 0x98, 0x00, 0x7a, 0x00, 0x58, 0x00, 0x22, 0x00, 0xf2, 0xff, 0xc2, 0xff, 0x82, 0xff,
+0x5e, 0xff, 0x40, 0xff, 0x48, 0xff, 0x5e, 0xff, 0x84, 0xff, 0xc8, 0xff, 0xfa, 0xff, 0x32, 0x00,
+0x78, 0x00, 0x9c, 0x00, 0xb0, 0x00, 0xb4, 0x00, 0x88, 0x00, 0x52, 0x00, 0x10, 0x00, 0xe0, 0xff,
+0xaa, 0xff, 0x58, 0xff, 0x3e, 0xff, 0x28, 0xff, 0x20, 0xff, 0x44, 0xff, 0x88, 0xff, 0xcc, 0xff,
+0x00, 0x00, 0x44, 0x00, 0x86, 0x00, 0xa8, 0x00, 0xb0, 0x00, 0xb4, 0x00, 0x7e, 0x00, 0x52, 0x00,
+0x08, 0x00, 0xd6, 0xff, 0x9a, 0xff, 0x52, 0xff, 0x34, 0xff, 0x20, 0xff, 0x32, 0xff, 0x5e, 0xff,
+0xa2, 0xff, 0xec, 0xff, 0x16, 0x00, 0x5c, 0x00, 0x9a, 0x00, 0xb4, 0x00, 0xca, 0x00, 0xaa, 0x00,
+0x86, 0x00, 0x40, 0x00, 0x00, 0x00, 0xcc, 0xff, 0x8e, 0xff, 0x56, 0xff, 0x34, 0xff, 0x2a, 0xff,
+0x3e, 0xff, 0x6a, 0xff, 0xac, 0xff, 0xf6, 0xff, 0x32, 0x00, 0x6a, 0x00, 0x92, 0x00, 0xae, 0x00,
+0xb0, 0x00, 0x9e, 0x00, 0x72, 0x00, 0x30, 0x00, 0x04, 0x00, 0xbe, 0xff, 0x86, 0xff, 0x58, 0xff,
+0x3c, 0xff, 0x3c, 0xff, 0x58, 0xff, 0x8a, 0xff, 0xbe, 0xff, 0x00, 0x00, 0x2a, 0x00, 0x58, 0x00,
+0x84, 0x00, 0x90, 0x00, 0x8c, 0x00, 0x86, 0x00, 0x5a, 0x00, 0x22, 0x00, 0xec, 0xff, 0xb6, 0xff,
+0x96, 0xff, 0x70, 0xff, 0x64, 0xff, 0x66, 0xff, 0x7c, 0xff, 0xa0, 0xff, 0xd6, 0xff, 0x06, 0x00,
+0x30, 0x00, 0x4e, 0x00, 0x66, 0x00, 0x7a, 0x00, 0x66, 0x00, 0x5a, 0x00, 0x3e, 0x00, 0x0c, 0x00,
+0xec, 0xff, 0xb2, 0xff, 0x94, 0xff, 0x80, 0xff, 0x78, 0xff, 0x84, 0xff, 0x8c, 0xff, 0xb8, 0xff,
+0xdc, 0xff, 0xf0, 0xff, 0x0c, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x40, 0x00, 0x40, 0x00, 0x2c, 0x00,
+0x1c, 0x00, 0xf2, 0xff, 0xd6, 0xff, 0xbc, 0xff, 0x9e, 0xff, 0xa0, 0xff, 0x9a, 0xff, 0xaa, 0xff,
+0xba, 0xff, 0xc8, 0xff, 0xe2, 0xff, 0xf4, 0xff, 0x12, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x28, 0x00,
+0x1c, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf6, 0xff, 0xe8, 0xff, 0xda, 0xff, 0xce, 0xff, 0xd0, 0xff,
+0xca, 0xff, 0xd2, 0xff, 0xe0, 0xff, 0xe8, 0xff, 0xe4, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xfc, 0xff,
+0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfc, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xe8, 0xff, 0xea, 0xff,
+0xea, 0xff, 0xec, 0xff, 0xea, 0xff, 0xee, 0xff, 0xea, 0xff, 0xe2, 0xff, 0xe0, 0xff, 0xda, 0xff,
+0xd2, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe0, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0x00, 0x00, 0x10, 0x00,
+0x2a, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x0c, 0x00, 0xf6, 0xff, 0xe6, 0xff,
+0xca, 0xff, 0xc0, 0xff, 0xb6, 0xff, 0xb4, 0xff, 0xc4, 0xff, 0xc8, 0xff, 0xd2, 0xff, 0xec, 0xff,
+0x08, 0x00, 0x18, 0x00, 0x36, 0x00, 0x52, 0x00, 0x56, 0x00, 0x46, 0x00, 0x40, 0x00, 0x1e, 0x00,
+0xf6, 0xff, 0xd8, 0xff, 0xae, 0xff, 0x86, 0xff, 0x78, 0xff, 0x76, 0xff, 0x92, 0xff, 0x9c, 0xff,
+0xbe, 0xff, 0xf0, 0xff, 0x1c, 0x00, 0x44, 0x00, 0x66, 0x00, 0x72, 0x00, 0x70, 0x00, 0x66, 0x00,
+0x4a, 0x00, 0x28, 0x00, 0xf6, 0xff, 0xc6, 0xff, 0x8c, 0xff, 0x74, 0xff, 0x54, 0xff, 0x56, 0xff,
+0x70, 0xff, 0x8c, 0xff, 0xba, 0xff, 0xee, 0xff, 0x1a, 0x00, 0x58, 0x00, 0x90, 0x00, 0xa8, 0x00,
+0xa2, 0x00, 0x8a, 0x00, 0x5c, 0x00, 0x28, 0x00, 0xea, 0xff, 0xa6, 0xff, 0x6a, 0xff, 0x3e, 0xff,
+0x28, 0xff, 0x2e, 0xff, 0x48, 0xff, 0x7e, 0xff, 0xc8, 0xff, 0x08, 0x00, 0x3c, 0x00, 0x7c, 0x00,
+0x96, 0x00, 0xa6, 0x00, 0xa4, 0x00, 0x80, 0x00, 0x48, 0x00, 0x06, 0x00, 0xc6, 0xff, 0x7e, 0xff,
+0x4e, 0xff, 0x22, 0xff, 0x14, 0xff, 0x1e, 0xff, 0x4a, 0xff, 0x76, 0xff, 0xb8, 0xff, 0x02, 0x00,
+0x50, 0x00, 0xa4, 0x00, 0xce, 0x00, 0xdc, 0x00, 0xba, 0x00, 0x7e, 0x00, 0x46, 0x00, 0x06, 0x00,
+0xbc, 0xff, 0x88, 0xff, 0x42, 0xff, 0x36, 0xff, 0x22, 0xff, 0x1c, 0xff, 0x4e, 0xff, 0x94, 0xff,
+0xe4, 0xff, 0x20, 0x00, 0x68, 0x00, 0xa2, 0x00, 0xde, 0x00, 0xc6, 0x00, 0x92, 0x00, 0x88, 0x00,
+0x82, 0x00, 0x44, 0x00, 0x98, 0xff, 0x04, 0xfe, 0x84, 0xfb, 0xc0, 0xf8, 0x44, 0xf6, 0x10, 0xf5,
+0xac, 0xf5, 0xf6, 0xf8, 0x4a, 0xff, 0xea, 0x07, 0x04, 0x12, 0xca, 0x1b, 0xc3, 0x22, 0x01, 0x26,
+0x0b, 0x24, 0x97, 0x1c, 0x38, 0x10, 0x52, 0x00, 0x3e, 0xee, 0xd5, 0xdb, 0xe9, 0xcb, 0xbf, 0xc0,
+0xb5, 0xbc, 0xe5, 0xc1, 0x47, 0xd1, 0x20, 0xe9, 0xec, 0x05, 0xa7, 0x22, 0x93, 0x3a, 0x15, 0x4a,
+0x6f, 0x4f, 0xfb, 0x4a, 0x7f, 0x3e, 0xc7, 0x2b, 0x14, 0x15, 0x70, 0xfc, 0xb9, 0xe3, 0x37, 0xcd,
+0x9d, 0xbb, 0xe3, 0xb1, 0x5f, 0xb2, 0x97, 0xbe, 0x77, 0xd5, 0x5e, 0xf3, 0xe6, 0x12, 0x47, 0x2e,
+0x7f, 0x41, 0x97, 0x4a, 0x89, 0x49, 0x21, 0x40, 0x87, 0x30, 0xf7, 0x1c, 0x88, 0x07, 0xde, 0xf1,
+0xed, 0xdd, 0x67, 0xcd, 0xc5, 0xc2, 0x83, 0xbf, 0x07, 0xc5, 0x97, 0xd3, 0x16, 0xe9, 0x16, 0x02,
+0x60, 0x1a, 0x17, 0x2e, 0x9b, 0x3a, 0xd3, 0x3e, 0xe1, 0x3a, 0x39, 0x30, 0xdb, 0x20, 0xf6, 0x0e,
+0x76, 0xfc, 0x14, 0xeb, 0x81, 0xdc, 0x0d, 0xd2, 0xe9, 0xcc, 0x99, 0xcd, 0x57, 0xd4, 0x9b, 0xe0,
+0x14, 0xf1, 0x9c, 0x03, 0x96, 0x15, 0x73, 0x24, 0xc7, 0x2d, 0x8f, 0x30, 0xdb, 0x2c, 0x13, 0x24,
+0xf6, 0x17, 0x36, 0x0a, 0x9e, 0xfc, 0x1a, 0xf1, 0x84, 0xe8, 0x25, 0xe3, 0xb9, 0xe0, 0xc1, 0xe0,
+0x25, 0xe3, 0x02, 0xe8, 0x62, 0xef, 0xaa, 0xf8, 0x24, 0x03, 0xfc, 0x0c, 0x5c, 0x14, 0xf6, 0x17,
+0xfc, 0x17, 0xee, 0x13, 0x28, 0x0e, 0xc6, 0x08, 0x40, 0x04, 0x64, 0x01, 0xb0, 0xff, 0x06, 0xfe,
+0x46, 0xfb, 0x84, 0xf7, 0x24, 0xf3, 0xb0, 0xef, 0x62, 0xee, 0xfa, 0xef, 0x00, 0xf4, 0x0e, 0xf9,
+0x6c, 0xfd, 0x5c, 0x00, 0xfc, 0x01, 0x3e, 0x03, 0x32, 0x05, 0x34, 0x08, 0x8e, 0x0c, 0x5c, 0x11,
+0x26, 0x15, 0xd0, 0x15, 0x3a, 0x12, 0x9e, 0x0a, 0x2c, 0x00, 0x20, 0xf5, 0xc6, 0xeb, 0xc2, 0xe5,
+0x47, 0xe3, 0x91, 0xe3, 0xb0, 0xe5, 0x40, 0xe9, 0xca, 0xee, 0xae, 0xf6, 0x0c, 0x01, 0x46, 0x0d,
+0xde, 0x19, 0xb5, 0x24, 0x67, 0x2b, 0x11, 0x2c, 0xfb, 0x25, 0xbe, 0x19, 0x38, 0x09, 0xda, 0xf6,
+0xce, 0xe5, 0x55, 0xd8, 0xd7, 0xcf, 0x87, 0xcc, 0x6b, 0xce, 0x3f, 0xd5, 0xbf, 0xe0, 0xc2, 0xf0,
+0xd6, 0x03, 0x22, 0x18, 0x91, 0x2a, 0xab, 0x38, 0x0d, 0x40, 0x6f, 0x3f, 0x6d, 0x36, 0xb9, 0x25,
+0x2a, 0x0f, 0xa2, 0xf5, 0xc7, 0xdc, 0x0b, 0xc8, 0x35, 0xba, 0xf3, 0xb4, 0xe1, 0xb8, 0x6b, 0xc5,
+0x49, 0xd9, 0x02, 0xf2, 0xb4, 0x0c, 0x11, 0x26, 0x41, 0x3b, 0x07, 0x4a, 0xc5, 0x50, 0x5d, 0x4e,
+0x37, 0x42, 0xd1, 0x2c, 0x08, 0x10, 0x52, 0xef, 0x39, 0xcf, 0x17, 0xb5, 0x1e, 0xa5, 0x9a, 0xa1,
+0x98, 0xaa, 0x41, 0xbe, 0x5f, 0xd9, 0x20, 0xf8, 0xda, 0x16, 0x8b, 0x32, 0xc7, 0x48, 0xa2, 0x57,
+0x8c, 0x5d, 0xe0, 0x58, 0xef, 0x48, 0x39, 0x2e, 0x3c, 0x0b, 0x66, 0xe4, 0xd5, 0xbf, 0xce, 0xa3,
+0x18, 0x95, 0x94, 0x95, 0x12, 0xa4, 0x5d, 0xbd, 0x15, 0xdd, 0x2c, 0xff, 0x01, 0x20, 0xe7, 0x3c,
+0xab, 0x53, 0x3c, 0x62, 0x6e, 0x66, 0xa8, 0x5e, 0xff, 0x49, 0xb7, 0x29, 0x2a, 0x01, 0x29, 0xd6,
+0x05, 0xb0, 0x7a, 0x95, 0xe0, 0x8a, 0x8c, 0x90, 0x00, 0xa4, 0x11, 0xc1, 0x3d, 0xe3, 0x74, 0x06,
+0x9b, 0x27, 0x65, 0x44, 0xb8, 0x5a, 0xec, 0x67, 0x9a, 0x69, 0xe4, 0x5d, 0xab, 0x44, 0x21, 0x20,
+0xc2, 0xf4, 0x7f, 0xc9, 0xaa, 0xa5, 0x52, 0x8f, 0x48, 0x89, 0xec, 0x92, 0x40, 0xa9, 0x0f, 0xc8,
+0xf4, 0xea, 0x1e, 0x0e, 0xa3, 0x2e, 0xfb, 0x49, 0xd2, 0x5d, 0x78, 0x67, 0xdc, 0x64, 0x08, 0x55,
+0xf5, 0x38, 0xaa, 0x13, 0x58, 0xea, 0x3b, 0xc3, 0xaa, 0xa4, 0x28, 0x93, 0x64, 0x90, 0xa8, 0x9b,
+0x07, 0xb2, 0x25, 0xd0, 0xee, 0xf1, 0xe8, 0x13, 0xef, 0x32, 0x61, 0x4c, 0x4c, 0x5d, 0x22, 0x63,
+0x68, 0x5c, 0x93, 0x49, 0xbf, 0x2c, 0x56, 0x09, 0x14, 0xe4, 0x2b, 0xc2, 0xae, 0xa8, 0xd2, 0x9a,
+0x38, 0x9a, 0x28, 0xa6, 0x9b, 0xbc, 0x1f, 0xda, 0xd4, 0xfa, 0xdc, 0x1a, 0xb1, 0x36, 0x63, 0x4b,
+0x64, 0x56, 0x90, 0x56, 0x17, 0x4c, 0xd1, 0x38, 0xe5, 0x1e, 0x1c, 0x01, 0xb7, 0xe2, 0xb7, 0xc7,
+0xad, 0xb3, 0x72, 0xa9, 0x66, 0xaa, 0x5d, 0xb6, 0xa5, 0xcb, 0xc8, 0xe6, 0xea, 0x03, 0xf7, 0x1e,
+0xb1, 0x34, 0x81, 0x42, 0x77, 0x47, 0xc1, 0x43, 0x0d, 0x39, 0x05, 0x29, 0x30, 0x15, 0x04, 0xff,
+0x54, 0xe8, 0xcd, 0xd3, 0x1f, 0xc4, 0x11, 0xbc, 0x31, 0xbd, 0xf5, 0xc7, 0x67, 0xda, 0x32, 0xf1,
+0x3e, 0x08, 0x0e, 0x1c, 0x23, 0x2a, 0x77, 0x31, 0x73, 0x32, 0x51, 0x2e, 0xad, 0x26, 0x43, 0x1c,
+0x96, 0x0f, 0xee, 0x00, 0x4a, 0xf1, 0x6f, 0xe2, 0xf3, 0xd6, 0x13, 0xd1, 0x81, 0xd2, 0x0b, 0xdb,
+0xb0, 0xe8, 0x70, 0xf8, 0x08, 0x07, 0x50, 0x12, 0x36, 0x19, 0x12, 0x1c, 0xd4, 0x1b, 0xf4, 0x19,
+0x1c, 0x17, 0x7a, 0x13, 0x86, 0x0e, 0x9a, 0x07, 0xd0, 0xfe, 0x4a, 0xf5, 0x14, 0xed, 0x34, 0xe8,
+0xf2, 0xe7, 0xe4, 0xeb, 0x86, 0xf2, 0x84, 0xf9, 0x1c, 0xff, 0x86, 0x02, 0xfc, 0x03, 0x52, 0x04,
+0xdc, 0x04, 0x74, 0x06, 0x4e, 0x09, 0xbc, 0x0c, 0x64, 0x0f, 0x10, 0x10, 0x0c, 0x0e, 0xd2, 0x09,
+0x96, 0x04, 0xd0, 0xff, 0xf8, 0xfb, 0x2a, 0xf9, 0xe0, 0xf6, 0x8a, 0xf4, 0x06, 0xf2, 0x8a, 0xef,
+0xdc, 0xed, 0x06, 0xee, 0xd8, 0xf0, 0xbc, 0xf6, 0x7c, 0xff, 0xce, 0x09, 0x1a, 0x14, 0x63, 0x1c,
+0x1b, 0x21, 0x71, 0x21, 0x81, 0x1d, 0xee, 0x15, 0xea, 0x0b, 0x92, 0x00, 0xfc, 0xf4, 0x36, 0xea,
+0xf5, 0xe0, 0x31, 0xda, 0xe5, 0xd6, 0xed, 0xd7, 0xe9, 0xdd, 0xde, 0xe8, 0x16, 0xf8, 0x3a, 0x0a,
+0xd1, 0x1c, 0xdd, 0x2c, 0x4b, 0x37, 0xed, 0x39, 0x45, 0x34, 0x7b, 0x27, 0xd4, 0x15, 0x04, 0x02,
+0x96, 0xee, 0x6d, 0xdd, 0xe5, 0xcf, 0xed, 0xc6, 0x31, 0xc3, 0xb1, 0xc5, 0xf9, 0xce, 0x57, 0xdf,
+0xea, 0xf5, 0x78, 0x10, 0x45, 0x2b, 0x97, 0x41, 0xdf, 0x4e, 0x5b, 0x50, 0x0d, 0x46, 0x6d, 0x32,
+0x54, 0x19, 0x8a, 0xfe, 0x44, 0xe5, 0xa5, 0xcf, 0x5f, 0xbf, 0x19, 0xb5, 0x05, 0xb2, 0xfd, 0xb6,
+0x09, 0xc5, 0x0f, 0xdc, 0x44, 0xfa, 0xec, 0x1b, 0xe7, 0x3b, 0x99, 0x54, 0x22, 0x61, 0x88, 0x5f,
+0x95, 0x50, 0xdd, 0x37, 0xc6, 0x19, 0x62, 0xfa, 0xe3, 0xdc, 0xfd, 0xc3, 0x3f, 0xb1, 0x4e, 0xa6,
+0x50, 0xa4, 0xad, 0xac, 0x4f, 0xc0, 0x0b, 0xde, 0xbe, 0x02, 0x33, 0x29, 0x7b, 0x4b, 0xbc, 0x63,
+0xea, 0x6d, 0x6a, 0x68, 0x3a, 0x55, 0x6b, 0x38, 0x96, 0x16, 0xd2, 0xf3, 0x67, 0xd3, 0x17, 0xb8,
+0x7e, 0xa4, 0x90, 0x9a, 0xf6, 0x9b, 0xfc, 0xa9, 0x01, 0xc4, 0xaa, 0xe7, 0x18, 0x10, 0x89, 0x37,
+0x42, 0x58, 0x72, 0x6d, 0xdc, 0x73, 0xee, 0x6a, 0xde, 0x54, 0x6b, 0x35, 0x2a, 0x11, 0xdc, 0xeb,
+0x61, 0xc9, 0x53, 0xad, 0xf2, 0x9a, 0x60, 0x94, 0x1e, 0x9b, 0xcd, 0xae, 0xa9, 0xcd, 0xb0, 0xf3,
+0xb6, 0x1b, 0x93, 0x40, 0xb0, 0x5d, 0x5e, 0x6f, 0xfe, 0x72, 0x32, 0x68, 0x95, 0x50, 0xef, 0x2f,
+0x1a, 0x0a, 0x89, 0xe3, 0xb1, 0xc0, 0x00, 0xa6, 0xfc, 0x96, 0xa0, 0x95, 0xc2, 0xa1, 0xbf, 0xb9,
+0x59, 0xda, 0xfa, 0xfe, 0x61, 0x23, 0x79, 0x43, 0x24, 0x5c, 0x7c, 0x6a, 0x4c, 0x6c, 0x88, 0x60,
+0x9d, 0x48, 0x67, 0x27, 0x52, 0x01, 0x6f, 0xdb, 0xcd, 0xba, 0x36, 0xa4, 0x82, 0x9a, 0x50, 0x9e,
+0x3d, 0xae, 0x6b, 0xc7, 0x0e, 0xe6, 0xbc, 0x06, 0x05, 0x26, 0x4d, 0x41, 0x40, 0x56, 0x0c, 0x62,
+0x42, 0x62, 0xc8, 0x55, 0x77, 0x3d, 0x67, 0x1c, 0xbe, 0xf7, 0xe5, 0xd4, 0x5d, 0xb9, 0xea, 0xa8,
+0xfe, 0xa4, 0xd9, 0xac, 0x15, 0xbe, 0x65, 0xd5, 0xbc, 0xef, 0x98, 0x0a, 0x01, 0x24, 0x69, 0x3a,
+0x77, 0x4b, 0xb3, 0x54, 0x7f, 0x53, 0xad, 0x46, 0x55, 0x2f, 0x16, 0x11, 0xee, 0xf0, 0x91, 0xd4,
+0x4f, 0xc0, 0x5f, 0xb6, 0x01, 0xb7, 0x3d, 0xc0, 0x7b, 0xcf, 0x35, 0xe2, 0x60, 0xf6, 0x8a, 0x0a,
+0x03, 0x1e, 0x25, 0x2f, 0x0f, 0x3c, 0x5f, 0x42, 0xf1, 0x3f, 0xff, 0x33, 0x1d, 0x20, 0xb6, 0x07,
+0x8c, 0xef, 0xdd, 0xdb, 0x3d, 0xcf, 0x99, 0xca, 0x0d, 0xcd, 0xd3, 0xd4, 0xed, 0xdf, 0x9a, 0xec,
+0xce, 0xf9, 0x28, 0x07, 0x02, 0x14, 0x95, 0x1f, 0x57, 0x28, 0x77, 0x2c, 0xab, 0x2a, 0x93, 0x22,
+0x40, 0x15, 0xa0, 0x05, 0xc2, 0xf6, 0x1c, 0xeb, 0x08, 0xe4, 0x91, 0xe1, 0xf1, 0xe2, 0x1e, 0xe7,
+0xbe, 0xec, 0x04, 0xf3, 0x8a, 0xf9, 0xf8, 0xff, 0x6a, 0x06, 0x8e, 0x0c, 0xbe, 0x11, 0x56, 0x15,
+0x9c, 0x16, 0xbc, 0x14, 0x32, 0x10, 0xda, 0x09, 0x40, 0x03, 0xd2, 0xfd, 0x36, 0xfa, 0x7e, 0xf8,
+0x60, 0xf8, 0xd2, 0xf8, 0xfa, 0xf8, 0x78, 0xf8, 0xfe, 0xf6, 0x38, 0xf5, 0x18, 0xf4, 0xd2, 0xf4,
+0x4c, 0xf8, 0x40, 0xfe, 0x1e, 0x05, 0x78, 0x0b, 0x04, 0x10, 0x44, 0x12, 0xbc, 0x12, 0xec, 0x11,
+0x6e, 0x10, 0x76, 0x0e, 0x8e, 0x0b, 0x10, 0x07, 0xa2, 0x00, 0x00, 0xf8, 0x08, 0xee, 0x5e, 0xe4,
+0x5b, 0xdd, 0x89, 0xdb, 0x23, 0xe0, 0x92, 0xea, 0xc0, 0xf8, 0xca, 0x07, 0x18, 0x15, 0x57, 0x1f,
+0x85, 0x25, 0xfd, 0x27, 0x69, 0x27, 0xe9, 0x23, 0x15, 0x1d, 0x7e, 0x12, 0xe2, 0x03, 0x48, 0xf2,
+0xe9, 0xdf, 0xc5, 0xcf, 0xbb, 0xc5, 0x7f, 0xc4, 0x03, 0xcd, 0xa1, 0xdd, 0x0e, 0xf3, 0x32, 0x09,
+0x19, 0x1d, 0x69, 0x2c, 0xa9, 0x36, 0xc7, 0x3b, 0xc5, 0x3b, 0x43, 0x36, 0x95, 0x2a, 0x82, 0x18,
+0x1e, 0x01, 0x06, 0xe7, 0xc5, 0xcd, 0x15, 0xba, 0x9d, 0xaf, 0xe3, 0xb0, 0xdd, 0xbd, 0x5f, 0xd4,
+0x4c, 0xf0, 0x60, 0x0d, 0x4f, 0x27, 0xc5, 0x3b, 0x59, 0x49, 0x63, 0x4f, 0x83, 0x4d, 0x19, 0x43,
+0x35, 0x30, 0xfc, 0x15, 0x3c, 0xf7, 0x8f, 0xd7, 0xf7, 0xbb, 0x74, 0xa8, 0x66, 0xa0, 0x2c, 0xa5,
+0x2f, 0xb6, 0x05, 0xd1, 0xb6, 0xf1, 0x54, 0x13, 0xb9, 0x31, 0xeb, 0x49, 0x88, 0x59, 0x44, 0x5f,
+0xe2, 0x59, 0x75, 0x49, 0x81, 0x2f, 0x0c, 0x0f, 0xa8, 0xeb, 0x35, 0xca, 0xd3, 0xae, 0xfc, 0x9c,
+0x36, 0x97, 0x34, 0x9e, 0xe3, 0xb1, 0x2d, 0xd0, 0x0c, 0xf5, 0x2e, 0x1b, 0xc7, 0x3d, 0x6c, 0x58,
+0x10, 0x68, 0x8c, 0x6a, 0x48, 0x5f, 0x35, 0x48, 0x97, 0x28, 0x6a, 0x04, 0xfd, 0xdf, 0x41, 0xbf,
+0xc0, 0xa5, 0x6c, 0x96, 0xc6, 0x92, 0x2c, 0x9c, 0x9f, 0xb2, 0x3d, 0xd4, 0xa4, 0xfc, 0x13, 0x26,
+0x59, 0x4a, 0x9e, 0x64, 0x28, 0x71, 0x26, 0x6e, 0x14, 0x5d, 0x15, 0x41, 0xbb, 0x1e, 0x44, 0xfa,
+0x3d, 0xd7, 0xc7, 0xb8, 0x0a, 0xa2, 0xe0, 0x94, 0x7e, 0x93, 0x4a, 0x9f, 0x6b, 0xb8, 0xcf, 0xdc,
+0x64, 0x07, 0x63, 0x31, 0x4f, 0x54, 0xe0, 0x6a, 0xd2, 0x71, 0x78, 0x69, 0x25, 0x54, 0x5f, 0x36,
+0x82, 0x14, 0x00, 0xf2, 0xe3, 0xd1, 0xd9, 0xb6, 0xec, 0xa2, 0x9e, 0x98, 0xd8, 0x99, 0x0a, 0xa8,
+0x4d, 0xc3, 0xa6, 0xe8, 0x40, 0x12, 0x5b, 0x39, 0x78, 0x57, 0x16, 0x68, 0x0e, 0x6a, 0x32, 0x5e,
+0x23, 0x48, 0xe5, 0x2b, 0xd2, 0x0c, 0xe0, 0xed, 0x81, 0xd1, 0xc9, 0xb9, 0x16, 0xa9, 0xaa, 0xa1,
+0x38, 0xa5, 0x3b, 0xb5, 0xb7, 0xd0, 0x1c, 0xf4, 0xac, 0x19, 0xdd, 0x3a, 0x59, 0x52, 0x5e, 0x5d,
+0x7c, 0x5b, 0xe3, 0x4e, 0xa5, 0x3a, 0x89, 0x21, 0xa0, 0x06, 0x0a, 0xec, 0x03, 0xd4, 0xa3, 0xc0,
+0x03, 0xb4, 0xf5, 0xaf, 0x0f, 0xb6, 0x67, 0xc6, 0x31, 0xdf, 0x3a, 0xfd, 0x48, 0x1b, 0xbd, 0x34,
+0xcf, 0x45, 0x83, 0x4c, 0x5f, 0x49, 0x23, 0x3e, 0xbf, 0x2c, 0xba, 0x17, 0x7a, 0x01, 0x3a, 0xec,
+0xcf, 0xd9, 0x0f, 0xcc, 0x39, 0xc4, 0x8f, 0xc3, 0x39, 0xca, 0xa3, 0xd7, 0x78, 0xea, 0xf0, 0xff,
+0x54, 0x15, 0x3f, 0x27, 0x3d, 0x33, 0xdb, 0x37, 0x37, 0x35, 0x63, 0x2c, 0x0d, 0x1f, 0x42, 0x0f,
+0x22, 0xff, 0xb6, 0xf0, 0x46, 0xe5, 0xa5, 0xdd, 0x35, 0xda, 0xc1, 0xda, 0xd9, 0xde, 0x2c, 0xe6,
+0x24, 0xf0, 0x48, 0xfc, 0x20, 0x09, 0xc8, 0x14, 0x31, 0x1d, 0xfb, 0x20, 0xe3, 0x1f, 0x6c, 0x1a,
+0x20, 0x12, 0xc8, 0x08, 0x62, 0x00, 0x00, 0xfa, 0xb8, 0xf5, 0x64, 0xf3, 0x18, 0xf2, 0xf6, 0xf0,
+0x92, 0xef, 0xd8, 0xee, 0xf4, 0xef, 0x88, 0xf3, 0x72, 0xf9, 0x3e, 0x00, 0x54, 0x06, 0x56, 0x0a,
+0x96, 0x0b, 0xaa, 0x0a, 0xdc, 0x08, 0xd0, 0x07, 0x18, 0x08, 0x96, 0x09, 0x54, 0x0b, 0xde, 0x0b,
+0xba, 0x09, 0x1e, 0x04, 0xf6, 0xfb, 0x08, 0xf3, 0xb0, 0xeb, 0x9e, 0xe7, 0x46, 0xe7, 0x0c, 0xea,
+0x76, 0xee, 0x5c, 0xf3, 0x52, 0xf8, 0x9e, 0xfd, 0x0c, 0x04, 0x0c, 0x0c, 0xe4, 0x14, 0xe9, 0x1c,
+0x39, 0x22, 0xed, 0x22, 0xed, 0x1d, 0x56, 0x13, 0x92, 0x04, 0x58, 0xf4, 0x98, 0xe5, 0x5d, 0xda,
+0x35, 0xd4, 0x31, 0xd3, 0xb9, 0xd6, 0x11, 0xde, 0x90, 0xe8, 0x12, 0xf6, 0xd6, 0x05, 0xb0, 0x16,
+0x29, 0x26, 0x17, 0x32, 0x37, 0x38, 0x3f, 0x37, 0x6f, 0x2e, 0x75, 0x1e, 0x86, 0x09, 0x2e, 0xf2,
+0xaf, 0xdb, 0xa9, 0xc9, 0x97, 0xbe, 0xa3, 0xbb, 0xcd, 0xc0, 0x35, 0xcd, 0xa9, 0xdf, 0x32, 0xf6,
+0x7c, 0x0e, 0x91, 0x25, 0xf7, 0x38, 0xd7, 0x45, 0xe7, 0x4a, 0x0f, 0x47, 0x45, 0x3a, 0x65, 0x25,
+0x40, 0x0a, 0x0c, 0xec, 0x0b, 0xcf, 0xe3, 0xb7, 0x12, 0xaa, 0xdc, 0xa7, 0x1b, 0xb1, 0x7b, 0xc4,
+0xc9, 0xde, 0xa2, 0xfc, 0x42, 0x1a, 0x89, 0x34, 0x9d, 0x48, 0xf6, 0x54, 0x4c, 0x58, 0xaf, 0x51,
+0x1d, 0x41, 0x4b, 0x27, 0x8a, 0x06, 0x5b, 0xe2, 0x41, 0xc0, 0x16, 0xa6, 0x8a, 0x98, 0x6c, 0x99,
+0x2c, 0xa8, 0x03, 0xc2, 0xa1, 0xe2, 0x2c, 0x05, 0x81, 0x25, 0x87, 0x40, 0x83, 0x54, 0xd2, 0x5f,
+0x30, 0x61, 0xc4, 0x57, 0x5b, 0x43, 0x05, 0x25, 0x26, 0xff, 0x9f, 0xd6, 0xd9, 0xb1, 0xb8, 0x97,
+0x88, 0x8c, 0xe4, 0x91, 0x1a, 0xa6, 0xed, 0xc4, 0xf8, 0xe8, 0x3c, 0x0d, 0xf1, 0x2d, 0xb1, 0x48,
+0xe6, 0x5b, 0x02, 0x66, 0x76, 0x65, 0x0a, 0x59, 0xd1, 0x40, 0x41, 0x1e, 0xd6, 0xf4, 0x45, 0xca,
+0xe0, 0xa5, 0x68, 0x8e, 0xb6, 0x87, 0xec, 0x91, 0x1a, 0xaa, 0x7f, 0xcb, 0xbe, 0xf0, 0x10, 0x15,
+0x31, 0x35, 0xcb, 0x4e, 0x62, 0x60, 0x0c, 0x68, 0x2a, 0x64, 0xdb, 0x53, 0xc1, 0x37, 0x4e, 0x12,
+0xd2, 0xe7, 0xf9, 0xbe, 0xc2, 0x9e, 0xb2, 0x8c, 0x02, 0x8b, 0xf6, 0x98, 0x05, 0xb3, 0x89, 0xd4,
+0xcc, 0xf8, 0x98, 0x1b, 0xdb, 0x39, 0x51, 0x51, 0xd4, 0x5f, 0xdc, 0x63, 0x1a, 0x5c, 0x49, 0x48,
+0x35, 0x2a, 0x38, 0x05, 0x1b, 0xde, 0xc3, 0xba, 0xc8, 0xa0, 0xe0, 0x93, 0xa0, 0x95, 0x8e, 0xa4,
+0xc9, 0xbd, 0x7d, 0xdd, 0x5e, 0xff, 0x9b, 0x1f, 0x0d, 0x3b, 0x19, 0x4f, 0xf0, 0x59, 0x2c, 0x5a,
+0x17, 0x4f, 0x05, 0x3a, 0x37, 0x1d, 0x4a, 0xfc, 0x49, 0xdb, 0xaf, 0xbe, 0x56, 0xaa, 0x22, 0xa1,
+0x02, 0xa4, 0x57, 0xb2, 0xf3, 0xc9, 0xf4, 0xe6, 0xd2, 0x05, 0x7f, 0x22, 0xab, 0x39, 0xb3, 0x48,
+0x27, 0x4e, 0xd5, 0x49, 0xd3, 0x3c, 0xf9, 0x28, 0xf4, 0x10, 0x64, 0xf7, 0x8f, 0xde, 0x0f, 0xc9,
+0x91, 0xb9, 0x75, 0xb2, 0x5d, 0xb5, 0x1b, 0xc2, 0xaf, 0xd6, 0x38, 0xf0, 0x62, 0x0a, 0x77, 0x21,
+0x3f, 0x32, 0xff, 0x3a, 0xa9, 0x3b, 0x6f, 0x35, 0x03, 0x2a, 0x84, 0x1b, 0x48, 0x0b, 0xf4, 0xf9,
+0xd4, 0xe8, 0x2d, 0xd9, 0x47, 0xcd, 0x7d, 0xc7, 0x83, 0xc9, 0x71, 0xd3, 0xea, 0xe3, 0x62, 0xf7,
+0x8e, 0x0a, 0xfe, 0x19, 0x81, 0x23, 0xcb, 0x26, 0xe1, 0x24, 0x99, 0x1f, 0xbc, 0x18, 0x3a, 0x11,
+0x14, 0x09, 0x24, 0x00, 0x18, 0xf6, 0xc0, 0xeb, 0x09, 0xe3, 0x07, 0xde, 0x83, 0xde, 0x98, 0xe4,
+0xa2, 0xee, 0x3e, 0xfa, 0x92, 0x04, 0xae, 0x0b, 0xfe, 0x0e, 0x54, 0x0f, 0x14, 0x0e, 0xa2, 0x0c,
+0xd4, 0x0b, 0xca, 0x0b, 0xa0, 0x0b, 0x00, 0x0a, 0x68, 0x06, 0x08, 0x01, 0xea, 0xfa, 0xa4, 0xf5,
+0x9c, 0xf2, 0x46, 0xf2, 0xd2, 0xf3, 0xd8, 0xf5, 0x40, 0xf7, 0x9c, 0xf7, 0x28, 0xf7, 0x1e, 0xf7,
+0x74, 0xf8, 0x0a, 0xfc, 0xfa, 0x01, 0x80, 0x09, 0x20, 0x11, 0x0a, 0x17, 0xaa, 0x19, 0x6e, 0x18,
+0xac, 0x13, 0x58, 0x0c, 0xd2, 0x03, 0x36, 0xfb, 0xea, 0xf2, 0x9e, 0xeb, 0x64, 0xe5, 0x1f, 0xe1,
+0x75, 0xdf, 0x27, 0xe1, 0x7c, 0xe6, 0x86, 0xef, 0x18, 0xfc, 0xf8, 0x0a, 0x30, 0x1a, 0xdf, 0x26,
+0x0b, 0x2f, 0x85, 0x30, 0xe9, 0x2a, 0xf9, 0x1e, 0xd6, 0x0e, 0xfc, 0xfc, 0xd2, 0xeb, 0x0b, 0xdd,
+0x19, 0xd2, 0xbd, 0xcb, 0x55, 0xca, 0x57, 0xce, 0xaf, 0xd7, 0x70, 0xe6, 0xe8, 0xf9, 0x5e, 0x10,
+0xe5, 0x26, 0x13, 0x3a, 0xd7, 0x45, 0x89, 0x47, 0x4f, 0x3e, 0xcf, 0x2b, 0xa4, 0x13, 0xc4, 0xf9,
+0x97, 0xe1, 0xef, 0xcd, 0x1b, 0xc0, 0xb5, 0xb8, 0x53, 0xb8, 0xcf, 0xbe, 0xc1, 0xcc, 0xaf, 0xe1,
+0x74, 0xfc, 0x06, 0x1a, 0xf1, 0x36, 0xcf, 0x4d, 0x56, 0x5a, 0x62, 0x59, 0xbb, 0x4a, 0xd9, 0x31,
+0x40, 0x13, 0xc4, 0xf3, 0x3b, 0xd7, 0x79, 0xc0, 0xe7, 0xb0, 0xa6, 0xa9, 0xa6, 0xaa, 0x89, 0xb4,
+0xa3, 0xc7, 0x13, 0xe3, 0x66, 0x04, 0xe9, 0x27, 0x35, 0x48, 0xf2, 0x5f, 0x50, 0x6a, 0xd6, 0x64,
+0x0f, 0x51, 0x13, 0x33, 0xfa, 0x0f, 0x9a, 0xec, 0x03, 0xcd, 0x37, 0xb4, 0x2e, 0xa4, 0xaa, 0x9d,
+0x5e, 0xa1, 0xf1, 0xaf, 0xf5, 0xc8, 0xa0, 0xea, 0x3e, 0x11, 0x77, 0x37, 0xa2, 0x57, 0xa8, 0x6c,
+0xa2, 0x72, 0xcc, 0x68, 0xf5, 0x50, 0xcb, 0x2f, 0x46, 0x0a, 0x10, 0xe5, 0x35, 0xc4, 0x0c, 0xab,
+0xa0, 0x9b, 0x3a, 0x97, 0xec, 0x9e, 0x7b, 0xb2, 0xfb, 0xd0, 0xa2, 0xf6, 0xa3, 0x1e, 0x73, 0x43,
+0x50, 0x60, 0x2c, 0x71, 0x76, 0x73, 0xa6, 0x66, 0x4b, 0x4d, 0x29, 0x2b, 0x9a, 0x04, 0x33, 0xde,
+0x81, 0xbc, 0x60, 0xa3, 0xb0, 0x95, 0x1c, 0x95, 0xf4, 0xa1, 0xfb, 0xba, 0x03, 0xdd, 0x88, 0x03,
+0x47, 0x29, 0xdb, 0x49, 0xe2, 0x61, 0x84, 0x6e, 0xf4, 0x6d, 0x02, 0x60, 0x29, 0x46, 0xc9, 0x23,
+0x3c, 0xfd, 0x5f, 0xd7, 0x39, 0xb7, 0xe8, 0xa0, 0x70, 0x97, 0xd2, 0x9b, 0xfb, 0xac, 0x3f, 0xc8,
+0xb8, 0xe9, 0xda, 0x0c, 0x93, 0x2d, 0x11, 0x49, 0xba, 0x5c, 0x7e, 0x66, 0x7a, 0x64, 0x20, 0x56,
+0xad, 0x3c, 0xe6, 0x1a, 0x6a, 0xf5, 0xa3, 0xd1, 0x07, 0xb5, 0xae, 0xa3, 0x8c, 0x9f, 0x54, 0xa8,
+0xc1, 0xbb, 0x69, 0xd6, 0x1e, 0xf4, 0xbc, 0x11, 0x7b, 0x2c, 0xb1, 0x42, 0x63, 0x52, 0xbe, 0x59,
+0xbe, 0x56, 0xb7, 0x48, 0x3b, 0x30, 0x7a, 0x10, 0x60, 0xee, 0x87, 0xcf, 0x09, 0xb9, 0xe1, 0xad,
+0xc5, 0xae, 0x17, 0xba, 0xed, 0xcc, 0xab, 0xe3, 0x7e, 0xfb, 0x48, 0x12, 0xa3, 0x26, 0x7d, 0x37,
+0x5d, 0x43, 0x79, 0x48, 0x21, 0x45, 0x55, 0x38, 0x31, 0x23, 0x80, 0x08, 0xfa, 0xec, 0xaf, 0xd5,
+0x4f, 0xc6, 0x7d, 0xc0, 0xd1, 0xc3, 0x2f, 0xce, 0xe1, 0xdc, 0x86, 0xed, 0x04, 0xfe, 0xa0, 0x0d,
+0xb6, 0x1b, 0x77, 0x27, 0xdb, 0x2f, 0x73, 0x33, 0xb3, 0x30, 0x03, 0x27, 0x3e, 0x17, 0xf6, 0x03,
+0x2c, 0xf1, 0x25, 0xe2, 0x3b, 0xd9, 0xf3, 0xd6, 0x3d, 0xda, 0x6d, 0xe1, 0x94, 0xea, 0x46, 0xf4,
+0x96, 0xfd, 0x62, 0x06, 0x3e, 0x0e, 0x3a, 0x15, 0xa2, 0x1a, 0xa7, 0x1d, 0x65, 0x1d, 0x34, 0x19,
+0x72, 0x11, 0x60, 0x07, 0x2e, 0xfd, 0xcc, 0xf4, 0x9a, 0xef, 0xb0, 0xed, 0x8c, 0xee, 0x06, 0xf1,
+0x0c, 0xf4, 0x0e, 0xf7, 0x68, 0xf9, 0x4a, 0xfb, 0x04, 0xfd, 0x34, 0xff, 0x4a, 0x02, 0x60, 0x06,
+0xba, 0x0a, 0x40, 0x0e, 0x06, 0x10, 0x74, 0x0f, 0x5a, 0x0d, 0x76, 0x0a, 0xba, 0x07, 0x58, 0x05,
+0x22, 0x03, 0x98, 0x00, 0x26, 0xfd, 0x68, 0xf8, 0x80, 0xf2, 0x62, 0xec, 0x7c, 0xe7, 0x0c, 0xe6,
+0x90, 0xe9, 0x0e, 0xf2, 0x0c, 0xfe, 0xcc, 0x0a, 0xc8, 0x15, 0x43, 0x1d, 0xc5, 0x20, 0xed, 0x20,
+0x89, 0x1e, 0x3e, 0x1a, 0x0e, 0x14, 0xc0, 0x0b, 0xc2, 0x00, 0x74, 0xf3, 0xd4, 0xe4, 0x7d, 0xd7,
+0xcf, 0xce, 0x37, 0xcd, 0x67, 0xd4, 0x55, 0xe3, 0x88, 0xf7, 0xbc, 0x0c, 0x8d, 0x1f, 0xcb, 0x2c,
+0x19, 0x34, 0x9d, 0x35, 0x61, 0x32, 0x39, 0x2b, 0x07, 0x20, 0xd6, 0x10, 0xd4, 0xfd, 0x92, 0xe8,
+0x67, 0xd3, 0x5b, 0xc2, 0xad, 0xb8, 0x6b, 0xb9, 0x2d, 0xc5, 0x51, 0xda, 0x3c, 0xf5, 0x40, 0x11,
+0xc5, 0x29, 0xfd, 0x3b, 0x9d, 0x46, 0x9d, 0x49, 0x85, 0x45, 0x91, 0x3a, 0xf9, 0x28, 0x66, 0x11,
+0xb0, 0xf5, 0xe1, 0xd8, 0x6d, 0xbf, 0x33, 0xad, 0xf2, 0xa5, 0xf2, 0xaa, 0x47, 0xbc, 0x53, 0xd7,
+0xf4, 0xf7, 0xe6, 0x18, 0xb7, 0x35, 0x1b, 0x4b, 0x72, 0x57, 0x40, 0x5a, 0x11, 0x53, 0xbb, 0x42,
+0x01, 0x2a, 0x0c, 0x0b, 0x1a, 0xe9, 0xbd, 0xc8, 0x7d, 0xae, 0x48, 0x9e, 0x3e, 0x9a, 0x0e, 0xa3,
+0x57, 0xb8, 0x3b, 0xd7, 0xae, 0xfb, 0x5f, 0x20, 0x89, 0x40, 0x80, 0x58, 0xaa, 0x65, 0x78, 0x66,
+0xc6, 0x5a, 0xfd, 0x43, 0x8b, 0x24, 0x74, 0x00, 0xcd, 0xdb, 0x71, 0xbb, 0x66, 0xa3, 0x2a, 0x96,
+0x38, 0x95, 0x14, 0xa1, 0xf3, 0xb8, 0xb9, 0xda, 0x08, 0x02, 0x71, 0x29, 0xb9, 0x4b, 0x4c, 0x64,
+0x8c, 0x6f, 0x2e, 0x6c, 0xc6, 0x5a, 0x43, 0x3e, 0x00, 0x1b, 0x22, 0xf5, 0x5b, 0xd1, 0x6b, 0xb3,
+0x78, 0x9e, 0x2c, 0x94, 0xaa, 0x95, 0x5c, 0xa3, 0x21, 0xbd, 0xb5, 0xe0, 0xb0, 0x09, 0x7f, 0x32,
+0xb9, 0x54, 0x5e, 0x6b, 0xca, 0x72, 0x30, 0x6a, 0xf1, 0x53, 0x51, 0x34, 0x10, 0x10, 0xb8, 0xeb,
+0xfd, 0xca, 0x9b, 0xb0, 0x26, 0x9f, 0x90, 0x97, 0x1e, 0x9b, 0xa0, 0xaa, 0xdd, 0xc5, 0x74, 0xea,
+0xc6, 0x13, 0x39, 0x3b, 0x72, 0x5a, 0x52, 0x6c, 0x3a, 0x6e, 0x28, 0x61, 0x5b, 0x48, 0xbd, 0x28,
+0xc4, 0x06, 0xf8, 0xe5, 0x57, 0xc9, 0x0b, 0xb3, 0x9e, 0xa4, 0x9e, 0x9f, 0x2e, 0xa5, 0xd9, 0xb5,
+0x87, 0xd1, 0x3e, 0xf5, 0xc8, 0x1b, 0x0f, 0x3f, 0xb4, 0x58, 0xd2, 0x64, 0x94, 0x62, 0x87, 0x53,
+0x6b, 0x3b, 0x91, 0x1e, 0x8c, 0x00, 0x38, 0xe4, 0x25, 0xcc, 0xdb, 0xb9, 0xf3, 0xae, 0xbb, 0xac,
+0x13, 0xb4, 0x81, 0xc5, 0x77, 0xdf, 0x50, 0xff, 0xdb, 0x1f, 0xf7, 0x3b, 0xd5, 0x4e, 0x02, 0x56,
+0x3d, 0x51, 0xdb, 0x42, 0xb5, 0x2d, 0x1a, 0x15, 0x58, 0xfc, 0x8c, 0xe5, 0xbd, 0xd2, 0x77, 0xc5,
+0x9b, 0xbe, 0x09, 0xbf, 0x45, 0xc7, 0x97, 0xd6, 0xb4, 0xeb, 0x04, 0x04, 0x10, 0x1c, 0x19, 0x30,
+0x0d, 0x3d, 0x39, 0x41, 0xe9, 0x3c, 0x6b, 0x31, 0x11, 0x21, 0x64, 0x0e, 0xb6, 0xfb, 0x20, 0xeb,
+0x33, 0xde, 0xd7, 0xd5, 0xaf, 0xd2, 0x93, 0xd4, 0x2d, 0xdb, 0xca, 0xe5, 0x24, 0xf3, 0x20, 0x02,
+0x2c, 0x11, 0x1d, 0x1e, 0xff, 0x26, 0x85, 0x2a, 0x23, 0x28, 0xd9, 0x20, 0x36, 0x16, 0xd2, 0x09,
+0xee, 0xfd, 0x14, 0xf4, 0x44, 0xed, 0xd0, 0xe9, 0x24, 0xe9, 0x4e, 0xea, 0x72, 0xec, 0x62, 0xef,
+0x70, 0xf3, 0x50, 0xf9, 0xd4, 0x00, 0xe6, 0x08, 0xe4, 0x0f, 0xfc, 0x13, 0xa4, 0x14, 0xfa, 0x11,
+0x66, 0x0d, 0x4e, 0x08, 0x22, 0x04, 0xe4, 0x01, 0x40, 0x01, 0x36, 0x01, 0x60, 0x00, 0xe2, 0xfd,
+0x2e, 0xf9, 0xc4, 0xf3, 0x4c, 0xef, 0x68, 0xed, 0xfc, 0xee, 0x68, 0xf3, 0xd6, 0xf8, 0xf2, 0xfd,
+0xf8, 0x01, 0xfc, 0x04, 0xd0, 0x07, 0x46, 0x0b, 0x92, 0x0f, 0x3e, 0x14, 0xe2, 0x17, 0xbc, 0x18,
+0x74, 0x15, 0x7e, 0x0d, 0xa4, 0x01, 0xec, 0xf3, 0x52, 0xe7, 0x59, 0xde, 0x75, 0xda, 0xb7, 0xdb,
+0xfb, 0xe0, 0xc2, 0xe8, 0x3e, 0xf2, 0xe8, 0xfc, 0xac, 0x08, 0x2a, 0x15, 0x1f, 0x21, 0xa9, 0x2a,
+0xe5, 0x2f, 0x01, 0x2f, 0x15, 0x27, 0xc4, 0x18, 0xb4, 0x05, 0xbc, 0xf0, 0x35, 0xdd, 0x37, 0xce,
+0xef, 0xc5, 0xe5, 0xc4, 0xf3, 0xca, 0xc9, 0xd6, 0x48, 0xe7, 0x08, 0xfb, 0x1c, 0x10, 0x55, 0x24,
+0x39, 0x35, 0x85, 0x40, 0x4f, 0x44, 0xe7, 0x3f, 0x0d, 0x33, 0xfb, 0x1e, 0xe4, 0x05, 0xa6, 0xea,
+0xfd, 0xd0, 0xeb, 0xbc, 0x67, 0xb1, 0x17, 0xb0, 0x33, 0xb9, 0x3d, 0xcb, 0x00, 0xe4, 0x3e, 0x00,
+0x4f, 0x1c, 0xd7, 0x34, 0x45, 0x47, 0x97, 0x51, 0xd5, 0x52, 0xa9, 0x4a, 0xb7, 0x39, 0xf7, 0x20,
+0xac, 0x02, 0x0d, 0xe2, 0x61, 0xc3, 0xa3, 0xab, 0x08, 0x9f, 0xdc, 0x9f, 0xf1, 0xad, 0x3b, 0xc7,
+0x80, 0xe7, 0xda, 0x09, 0xbb, 0x29, 0x9d, 0x43, 0x7c, 0x55, 0x2a, 0x5e, 0xde, 0x5c, 0x8d, 0x51,
+0xc3, 0x3c, 0xad, 0x1f, 0x72, 0xfc, 0xdf, 0xd6, 0x61, 0xb4, 0x08, 0x9b, 0xcc, 0x8f, 0xe8, 0x94,
+0x4e, 0xa9, 0x11, 0xc9, 0x9e, 0xee, 0xf0, 0x13, 0xaf, 0x34, 0x1b, 0x4e, 0x90, 0x5e, 0x58, 0x65,
+0xca, 0x61, 0xa1, 0x53, 0x6b, 0x3b, 0x74, 0x1a, 0x30, 0xf3, 0x71, 0xca, 0x0e, 0xa7, 0x50, 0x8f,
+0x18, 0x88, 0x82, 0x92, 0x03, 0xac, 0x91, 0xcf, 0xce, 0xf6, 0x3a, 0x1c, 0x11, 0x3c, 0x47, 0x54,
+0x5c, 0x63, 0x0e, 0x68, 0xda, 0x61, 0x6b, 0x50, 0x91, 0x34, 0x34, 0x10, 0xba, 0xe6, 0x07, 0xbe,
+0x14, 0x9d, 0x20, 0x8a, 0x0e, 0x88, 0x1e, 0x97, 0xa1, 0xb3, 0x2d, 0xd8, 0xf6, 0xfe, 0xe3, 0x22,
+0xf3, 0x40, 0x28, 0x57, 0xe6, 0x63, 0xa4, 0x65, 0x02, 0x5c, 0x39, 0x47, 0x97, 0x28, 0x0c, 0x03,
+0x05, 0xdb, 0x6b, 0xb6, 0x6c, 0x9b, 0x80, 0x8e, 0x48, 0x91, 0x96, 0xa2, 0x37, 0xbf, 0x2d, 0xe2,
+0x46, 0x06, 0x43, 0x27, 0x07, 0x42, 0xce, 0x54, 0xe8, 0x5d, 0x4c, 0x5c, 0xa7, 0x4f, 0x4d, 0x39,
+0x36, 0x1b, 0x8a, 0xf8, 0xf7, 0xd5, 0x03, 0xb8, 0x32, 0xa3, 0x80, 0x9a, 0xd4, 0x9e, 0x71, 0xaf,
+0x9b, 0xc9, 0x3e, 0xe9, 0xc4, 0x09, 0x79, 0x27, 0x11, 0x3f, 0x33, 0x4e, 0x79, 0x53, 0x25, 0x4e,
+0x6b, 0x3f, 0x15, 0x29, 0x16, 0x0e, 0x78, 0xf1, 0x6f, 0xd6, 0x33, 0xc0, 0x41, 0xb1, 0x9f, 0xab,
+0x63, 0xb0, 0x2b, 0xbf, 0x09, 0xd6, 0x8e, 0xf1, 0x9e, 0x0d, 0x2b, 0x26, 0x7d, 0x38, 0x43, 0x42,
+0xd9, 0x42, 0x0d, 0x3b, 0x97, 0x2c, 0x26, 0x1a, 0xf6, 0x05, 0xd8, 0xf1, 0x39, 0xdf, 0x9d, 0xcf,
+0x93, 0xc4, 0x0b, 0xc0, 0x77, 0xc3, 0x0f, 0xcf, 0x53, 0xe1, 0x3a, 0xf7, 0x06, 0x0d, 0x31, 0x1f,
+0x09, 0x2b, 0xcb, 0x2f, 0xab, 0x2d, 0x49, 0x26, 0xe8, 0x1b, 0x1e, 0x10, 0x2c, 0x04, 0x8e, 0xf8,
+0x36, 0xed, 0xa9, 0xe2, 0x7b, 0xda, 0x17, 0xd6, 0x5b, 0xd7, 0xc3, 0xde, 0x02, 0xeb, 0xc4, 0xf9,
+0xd2, 0x07, 0x66, 0x12, 0x2e, 0x18, 0x44, 0x19, 0xde, 0x16, 0xe2, 0x12, 0x8a, 0x0e, 0xc8, 0x0a,
+0x26, 0x07, 0x2e, 0x03, 0x0a, 0xfe, 0xd2, 0xf7, 0x52, 0xf1, 0x80, 0xec, 0x8a, 0xea, 0x3a, 0xec,
+0x18, 0xf1, 0x16, 0xf7, 0x88, 0xfc, 0xfc, 0xff, 0x20, 0x01, 0x1e, 0x01, 0x42, 0x01, 0x60, 0x02,
+0x12, 0x05, 0x00, 0x09, 0x24, 0x0d, 0x38, 0x10, 0xfa, 0x10, 0x80, 0x0e, 0x86, 0x09, 0xca, 0x02,
+0x00, 0xfc, 0x0e, 0xf6, 0x76, 0xf1, 0x16, 0xee, 0x60, 0xeb, 0x82, 0xe9, 0xf4, 0xe8, 0x7e, 0xea,
+0xbe, 0xee, 0x08, 0xf6, 0xb4, 0xff, 0x0a, 0x0b, 0x9a, 0x16, 0x01, 0x20, 0xc1, 0x25, 0x21, 0x26,
+0x95, 0x20, 0x2c, 0x16, 0x6e, 0x08, 0x6c, 0xf9, 0x46, 0xeb, 0x71, 0xdf, 0xd3, 0xd6, 0x5f, 0xd2,
+0x45, 0xd2, 0xbf, 0xd6, 0xe7, 0xdf, 0x46, 0xed, 0xfc, 0xfd, 0xa2, 0x10, 0x09, 0x23, 0x8d, 0x32,
+0x23, 0x3c, 0x77, 0x3d, 0x85, 0x35, 0x01, 0x25, 0xe2, 0x0e, 0x96, 0xf6, 0xf5, 0xdf, 0xe1, 0xcd,
+0x23, 0xc2, 0x17, 0xbd, 0xf3, 0xbe, 0x2b, 0xc7, 0x29, 0xd5, 0xae, 0xe8, 0x26, 0x00, 0xb8, 0x19,
+0x77, 0x32, 0x93, 0x46, 0xe7, 0x51, 0xa5, 0x51, 0x8b, 0x44, 0xb9, 0x2c, 0x7c, 0x0e, 0xfc, 0xee,
+0xf1, 0xd2, 0xe3, 0xbd, 0x1d, 0xb1, 0x01, 0xad, 0xd9, 0xb0, 0x5f, 0xbc, 0x47, 0xcf, 0xa0, 0xe8,
+0xba, 0x06, 0x55, 0x26, 0x73, 0x43, 0x62, 0x59, 0x84, 0x63, 0xde, 0x5e, 0xf5, 0x4b, 0xcf, 0x2d,
+0xe0, 0x09, 0x2c, 0xe6, 0x51, 0xc7, 0xe5, 0xb0, 0x3e, 0xa4, 0x22, 0xa1, 0x7a, 0xa7, 0x03, 0xb7,
+0x23, 0xcf, 0xa0, 0xee, 0x40, 0x12, 0xd3, 0x35, 0x6d, 0x54, 0xc6, 0x68, 0xcc, 0x6e, 0x02, 0x65,
+0xa9, 0x4c, 0x3b, 0x2a, 0x3c, 0x03, 0x29, 0xdd, 0x1d, 0xbd, 0x28, 0xa6, 0xe6, 0x99, 0xd4, 0x98,
+0x98, 0xa2, 0xe5, 0xb6, 0xd3, 0xd4, 0x5e, 0xf9, 0x51, 0x20, 0x87, 0x44, 0xd2, 0x60, 0xe4, 0x70,
+0x26, 0x72, 0xec, 0x63, 0xc1, 0x48, 0xe9, 0x24, 0x42, 0xfd, 0x27, 0xd7, 0x07, 0xb7, 0xa0, 0xa0,
+0xac, 0x95, 0x08, 0x97, 0xbc, 0xa4, 0xcd, 0xbd, 0xe7, 0xdf, 0x80, 0x06, 0x91, 0x2c, 0x29, 0x4d,
+0xb6, 0x64, 0xde, 0x6f, 0x40, 0x6d, 0x3c, 0x5d, 0x8d, 0x41, 0x09, 0x1e, 0xfc, 0xf6, 0x4d, 0xd1,
+0x25, 0xb2, 0x82, 0x9d, 0x62, 0x95, 0xc8, 0x9a, 0x0f, 0xad, 0xe1, 0xc9, 0x82, 0xed, 0xc0, 0x12,
+0xbb, 0x34, 0x37, 0x50, 0x8a, 0x62, 0xe8, 0x69, 0x2c, 0x65, 0x65, 0x54, 0x41, 0x39, 0xae, 0x16,
+0xb0, 0xf0, 0xaf, 0xcc, 0xe7, 0xaf, 0x90, 0x9e, 0xea, 0x9a, 0xa2, 0xa4, 0x0f, 0xba, 0xcd, 0xd7,
+0x0e, 0xf9, 0x46, 0x19, 0x4d, 0x35, 0xc9, 0x4a, 0x76, 0x58, 0x40, 0x5d, 0xb8, 0x57, 0x15, 0x48,
+0xed, 0x2e, 0x94, 0x0e, 0x8a, 0xeb, 0x41, 0xcb, 0x1f, 0xb3, 0xd4, 0xa6, 0x04, 0xa8, 0x13, 0xb5,
+0x49, 0xcb, 0x18, 0xe6, 0x9a, 0x01, 0xcc, 0x1a, 0xcb, 0x2f, 0xd5, 0x3f, 0xc5, 0x49, 0xcb, 0x4c,
+0xa3, 0x47, 0xad, 0x39, 0x7b, 0x23, 0x6e, 0x07, 0xcc, 0xe9, 0xc5, 0xcf, 0x31, 0xbe, 0x65, 0xb7,
+0xbf, 0xbb, 0xf5, 0xc8, 0x9b, 0xdb, 0x54, 0xf0, 0x34, 0x04, 0xb2, 0x15, 0x31, 0x24, 0x67, 0x2f,
+0xab, 0x36, 0x25, 0x39, 0x59, 0x35, 0x6d, 0x2a, 0xe4, 0x18, 0xfe, 0x02, 0xc0, 0xec, 0x51, 0xda,
+0x0b, 0xcf, 0x61, 0xcc, 0x61, 0xd1, 0xc1, 0xdb, 0xca, 0xe8, 0x44, 0xf6, 0xaa, 0x02, 0x94, 0x0d,
+0x8c, 0x16, 0xa5, 0x1d, 0x87, 0x22, 0x71, 0x24, 0x9d, 0x22, 0x3a, 0x1c, 0xb4, 0x11, 0x8e, 0x04,
+0x6a, 0xf7, 0x90, 0xec, 0x2c, 0xe6, 0x70, 0xe4, 0xac, 0xe6, 0x48, 0xeb, 0x04, 0xf1, 0xd4, 0xf6,
+0x1c, 0xfc, 0x9a, 0x00, 0x6e, 0x04, 0xfc, 0x07, 0x70, 0x0b, 0xd6, 0x0e, 0x3a, 0x11, 0xee, 0x11,
+0x46, 0x10, 0x64, 0x0c, 0x38, 0x07, 0x04, 0x02, 0xc4, 0xfd, 0x12, 0xfb, 0xb4, 0xf9, 0x10, 0xf9,
+0x66, 0xf8, 0x38, 0xf7, 0x2c, 0xf5, 0xd8, 0xf2, 0xe6, 0xf0, 0xc2, 0xf0, 0x9c, 0xf3, 0xca, 0xf9,
+0xa2, 0x02, 0x24, 0x0c, 0x7e, 0x14, 0xb4, 0x19, 0x66, 0x1b, 0xc8, 0x19, 0xf8, 0x15, 0x98, 0x10,
+0x56, 0x0a, 0x58, 0x03, 0x36, 0xfb, 0x18, 0xf2, 0x4c, 0xe8, 0x37, 0xdf, 0xd9, 0xd8, 0x81, 0xd7,
+0xdf, 0xdc, 0x0e, 0xe9, 0x5c, 0xfa, 0x4e, 0x0d, 0x75, 0x1e, 0xa9, 0x2a, 0x9d, 0x30, 0x6f, 0x30,
+0x55, 0x2b, 0xb3, 0x22, 0x70, 0x17, 0xfa, 0x09, 0x6a, 0xfa, 0x72, 0xe9, 0xb5, 0xd8, 0xdd, 0xca,
+0xc9, 0xc2, 0x2d, 0xc3, 0x4b, 0xcd, 0x59, 0xe0, 0x4a, 0xf9, 0x9a, 0x13, 0x71, 0x2a, 0xa3, 0x3a,
+0xb5, 0x42, 0xfd, 0x42, 0xb7, 0x3c, 0x0d, 0x31, 0xbb, 0x20, 0x5c, 0x0c, 0xe0, 0xf4, 0x47, 0xdc,
+0xe5, 0xc5, 0x3f, 0xb5, 0xf3, 0xad, 0x27, 0xb2, 0x43, 0xc2, 0x23, 0xdc, 0xce, 0xfb, 0xc0, 0x1b,
+0x27, 0x37, 0x5f, 0x4a, 0x01, 0x54, 0x0f, 0x54, 0x3f, 0x4b, 0xcd, 0x3a, 0xcd, 0x23, 0xbc, 0x07,
+0x00, 0xe9, 0x65, 0xcb, 0xd9, 0xb2, 0x76, 0xa3, 0xbe, 0x9f, 0xd0, 0xa8, 0x0b, 0xbe, 0xb5, 0xdc,
+0x58, 0x00, 0xb1, 0x23, 0xdf, 0x41, 0x66, 0x57, 0x3e, 0x62, 0x84, 0x61, 0x86, 0x55, 0x7f, 0x3f,
+0x77, 0x21, 0xa4, 0xfe, 0xe3, 0xda, 0xf7, 0xba, 0x66, 0xa3, 0x3a, 0x97, 0x10, 0x98, 0xc0, 0xa5,
+0xeb, 0xbe, 0xc7, 0xe0, 0x14, 0x07, 0xa9, 0x2c, 0xcb, 0x4c, 0x48, 0x63, 0x46, 0x6d, 0x7e, 0x69,
+0x3c, 0x58, 0xd3, 0x3b, 0x02, 0x18, 0x3e, 0xf1, 0xa3, 0xcc, 0xc5, 0xae, 0x0e, 0x9b, 0x42, 0x93,
+0xbc, 0x97, 0x1a, 0xa8, 0x3d, 0xc3, 0x90, 0xe6, 0x26, 0x0e, 0x1b, 0x35, 0xd0, 0x55, 0xc4, 0x6b,
+0x30, 0x73, 0xd0, 0x6a, 0x2f, 0x54, 0x21, 0x33, 0x8e, 0x0c, 0xd8, 0xe5, 0xa5, 0xc3, 0x8a, 0xa9,
+0xf8, 0x99, 0x72, 0x95, 0x3a, 0x9c, 0x05, 0xae, 0x01, 0xca, 0x06, 0xee, 0x0c, 0x16, 0x7b, 0x3c,
+0x98, 0x5b, 0x24, 0x6e, 0xc0, 0x70, 0x74, 0x63, 0x09, 0x49, 0x8b, 0x26, 0x76, 0x01, 0x65, 0xde,
+0x03, 0xc1, 0xb3, 0xab, 0xac, 0x9f, 0x90, 0x9d, 0x9a, 0xa5, 0xfb, 0xb7, 0x1d, 0xd4, 0x9e, 0xf7,
+0x1b, 0x1e, 0xf1, 0x41, 0xd4, 0x5c, 0x16, 0x6a, 0x90, 0x67, 0x7c, 0x56, 0x13, 0x3b, 0x54, 0x1a,
+0x16, 0xf9, 0x09, 0xdb, 0xb7, 0xc2, 0xb7, 0xb1, 0x08, 0xa9, 0x10, 0xa9, 0x55, 0xb2, 0x27, 0xc5,
+0x4d, 0xe0, 0x5a, 0x01, 0x85, 0x23, 0x87, 0x41, 0x24, 0x56, 0xe2, 0x5d, 0xf8, 0x57, 0xb1, 0x46,
+0xdb, 0x2d, 0xd4, 0x11, 0x44, 0xf6, 0xb5, 0xdd, 0x6b, 0xca, 0x83, 0xbd, 0xcd, 0xb7, 0xd5, 0xb9,
+0xd1, 0xc3, 0x43, 0xd5, 0xee, 0xec, 0xd4, 0x07, 0x7b, 0x22, 0xb9, 0x38, 0xdb, 0x46, 0xd1, 0x4a,
+0x9d, 0x44, 0xe9, 0x35, 0xe1, 0x21, 0x96, 0x0b, 0xcc, 0xf5, 0x25, 0xe3, 0xf7, 0xd4, 0x61, 0xcc,
+0xd7, 0xc9, 0x6d, 0xcd, 0x85, 0xd6, 0x78, 0xe4, 0xa4, 0xf5, 0x5a, 0x08, 0x46, 0x1a, 0xf5, 0x28,
+0x53, 0x32, 0xdd, 0x34, 0x7b, 0x30, 0x27, 0x26, 0xde, 0x17, 0x12, 0x08, 0x28, 0xf9, 0xdc, 0xec,
+0x76, 0xe4, 0x5f, 0xe0, 0x41, 0xe0, 0x87, 0xe3, 0x00, 0xe9, 0xf0, 0xef, 0xf8, 0xf7, 0xd2, 0x00,
+0x30, 0x0a, 0x20, 0x13, 0x22, 0x1a, 0xa7, 0x1d, 0xf5, 0x1c, 0x0a, 0x18, 0x4c, 0x10, 0xb4, 0x07,
+0x38, 0x00, 0xf0, 0xfa, 0x32, 0xf8, 0x9e, 0xf7, 0x10, 0xf8, 0x2a, 0xf8, 0x2e, 0xf7, 0x4c, 0xf5,
+0x9c, 0xf3, 0xb0, 0xf3, 0x66, 0xf6, 0x70, 0xfb, 0xa0, 0x01, 0x46, 0x07, 0xf8, 0x0a, 0x6c, 0x0c,
+0x34, 0x0c, 0xca, 0x0b, 0x14, 0x0c, 0x52, 0x0d, 0xc6, 0x0e, 0x4a, 0x0f, 0x3a, 0x0d, 0xc4, 0x07,
+0x00, 0xff, 0x52, 0xf4, 0x4a, 0xea, 0x4b, 0xe3, 0x15, 0xe1, 0xc0, 0xe3, 0x32, 0xea, 0x96, 0xf2,
+0x82, 0xfb, 0x0c, 0x04, 0x4e, 0x0c, 0x9c, 0x14, 0x85, 0x1c, 0x21, 0x23, 0xbf, 0x26, 0xbf, 0x25,
+0x31, 0x1f, 0xf8, 0x12, 0x50, 0x02, 0xd2, 0xef, 0xd1, 0xde, 0x45, 0xd2, 0x57, 0xcc, 0x59, 0xcd,
+0xad, 0xd4, 0xa1, 0xe0, 0x9a, 0xef, 0x50, 0x00, 0x8e, 0x11, 0xf9, 0x21, 0xdf, 0x2f, 0x3b, 0x39,
+0x2f, 0x3c, 0xbd, 0x37, 0xcb, 0x2b, 0x50, 0x19, 0x28, 0x02, 0x60, 0xe9, 0x8b, 0xd2, 0x57, 0xc1,
+0x3b, 0xb8, 0x99, 0xb8, 0x0f, 0xc2, 0x43, 0xd3, 0xd6, 0xe9, 0x4c, 0x03, 0x85, 0x1c, 0xd3, 0x32,
+0x85, 0x43, 0xa7, 0x4c, 0x1f, 0x4d, 0x69, 0x44, 0x63, 0x33, 0x72, 0x1b, 0xf0, 0xfe, 0xd9, 0xe0,
+0x59, 0xc5, 0x47, 0xb0, 0x78, 0xa5, 0xbc, 0xa6, 0x4f, 0xb4, 0x59, 0xcc, 0x32, 0xeb, 0x78, 0x0c,
+0x85, 0x2b, 0xa7, 0x44, 0x34, 0x55, 0xe0, 0x5b, 0x6c, 0x58, 0x5d, 0x4b, 0xbf, 0x35, 0x54, 0x19,
+0x46, 0xf8, 0xf1, 0xd5, 0xc3, 0xb6, 0xca, 0x9f, 0x68, 0x95, 0x3c, 0x9a, 0xcd, 0xad, 0x2f, 0xcd,
+0xd6, 0xf2, 0xcc, 0x18, 0xc5, 0x39, 0x63, 0x52, 0xec, 0x60, 0xd0, 0x64, 0x3e, 0x5e, 0xcf, 0x4d,
+0xc7, 0x34, 0xa0, 0x14, 0xc6, 0xef, 0x1f, 0xca, 0x36, 0xa9, 0xca, 0x92, 0x90, 0x8b, 0x8e, 0x95,
+0x1d, 0xaf, 0xc1, 0xd3, 0xbc, 0xfc, 0x9f, 0x23, 0xb9, 0x43, 0x48, 0x5a, 0x6a, 0x66, 0xb8, 0x67,
+0x86, 0x5e, 0x59, 0x4b, 0x71, 0x2f, 0x68, 0x0c, 0x52, 0xe5, 0xc3, 0xbe, 0xe6, 0x9e, 0xd4, 0x8b,
+0x46, 0x89, 0x42, 0x98, 0xbd, 0xb5, 0x71, 0xdc, 0x6c, 0x05, 0xc7, 0x2a, 0xb5, 0x48, 0x30, 0x5d,
+0x30, 0x67, 0x2c, 0x66, 0x9a, 0x5a, 0x05, 0x45, 0xc5, 0x26, 0x08, 0x02, 0xa1, 0xda, 0xeb, 0xb5,
+0x04, 0x9a, 0x0e, 0x8c, 0x86, 0x8e, 0x08, 0xa1, 0xf9, 0xbf, 0xda, 0xe5, 0x96, 0x0c, 0x15, 0x2f,
+0x0d, 0x4a, 0x94, 0x5b, 0x96, 0x62, 0x8e, 0x5e, 0xfd, 0x4f, 0x13, 0x38, 0xbc, 0x18, 0x0c, 0xf5,
+0x3d, 0xd1, 0x87, 0xb2, 0x80, 0x9d, 0x74, 0x95, 0x8e, 0x9b, 0xb5, 0xae, 0xc7, 0xcb, 0xf4, 0xed,
+0x70, 0x10, 0xef, 0x2e, 0x73, 0x46, 0xbd, 0x54, 0xd6, 0x58, 0x5b, 0x52, 0x57, 0x42, 0x6b, 0x2a,
+0x1e, 0x0d, 0xe4, 0xed, 0x75, 0xd0, 0xd9, 0xb8, 0xb4, 0xa9, 0x52, 0xa5, 0x05, 0xac, 0x41, 0xbd,
+0x7d, 0xd6, 0x2e, 0xf4, 0xe0, 0x11, 0xe3, 0x2b, 0x09, 0x3f, 0x1f, 0x49, 0x73, 0x49, 0x8f, 0x40,
+0x43, 0x30, 0xa0, 0x1a, 0xae, 0x02, 0x04, 0xeb, 0x31, 0xd6, 0xf7, 0xc5, 0xed, 0xbb, 0x31, 0xb9,
+0xdd, 0xbe, 0xa3, 0xcc, 0x17, 0xe1, 0xfe, 0xf8, 0xe2, 0x10, 0x11, 0x25, 0xb7, 0x32, 0x2f, 0x38,
+0x95, 0x35, 0x75, 0x2c, 0xcd, 0x1e, 0x04, 0x0f, 0x0a, 0xff, 0x72, 0xf0, 0x95, 0xe3, 0x29, 0xd9,
+0xb7, 0xd1, 0xb5, 0xce, 0x65, 0xd1, 0x6d, 0xda, 0xcc, 0xe8, 0x0a, 0xfa, 0x32, 0x0b, 0xe2, 0x18,
+0x15, 0x21, 0x11, 0x23, 0xf1, 0x1f, 0x78, 0x19, 0x86, 0x11, 0x90, 0x09, 0x36, 0x02, 0xa4, 0xfb,
+0x24, 0xf5, 0x78, 0xee, 0x1c, 0xe8, 0xbb, 0xe3, 0xd9, 0xe2, 0x5a, 0xe6, 0xd8, 0xed, 0x6e, 0xf7,
+0xda, 0x00, 0xca, 0x07, 0x56, 0x0b, 0xda, 0x0b, 0xba, 0x0a, 0x4c, 0x09, 0x62, 0x08, 0x80, 0x08,
+0x38, 0x09, 0x9e, 0x09, 0x6e, 0x08, 0xd0, 0x04, 0x36, 0xff, 0xf4, 0xf8, 0xc2, 0xf3, 0x82, 0xf0,
+0x90, 0xef, 0x2c, 0xf0, 0x4e, 0xf1, 0x56, 0xf2, 0x36, 0xf3, 0xa2, 0xf4, 0x72, 0xf7, 0x42, 0xfc,
+0xca, 0x02, 0xbe, 0x0a, 0xfe, 0x12, 0xd2, 0x19, 0x61, 0x1d, 0x81, 0x1c, 0x14, 0x17, 0xc2, 0x0d,
+0x40, 0x02, 0x24, 0xf6, 0x1c, 0xeb, 0x61, 0xe2, 0x65, 0xdc, 0xbf, 0xd9, 0x97, 0xda, 0x37, 0xdf,
+0x62, 0xe7, 0xfa, 0xf2, 0x22, 0x01, 0xae, 0x10, 0xcb, 0x1f, 0x2f, 0x2c, 0x6b, 0x33, 0xa7, 0x33,
+0x13, 0x2c, 0x23, 0x1d, 0x62, 0x09, 0xd0, 0xf3, 0xeb, 0xdf, 0x37, 0xd0, 0xa5, 0xc6, 0x67, 0xc3,
+0xa5, 0xc6, 0x99, 0xcf, 0x6f, 0xdd, 0x46, 0xef, 0x16, 0x04, 0x1a, 0x1a, 0xcb, 0x2e, 0x79, 0x3f,
+0xc1, 0x48, 0x0b, 0x48, 0x0d, 0x3c, 0x13, 0x26, 0xa6, 0x09, 0xe2, 0xeb, 0x53, 0xd1, 0xa9, 0xbd,
+0xb7, 0xb2, 0xef, 0xb0, 0x33, 0xb7, 0x91, 0xc4, 0xa1, 0xd7, 0x64, 0xef, 0x4c, 0x0a, 0xf1, 0x25,
+0x49, 0x3f, 0x53, 0x52, 0x68, 0x5b, 0x0e, 0x57, 0x2d, 0x45, 0xf5, 0x27, 0xb0, 0x04, 0x47, 0xe1,
+0x4f, 0xc3, 0x39, 0xae, 0xb0, 0xa3, 0xb6, 0xa3, 0xdb, 0xac, 0x0f, 0xbe, 0x07, 0xd6, 0x5a, 0xf3,
+0xb6, 0x13, 0xff, 0x33, 0xff, 0x4f, 0x10, 0x63, 0x1e, 0x69, 0xba, 0x5f, 0xa9, 0x47, 0xfb, 0x24,
+0x52, 0xfd, 0x39, 0xd7, 0xcf, 0xb7, 0xcc, 0xa2, 0x3e, 0x99, 0x00, 0x9b, 0x2a, 0xa7, 0x5d, 0xbc,
+0x85, 0xd9, 0xf4, 0xfb, 0x81, 0x20, 0xe7, 0x42, 0x56, 0x5e, 0x2e, 0x6e, 0x16, 0x6f, 0x50, 0x60,
+0xe3, 0x43, 0x4f, 0x1e, 0x5e, 0xf5, 0xd9, 0xce, 0xe7, 0xaf, 0xdc, 0x9b, 0xd6, 0x93, 0xd8, 0x97,
+0x52, 0xa7, 0x03, 0xc1, 0x9b, 0xe2, 0x86, 0x08, 0x3f, 0x2e, 0x11, 0x4f, 0xc8, 0x66, 0x6c, 0x71,
+0x56, 0x6d, 0x0e, 0x5b, 0x21, 0x3d, 0x88, 0x17, 0x40, 0xef, 0x93, 0xc9, 0x85, 0xab, 0xc4, 0x98,
+0x9e, 0x92, 0xac, 0x99, 0x25, 0xad, 0x0d, 0xcb, 0x74, 0xef, 0x9c, 0x15, 0xbf, 0x38, 0xbf, 0x54,
+0xac, 0x66, 0x2c, 0x6c, 0xce, 0x64, 0x8f, 0x51, 0x99, 0x34, 0xd6, 0x10, 0x94, 0xea, 0xf5, 0xc6,
+0xfc, 0xaa, 0xac, 0x9a, 0xb6, 0x97, 0x7e, 0xa2, 0x65, 0xb9, 0x23, 0xd9, 0xc6, 0xfc, 0x49, 0x1f,
+0xdf, 0x3c, 0xb5, 0x52, 0x2c, 0x5f, 0x58, 0x61, 0x0c, 0x59, 0xe3, 0x46, 0x09, 0x2c, 0xe6, 0x0a,
+0x36, 0xe7, 0x61, 0xc6, 0xab, 0xad, 0xd8, 0xa0, 0xf2, 0xa1, 0x0f, 0xb0, 0x97, 0xc8, 0xf8, 0xe6,
+0x70, 0x06, 0xbb, 0x22, 0x85, 0x39, 0x55, 0x49, 0x85, 0x51, 0xd7, 0x51, 0xff, 0x49, 0xe1, 0x39,
+0xfd, 0x21, 0xac, 0x04, 0x5c, 0xe5, 0x8d, 0xc9, 0xf9, 0xb5, 0x33, 0xae, 0xf3, 0xb2, 0xa9, 0xc2,
+0x59, 0xd9, 0xb8, 0xf2, 0x00, 0x0b, 0x8f, 0x1f, 0x53, 0x2f, 0xf1, 0x39, 0x5f, 0x3f, 0x3b, 0x3f,
+0x21, 0x39, 0x03, 0x2c, 0x72, 0x18, 0x70, 0x00, 0xac, 0xe7, 0x7b, 0xd2, 0x1b, 0xc5, 0xaf, 0xc1,
+0xe9, 0xc7, 0xad, 0xd5, 0x3a, 0xe7, 0x3a, 0xf9, 0x8e, 0x09, 0xec, 0x16, 0xb9, 0x20, 0x45, 0x27,
+0xb1, 0x2a, 0xc1, 0x2a, 0xd3, 0x26, 0x37, 0x1e, 0xf4, 0x10, 0xe8, 0x00, 0xac, 0xf0, 0x21, 0xe3,
+0x0f, 0xdb, 0x9d, 0xd9, 0x0f, 0xde, 0x6c, 0xe6, 0x74, 0xf0, 0x1a, 0xfa, 0x72, 0x02, 0x22, 0x09,
+0x16, 0x0e, 0xba, 0x11, 0x80, 0x14, 0x3c, 0x16, 0x3c, 0x16, 0xfe, 0x13, 0x06, 0x0f, 0xf8, 0x07,
+0xf2, 0xff, 0x90, 0xf8, 0x50, 0xf3, 0x02, 0xf1, 0x68, 0xf1, 0x50, 0xf3, 0xfc, 0xf5, 0x2e, 0xf8,
+0x80, 0xf9, 0x04, 0xfa, 0x36, 0xfa, 0xd8, 0xfa, 0x02, 0xfd, 0x28, 0x01, 0xae, 0x06, 0x94, 0x0c,
+0x62, 0x11, 0xa4, 0x13, 0x06, 0x13, 0x28, 0x10, 0xb8, 0x0b, 0x06, 0x07, 0x6a, 0x02, 0xd0, 0xfd,
+0xda, 0xf8, 0x8c, 0xf3, 0xa6, 0xed, 0xf2, 0xe7, 0xe2, 0xe3, 0x0b, 0xe3, 0x12, 0xe7, 0x80, 0xf0,
+0x54, 0xfe, 0xd0, 0x0d, 0x22, 0x1c, 0xfb, 0x25, 0x05, 0x2a, 0x75, 0x28, 0x95, 0x22, 0xcc, 0x19,
+0x4c, 0x0f, 0xb2, 0x03, 0x3a, 0xf7, 0x30, 0xea, 0x21, 0xdd, 0xf7, 0xd1, 0x6b, 0xcb, 0xe3, 0xcb,
+0x85, 0xd4, 0x68, 0xe5, 0xfc, 0xfb, 0x76, 0x14, 0xf9, 0x29, 0x05, 0x39, 0x6d, 0x3f, 0xad, 0x3d,
+0x6b, 0x35, 0x37, 0x28, 0xc8, 0x17, 0xfe, 0x04, 0xe0, 0xf0, 0x91, 0xdc, 0x3f, 0xca, 0x79, 0xbc,
+0x61, 0xb6, 0x47, 0xba, 0xed, 0xc8, 0xdf, 0xe0, 0xae, 0xfe, 0x53, 0x1d, 0xa1, 0x37, 0xcb, 0x49,
+0xbf, 0x51, 0xa1, 0x4f, 0x01, 0x45, 0x89, 0x33, 0xcf, 0x1c, 0x88, 0x02, 0xba, 0xe6, 0x1b, 0xcc,
+0x2b, 0xb6, 0x62, 0xa8, 0x7c, 0xa5, 0xff, 0xae, 0x63, 0xc4, 0xd9, 0xe2, 0xea, 0x05, 0x6b, 0x28,
+0x47, 0x45, 0xb2, 0x58, 0xc4, 0x60, 0xfc, 0x5c, 0xc7, 0x4e, 0x25, 0x38, 0x0c, 0x1b, 0x3e, 0xfa,
+0xfd, 0xd8, 0x77, 0xbb, 0xa4, 0xa5, 0xbe, 0x9a, 0x7e, 0x9c, 0xfc, 0xaa, 0xf1, 0xc4, 0xd2, 0xe6,
+0x5c, 0x0c, 0xa3, 0x30, 0xff, 0x4e, 0x76, 0x63, 0x84, 0x6b, 0x04, 0x66, 0xc7, 0x53, 0x7d, 0x37,
+0x4e, 0x14, 0x30, 0xee, 0xf7, 0xc9, 0x93, 0xac, 0xc6, 0x99, 0x76, 0x93, 0x12, 0x9a, 0xa1, 0xac,
+0x49, 0xc9, 0x12, 0xed, 0xb2, 0x13, 0xf7, 0x38, 0x08, 0x58, 0x5c, 0x6c, 0x90, 0x72, 0x4a, 0x69,
+0x0b, 0x52, 0x4d, 0x30, 0xf0, 0x08, 0xf5, 0xe0, 0xdd, 0xbd, 0x0c, 0xa4, 0x00, 0x96, 0x2e, 0x94,
+0x10, 0x9e, 0x79, 0xb2, 0xc7, 0xcf, 0x96, 0xf3, 0x36, 0x1a, 0x27, 0x3f, 0x5c, 0x5d, 0xb8, 0x6f,
+0x78, 0x72, 0xd8, 0x64, 0x45, 0x49, 0xa5, 0x24, 0x86, 0xfc, 0xb5, 0xd6, 0xab, 0xb7, 0xec, 0xa2,
+0x7c, 0x99, 0x00, 0x9b, 0xa2, 0xa6, 0xb3, 0xbb, 0xf9, 0xd8, 0x14, 0xfc, 0x97, 0x21, 0x81, 0x44,
+0x82, 0x5f, 0x66, 0x6d, 0x42, 0x6b, 0x76, 0x59, 0xd7, 0x3b, 0xb2, 0x17, 0xc8, 0xf2, 0x07, 0xd2,
+0xd9, 0xb8, 0xfa, 0xa8, 0xfe, 0xa2, 0x60, 0xa6, 0x99, 0xb2, 0x59, 0xc7, 0x51, 0xe3, 0x3a, 0x04,
+0x45, 0x26, 0xe3, 0x44, 0x7a, 0x5a, 0x48, 0x63, 0x5e, 0x5d, 0x6b, 0x4a, 0x61, 0x2e, 0x46, 0x0e,
+0xf6, 0xee, 0x11, 0xd4, 0x39, 0xc0, 0x2f, 0xb4, 0x93, 0xb0, 0x09, 0xb5, 0x4d, 0xc1, 0xb7, 0xd4,
+0x18, 0xee, 0xac, 0x0a, 0x09, 0x27, 0x1b, 0x3f, 0x93, 0x4e, 0xcb, 0x52, 0x6f, 0x4b, 0xf9, 0x39,
+0x35, 0x22, 0x1a, 0x08, 0x50, 0xef, 0xa1, 0xda, 0xc9, 0xcb, 0xb1, 0xc3, 0x4f, 0xc2, 0xb7, 0xc7,
+0x07, 0xd3, 0x67, 0xe3, 0x24, 0xf7, 0x66, 0x0c, 0x87, 0x20, 0xd1, 0x30, 0xf5, 0x3a, 0x0d, 0x3d,
+0x35, 0x37, 0x5f, 0x2a, 0xee, 0x18, 0xd2, 0x05, 0xda, 0xf3, 0x20, 0xe5, 0x0d, 0xdb, 0x71, 0xd6,
+0x0b, 0xd7, 0x41, 0xdc, 0xd0, 0xe4, 0x70, 0xef, 0x4a, 0xfb, 0x56, 0x07, 0xc0, 0x12, 0x97, 0x1c,
+0x7d, 0x23, 0x09, 0x26, 0xab, 0x23, 0xc7, 0x1c, 0x7a, 0x12, 0xec, 0x06, 0x10, 0xfc, 0xa4, 0xf3,
+0x7e, 0xee, 0xde, 0xec, 0xfe, 0xed, 0x8c, 0xf0, 0x64, 0xf3, 0xd6, 0xf5, 0x0e, 0xf8, 0xfc, 0xfa,
+0x54, 0xff, 0xea, 0x04, 0xfa, 0x0a, 0xf4, 0x0f, 0x4c, 0x12, 0xc8, 0x11, 0xf6, 0x0e, 0x02, 0x0b,
+0x7a, 0x07, 0x4a, 0x05, 0x9a, 0x04, 0xbc, 0x04, 0x50, 0x04, 0xf6, 0x01, 0x2e, 0xfd, 0x8a, 0xf6,
+0xc6, 0xef, 0xf6, 0xea, 0xe8, 0xe9, 0x22, 0xed, 0xa8, 0xf3, 0xb0, 0xfb, 0x60, 0x03, 0xc2, 0x09,
+0xcc, 0x0e, 0x10, 0x13, 0xe8, 0x16, 0x46, 0x1a, 0x3c, 0x1c, 0x90, 0x1b, 0xf2, 0x16, 0xaa, 0x0d,
+0x96, 0x00, 0x74, 0xf1, 0x51, 0xe3, 0xdd, 0xd8, 0x69, 0xd4, 0x9d, 0xd6, 0x8b, 0xde, 0x62, 0xea,
+0x18, 0xf8, 0x14, 0x06, 0x8a, 0x13, 0xd9, 0x1f, 0x17, 0x2a, 0xcb, 0x30, 0x93, 0x32, 0x67, 0x2e,
+0xcd, 0x23, 0x62, 0x13, 0xc4, 0xfe, 0xf0, 0xe8, 0x19, 0xd5, 0xa5, 0xc6, 0xc9, 0xbf, 0xb5, 0xc1,
+0xb1, 0xcb, 0x37, 0xdc, 0xd6, 0xf0, 0x6e, 0x07, 0xa1, 0x1d, 0xff, 0x30, 0x87, 0x3f, 0xe5, 0x46,
+0x57, 0x46, 0x45, 0x3d, 0x85, 0x2c, 0xba, 0x15, 0x24, 0xfb, 0xb1, 0xdf, 0x25, 0xc7, 0x29, 0xb5,
+0x7b, 0xac, 0xcb, 0xae, 0x2d, 0xbc, 0xe9, 0xd2, 0xde, 0xef, 0x00, 0x0f, 0x1f, 0x2c, 0xbb, 0x43,
+0xe7, 0x52, 0x1c, 0x58, 0x21, 0x53, 0xf5, 0x44, 0x0b, 0x2f, 0x7e, 0x13, 0x72, 0xf4, 0x33, 0xd5,
+0x69, 0xb9, 0x56, 0xa5, 0x74, 0x9c, 0x16, 0xa1, 0x9f, 0xb3, 0x73, 0xd1, 0x0e, 0xf6, 0x6e, 0x1b,
+0x23, 0x3c, 0x49, 0x54, 0x86, 0x61, 0x3c, 0x63, 0xea, 0x59, 0x79, 0x47, 0x9f, 0x2d, 0x82, 0x0e,
+0x26, 0xec, 0xcf, 0xc9, 0xf9, 0xab, 0x58, 0x97, 0x62, 0x90, 0x84, 0x99, 0x73, 0xb2, 0xff, 0xd6,
+0xd0, 0x00, 0xb7, 0x28, 0x31, 0x49, 0x14, 0x5f, 0x1a, 0x69, 0x42, 0x67, 0xf0, 0x5a, 0xcb, 0x45,
+0x7f, 0x29, 0xba, 0x07, 0x01, 0xe3, 0x1d, 0xbf, 0x3a, 0xa1, 0xc2, 0x8e, 0xe4, 0x8b, 0x84, 0x9a,
+0x97, 0xb8, 0xc5, 0xe0, 0x88, 0x0b, 0x57, 0x32, 0x5d, 0x50, 0x62, 0x63, 0x74, 0x6a, 0x26, 0x66,
+0x9a, 0x57, 0x43, 0x40, 0xe7, 0x21, 0x32, 0xfe, 0x85, 0xd8, 0x4d, 0xb5, 0x38, 0x9a, 0x1e, 0x8c,
+0x96, 0x8e, 0xca, 0xa1, 0x95, 0xc2, 0xe8, 0xea, 0xd4, 0x13, 0x87, 0x37, 0x37, 0x52, 0x20, 0x62,
+0xa6, 0x66, 0x38, 0x60, 0xcd, 0x4f, 0xe1, 0x36, 0x1a, 0x17, 0x44, 0xf3, 0x3d, 0xcf, 0xf7, 0xaf,
+0x76, 0x9a, 0x88, 0x92, 0xbe, 0x99, 0x35, 0xaf, 0x5f, 0xcf, 0xa8, 0xf4, 0x4a, 0x19, 0x59, 0x38,
+0xd9, 0x4e, 0x3c, 0x5b, 0x2a, 0x5d, 0xab, 0x54, 0xf9, 0x42, 0x93, 0x29, 0xe2, 0x0a, 0x4c, 0xea,
+0xa7, 0xcb, 0x3b, 0xb3, 0x26, 0xa4, 0xca, 0xa0, 0x62, 0xa9, 0x2d, 0xbd, 0x13, 0xd9, 0x20, 0xf9,
+0x9e, 0x18, 0x89, 0x33, 0xdd, 0x46, 0xa1, 0x50, 0x13, 0x50, 0xbf, 0x45, 0x23, 0x33, 0xae, 0x1a,
+0x94, 0xff, 0xfc, 0xe4, 0x1b, 0xce, 0x31, 0xbd, 0x05, 0xb4, 0x27, 0xb3, 0x43, 0xbb, 0x7d, 0xcb,
+0x5b, 0xe2, 0xa8, 0xfc, 0xc0, 0x16, 0xa5, 0x2c, 0x69, 0x3b, 0x6f, 0x41, 0x51, 0x3e, 0x3d, 0x33,
+0x35, 0x22, 0x44, 0x0e, 0x10, 0xfa, 0x0c, 0xe8, 0x63, 0xd9, 0xf3, 0xce, 0x07, 0xc9, 0x37, 0xc8,
+0x2d, 0xcd, 0x31, 0xd8, 0xa2, 0xe8, 0x4c, 0xfc, 0xda, 0x0f, 0xcf, 0x1f, 0xd1, 0x29, 0xb1, 0x2c,
+0xd1, 0x28, 0xb1, 0x1f, 0xac, 0x13, 0x18, 0x07, 0xe2, 0xfb, 0x8e, 0xf2, 0x32, 0xeb, 0x48, 0xe5,
+0xc9, 0xe0, 0x45, 0xde, 0xe5, 0xde, 0xd2, 0xe3, 0x26, 0xed, 0x4c, 0xf9, 0x7e, 0x05, 0x2a, 0x0f,
+0x9a, 0x14, 0x94, 0x15, 0xfc, 0x12, 0x5c, 0x0e, 0x6e, 0x09, 0x94, 0x05, 0x1e, 0x03, 0x68, 0x01,
+0x66, 0xff, 0x26, 0xfc, 0x7e, 0xf7, 0x5e, 0xf2, 0x4e, 0xee, 0xe8, 0xec, 0x9a, 0xee, 0x94, 0xf2,
+0x0a, 0xf7, 0xcc, 0xfa, 0x18, 0xfd, 0x6a, 0xfe, 0x8c, 0xff, 0x5c, 0x01, 0xa4, 0x04, 0x48, 0x09,
+0x7c, 0x0e, 0xc2, 0x12, 0xb4, 0x14, 0x2e, 0x13, 0xdc, 0x0d, 0x9e, 0x05, 0xf6, 0xfb, 0xba, 0xf2,
+0x2c, 0xeb, 0xc6, 0xe5, 0xb5, 0xe2, 0x11, 0xe2, 0xf2, 0xe3, 0x76, 0xe8, 0x9c, 0xef, 0x1a, 0xf9,
+0x6a, 0x04, 0x80, 0x10, 0xe2, 0x1b, 0xf1, 0x24, 0xe9, 0x29, 0x45, 0x29, 0x3d, 0x22, 0x78, 0x15,
+0x84, 0x04, 0x20, 0xf2, 0x1b, 0xe1, 0xa7, 0xd3, 0xd7, 0xcb, 0x1b, 0xca, 0x6b, 0xce, 0xd9, 0xd7,
+0x70, 0xe5, 0xfc, 0xf5, 0x28, 0x08, 0x74, 0x1a, 0x11, 0x2b, 0x1f, 0x38, 0x11, 0x3f, 0xdd, 0x3d,
+0x2f, 0x33, 0xd5, 0x1f, 0x54, 0x06, 0xdc, 0xea, 0xd7, 0xd1, 0x69, 0xbf, 0xe9, 0xb5, 0xc9, 0xb5,
+0xf5, 0xbd, 0xb9, 0xcc, 0x49, 0xe0, 0xdc, 0xf6, 0xc8, 0x0e, 0x2d, 0x26, 0x15, 0x3b, 0xbd, 0x4a,
+0x33, 0x52, 0x49, 0x4e, 0x55, 0x3e, 0x6d, 0x23, 0xe2, 0x01, 0x4d, 0xdf, 0xb9, 0xc1, 0x8d, 0xad,
+0xee, 0xa4, 0x62, 0xa7, 0x0f, 0xb3, 0x15, 0xc6, 0x23, 0xde, 0xb4, 0xf9, 0x94, 0x16, 0xb5, 0x32,
+0x0f, 0x4b, 0xf8, 0x5b, 0x74, 0x61, 0xf0, 0x58, 0x59, 0x42, 0x8f, 0x20, 0x34, 0xf9, 0xd5, 0xd2,
+0xbd, 0xb3, 0x08, 0xa0, 0x06, 0x99, 0xce, 0x9d, 0x9f, 0xac, 0x53, 0xc3, 0x03, 0xe0, 0x6e, 0x00,
+0xf9, 0x21, 0x6f, 0x41, 0xe0, 0x5a, 0xec, 0x69, 0xee, 0x6a, 0x90, 0x5c, 0x51, 0x40, 0x56, 0x1a,
+0x48, 0xf0, 0x0b, 0xc9, 0x26, 0xaa, 0x88, 0x97, 0x00, 0x92, 0xc0, 0x98, 0x52, 0xaa, 0xd9, 0xc4,
+0x10, 0xe6, 0xa4, 0x0a, 0x0d, 0x2f, 0xeb, 0x4e, 0x28, 0x66, 0x9c, 0x70, 0x18, 0x6c, 0xca, 0x58,
+0x65, 0x39, 0x42, 0x12, 0xc6, 0xe8, 0xd5, 0xc2, 0x88, 0xa5, 0x7c, 0x94, 0x98, 0x90, 0x9c, 0x99,
+0x47, 0xae, 0x85, 0xcc, 0x00, 0xf1, 0x6c, 0x17, 0xfb, 0x3a, 0x74, 0x57, 0x38, 0x69, 0xea, 0x6d,
+0xda, 0x64, 0x5b, 0x4f, 0x23, 0x30, 0xc2, 0x0a, 0xde, 0xe3, 0x5b, 0xc0, 0x38, 0xa5, 0x0a, 0x96,
+0x6c, 0x94, 0x2a, 0xa0, 0x0f, 0xb8, 0xdd, 0xd8, 0x1c, 0xfe, 0xa3, 0x22, 0xcd, 0x41, 0x52, 0x58,
+0xfe, 0x63, 0x12, 0x64, 0xfc, 0x58, 0x17, 0x44, 0x27, 0x27, 0x00, 0x05, 0x63, 0xe1, 0xd5, 0xc0,
+0x86, 0xa8, 0x2e, 0x9c, 0x9e, 0x9d, 0x6d, 0xac, 0x5d, 0xc6, 0xfc, 0xe6, 0x60, 0x09, 0x7f, 0x28,
+0xdd, 0x40, 0xdd, 0x50, 0xb4, 0x57, 0x72, 0x55, 0x9b, 0x4a, 0x0b, 0x38, 0xa9, 0x1e, 0xa2, 0x00,
+0xff, 0xe0, 0x6d, 0xc4, 0x03, 0xb0, 0x92, 0xa7, 0x39, 0xac, 0x05, 0xbd, 0x5d, 0xd6, 0x80, 0xf3,
+0xc4, 0x0f, 0x8f, 0x27, 0xd1, 0x38, 0x29, 0x43, 0xb9, 0x46, 0xbf, 0x43, 0xb7, 0x3a, 0x4f, 0x2b,
+0x5e, 0x16, 0x66, 0xfd, 0x83, 0xe3, 0xcd, 0xcc, 0x01, 0xbe, 0xbd, 0xb9, 0x99, 0xc0, 0x6d, 0xd0,
+0x54, 0xe5, 0x6e, 0xfb, 0x50, 0x0f, 0x11, 0x1f, 0xe1, 0x29, 0x1d, 0x30, 0xff, 0x31, 0xd5, 0x2f,
+0x91, 0x29, 0xd1, 0x1e, 0xb6, 0x0f, 0xbe, 0xfd, 0x18, 0xeb, 0x73, 0xdb, 0xef, 0xd1, 0x39, 0xd0,
+0x1b, 0xd6, 0x8b, 0xe1, 0x86, 0xef, 0x54, 0xfd, 0x40, 0x09, 0x04, 0x12, 0xde, 0x17, 0x3c, 0x1b,
+0x85, 0x1c, 0x0c, 0x1c, 0x88, 0x19, 0x80, 0x14, 0xf6, 0x0c, 0x78, 0x03, 0x40, 0xf9, 0x46, 0xf0,
+0x52, 0xea, 0x44, 0xe8, 0x02, 0xea, 0x78, 0xee, 0x2c, 0xf4, 0xb2, 0xf9, 0x20, 0xfe, 0x18, 0x01,
+0x12, 0x03, 0x94, 0x04, 0x40, 0x06, 0x8e, 0x08, 0x6e, 0x0b, 0x06, 0x0e, 0x92, 0x0f, 0x22, 0x0f,
+0x5c, 0x0c, 0xfa, 0x07, 0xf0, 0x02, 0x46, 0xfe, 0xac, 0xfa, 0x22, 0xf8, 0x30, 0xf6, 0x42, 0xf4,
+0xd8, 0xf1, 0x3c, 0xef, 0x76, 0xed, 0x78, 0xed, 0x58, 0xf0, 0xfc, 0xf6, 0x12, 0x01, 0x08, 0x0d,
+0x4a, 0x18, 0x33, 0x20, 0x11, 0x23, 0xb7, 0x20, 0x22, 0x1a, 0xf0, 0x10, 0xe2, 0x06, 0xdc, 0xfc,
+0x30, 0xf3, 0xe0, 0xe9, 0x07, 0xe1, 0xd5, 0xd9, 0xcf, 0xd5, 0x81, 0xd6, 0x5b, 0xdd, 0xda, 0xea,
+0xa6, 0xfd, 0xbe, 0x12, 0xf5, 0x25, 0xa9, 0x33, 0x85, 0x39, 0xfb, 0x36, 0x95, 0x2d, 0xad, 0x1f,
+0xba, 0x0f, 0xe8, 0xfe, 0x12, 0xee, 0xeb, 0xdd, 0x99, 0xcf, 0x03, 0xc5, 0x85, 0xc0, 0x05, 0xc4,
+0xbd, 0xd0, 0x1a, 0xe6, 0x22, 0x01, 0x7b, 0x1d, 0xf3, 0x35, 0x81, 0x46, 0xeb, 0x4c, 0x45, 0x49,
+0xfb, 0x3c, 0xdd, 0x2a, 0xfc, 0x14, 0x3c, 0xfd, 0xf8, 0xe4, 0x31, 0xce, 0x57, 0xbb, 0x6d, 0xaf,
+0x11, 0xad, 0xe5, 0xb5, 0x11, 0xca, 0x2a, 0xe7, 0xe0, 0x08, 0xbf, 0x29, 0x1f, 0x45, 0xe4, 0x56,
+0x52, 0x5d, 0xd6, 0x57, 0x45, 0x48, 0x37, 0x31, 0x46, 0x15, 0x90, 0xf6, 0x0b, 0xd8, 0xdb, 0xbc,
+0xb8, 0xa8, 0xe6, 0x9e, 0x34, 0xa1, 0x4b, 0xb0, 0x8d, 0xca, 0x5e, 0xec, 0xfa, 0x10, 0xcd, 0x33,
+0x3b, 0x50, 0xdc, 0x62, 0x02, 0x69, 0x08, 0x62, 0x2b, 0x4f, 0x27, 0x33, 0xf8, 0x10, 0x58, 0xec,
+0x77, 0xc9, 0xe3, 0xac, 0xa0, 0x9a, 0x1a, 0x95, 0xd2, 0x9c, 0xe5, 0xb0, 0xe5, 0xce, 0xec, 0xf2,
+0xca, 0x18, 0x33, 0x3c, 0x10, 0x59, 0x8e, 0x6b, 0x74, 0x70, 0x86, 0x66, 0x53, 0x4f, 0xf7, 0x2d,
+0xae, 0x06, 0xa3, 0xde, 0x51, 0xbb, 0x82, 0xa1, 0x3a, 0x94, 0x00, 0x94, 0x06, 0xa0, 0xc9, 0xb6,
+0xd7, 0xd5, 0xe4, 0xf9, 0x71, 0x1f, 0x91, 0x42, 0xf0, 0x5e, 0x30, 0x70, 0x9e, 0x72, 0xf6, 0x64,
+0x25, 0x49, 0x81, 0x23, 0xae, 0xf9, 0xed, 0xd1, 0xb7, 0xb1, 0xe8, 0x9c, 0xea, 0x94, 0x04, 0x99,
+0xb2, 0xa7, 0x71, 0xbf, 0x2b, 0xde, 0x20, 0x01, 0x47, 0x25, 0xbf, 0x46, 0xfa, 0x60, 0x32, 0x6f,
+0xd8, 0x6d, 0x36, 0x5c, 0x4f, 0x3d, 0x76, 0x16, 0x36, 0xee, 0xbd, 0xca, 0x5d, 0xb0, 0x3c, 0xa1,
+0x60, 0x9d, 0xb2, 0xa3, 0xe1, 0xb2, 0xc1, 0xc9, 0x9c, 0xe6, 0x6a, 0x07, 0x0b, 0x29, 0x73, 0x47,
+0xdc, 0x5d, 0xba, 0x67, 0x34, 0x62, 0xf3, 0x4d, 0x05, 0x2f, 0x0e, 0x0b, 0x2a, 0xe8, 0x05, 0xcb,
+0x8f, 0xb6, 0xbb, 0xab, 0x60, 0xaa, 0x83, 0xb1, 0x6d, 0xc0, 0xe1, 0xd5, 0x3a, 0xf0, 0x66, 0x0d,
+0x71, 0x2a, 0x69, 0x43, 0x01, 0x54, 0xf4, 0x58, 0xad, 0x50, 0x07, 0x3d, 0xa7, 0x21, 0x9a, 0x03,
+0x74, 0xe7, 0xe3, 0xd0, 0xa7, 0xc1, 0x81, 0xba, 0x21, 0xbb, 0xc5, 0xc2, 0x7b, 0xd0, 0x13, 0xe3,
+0x2c, 0xf9, 0x96, 0x10, 0xe1, 0x26, 0xc5, 0x38, 0x9f, 0x43, 0x1f, 0x45, 0x2b, 0x3d, 0x23, 0x2d,
+0xec, 0x17, 0x06, 0x01, 0x18, 0xec, 0xad, 0xdb, 0x3d, 0xd1, 0x45, 0xcd, 0x3d, 0xcf, 0x63, 0xd6,
+0x75, 0xe1, 0x56, 0xef, 0x72, 0xfe, 0xa2, 0x0d, 0x2a, 0x1b, 0xcb, 0x25, 0x3b, 0x2c, 0x77, 0x2d,
+0xf9, 0x28, 0x5d, 0x1f, 0x08, 0x12, 0x50, 0x03, 0xc8, 0xf5, 0x50, 0xeb, 0x28, 0xe5, 0x63, 0xe3,
+0x78, 0xe5, 0x22, 0xea, 0x74, 0xf0, 0x20, 0xf7, 0x74, 0xfd, 0x4e, 0x03, 0xf2, 0x08, 0x80, 0x0e,
+0x9e, 0x13, 0x24, 0x17, 0xfa, 0x17, 0x80, 0x15, 0xf4, 0x0f, 0xe6, 0x08, 0x04, 0x02, 0xf6, 0xfc,
+0x7c, 0xfa, 0x4c, 0xfa, 0x2e, 0xfb, 0xd4, 0xfb, 0x2c, 0xfb, 0xd0, 0xf8, 0x90, 0xf5, 0xec, 0xf2,
+0xac, 0xf2, 0xe8, 0xf5, 0x30, 0xfc, 0xae, 0x03, 0x66, 0x0a, 0xf4, 0x0e, 0x12, 0x11, 0x9c, 0x11,
+0x8c, 0x11, 0x98, 0x11, 0xc0, 0x11, 0x2c, 0x11, 0x6e, 0x0e, 0x88, 0x08, 0x4c, 0xff, 0xea, 0xf3,
+0x8a, 0xe8, 0xdb, 0xdf, 0x3d, 0xdc, 0xcb, 0xde, 0xea, 0xe6, 0x82, 0xf2, 0x32, 0xff, 0x10, 0x0b,
+0x60, 0x15, 0xc1, 0x1d, 0x27, 0x24, 0x41, 0x28, 0x37, 0x29, 0xcf, 0x25, 0x25, 0x1d, 0x5a, 0x0f,
+0x96, 0xfd, 0x4a, 0xea, 0x99, 0xd8, 0xbf, 0xcb, 0x45, 0xc6, 0x53, 0xc9, 0x09, 0xd4, 0x78, 0xe4,
+0x0e, 0xf8, 0x16, 0x0c, 0xb5, 0x1e, 0x69, 0x2e, 0xd9, 0x39, 0x77, 0x3f, 0x4b, 0x3e, 0x95, 0x35,
+0xe3, 0x25, 0x88, 0x10, 0xca, 0xf7, 0xad, 0xde, 0xdd, 0xc8, 0x83, 0xb9, 0x0f, 0xb3, 0xe7, 0xb6,
+0x85, 0xc4, 0x5f, 0xda, 0x4c, 0xf5, 0xbc, 0x11, 0xf9, 0x2b, 0x3b, 0x41, 0xd7, 0x4e, 0x39, 0x53,
+0x9f, 0x4d, 0xd1, 0x3e, 0xbf, 0x28, 0xce, 0x0d, 0x5c, 0xf0, 0x93, 0xd3, 0xe9, 0xba, 0xca, 0xa9,
+0x42, 0xa3, 0xcc, 0xa8, 0xc1, 0xba, 0x11, 0xd7, 0xa4, 0xf9, 0x17, 0x1d, 0x7b, 0x3c, 0xa7, 0x53,
+0x16, 0x60, 0xa2, 0x60, 0xdc, 0x55, 0xd9, 0x41, 0x39, 0x27, 0x64, 0x08, 0xc4, 0xe7, 0x6b, 0xc8,
+0xe3, 0xad, 0x26, 0x9c, 0xa0, 0x96, 0x84, 0x9f, 0xe5, 0xb6, 0xff, 0xd9, 0xf8, 0x02, 0xf9, 0x2a,
+0x1b, 0x4c, 0x36, 0x62, 0x5e, 0x6b, 0x8c, 0x67, 0x68, 0x58, 0xbd, 0x40, 0x2f, 0x23, 0xe8, 0x01,
+0x23, 0xdf, 0x27, 0xbe, 0x1a, 0xa3, 0x82, 0x92, 0x12, 0x90, 0xde, 0x9d, 0xf1, 0xba, 0xff, 0xe2,
+0xf4, 0x0e, 0x43, 0x37, 0x6a, 0x56, 0x02, 0x69, 0x2a, 0x6e, 0xc8, 0x66, 0xf8, 0x54, 0x59, 0x3b,
+0x43, 0x1c, 0xb0, 0xf9, 0x2f, 0xd6, 0x83, 0xb5, 0x2e, 0x9c, 0xc6, 0x8e, 0xc2, 0x90, 0x74, 0xa3,
+0x77, 0xc4, 0x54, 0xee, 0x7a, 0x19, 0xf3, 0x3e, 0x34, 0x5a, 0x06, 0x69, 0x22, 0x6b, 0x9e, 0x61,
+0x69, 0x4e, 0xbb, 0x33, 0xac, 0x13, 0xa0, 0xf0, 0xef, 0xcd, 0x9f, 0xaf, 0x40, 0x9a, 0xcc, 0x91,
+0xaa, 0x98, 0x93, 0xae, 0x79, 0xd0, 0x68, 0xf8, 0xd7, 0x1f, 0xe9, 0x40, 0x08, 0x58, 0x6e, 0x63,
+0x12, 0x63, 0xec, 0x57, 0x95, 0x43, 0x41, 0x28, 0x54, 0x08, 0xe8, 0xe6, 0x9f, 0xc7, 0xe7, 0xae,
+0xfa, 0x9f, 0x4c, 0x9d, 0x82, 0xa7, 0x93, 0xbd, 0x5f, 0xdc, 0x28, 0xff, 0xa7, 0x20, 0x7b, 0x3c,
+0x9f, 0x4f, 0x54, 0x58, 0x72, 0x56, 0x8f, 0x4a, 0x65, 0x36, 0x28, 0x1c, 0x02, 0xff, 0x1b, 0xe2,
+0x21, 0xc9, 0xf3, 0xb6, 0xbb, 0xad, 0x65, 0xae, 0xcd, 0xb8, 0xed, 0xcb, 0x8c, 0xe5, 0x5a, 0x02,
+0x41, 0x1e, 0x65, 0x35, 0x9f, 0x44, 0x63, 0x4a, 0x3b, 0x46, 0x65, 0x39, 0xdb, 0x25, 0xbe, 0x0e,
+0x0e, 0xf7, 0xbd, 0xe1, 0xdd, 0xd0, 0xbf, 0xc5, 0x0d, 0xc1, 0xb1, 0xc2, 0xbb, 0xca, 0x93, 0xd8,
+0x9a, 0xeb, 0x74, 0x01, 0x10, 0x17, 0xcb, 0x28, 0x01, 0x34, 0x1b, 0x37, 0x3f, 0x32, 0xd1, 0x26,
+0x46, 0x17, 0x9e, 0x06, 0x2a, 0xf7, 0x96, 0xea, 0x4b, 0xe1, 0x55, 0xdb, 0x35, 0xd8, 0x17, 0xd8,
+0x5f, 0xdb, 0xbb, 0xe2, 0x44, 0xee, 0xb8, 0xfc, 0x86, 0x0b, 0xaa, 0x17, 0xeb, 0x1e, 0x47, 0x20,
+0x65, 0x1c, 0xd6, 0x14, 0xd0, 0x0b, 0x7e, 0x03, 0x1e, 0xfd, 0xb4, 0xf8, 0x6e, 0xf5, 0x60, 0xf2,
+0x2e, 0xef, 0x14, 0xec, 0x36, 0xea, 0xfc, 0xea, 0x18, 0xef, 0xf0, 0xf5, 0xa4, 0xfd, 0x24, 0x04,
+0x0c, 0x08, 0x38, 0x09, 0x58, 0x08, 0xca, 0x06, 0xfa, 0x05, 0x92, 0x06, 0x6a, 0x08, 0x54, 0x0a,
+0x16, 0x0b, 0x7a, 0x09, 0x28, 0x05, 0x98, 0xfe, 0x10, 0xf7, 0x4e, 0xf0, 0xb0, 0xeb, 0xda, 0xe9,
+0x3e, 0xea, 0x18, 0xec, 0xc6, 0xee, 0x62, 0xf2, 0x40, 0xf7, 0xd2, 0xfd, 0xf6, 0x05, 0xfc, 0x0e,
+0x96, 0x17, 0x55, 0x1e, 0x95, 0x21, 0x61, 0x20, 0x08, 0x1a, 0xe6, 0x0e, 0x70, 0x00, 0xd4, 0xf0,
+0xd1, 0xe2, 0x4b, 0xd8, 0xb5, 0xd2, 0x4b, 0xd2, 0xdf, 0xd6, 0x9f, 0xdf, 0xf0, 0xeb, 0xb6, 0xfa,
+0x9a, 0x0a, 0x60, 0x1a, 0xff, 0x27, 0x19, 0x32, 0xe1, 0x36, 0xf7, 0x34, 0x35, 0x2b, 0x1e, 0x1a,
+0x72, 0x03, 0xde, 0xea, 0x65, 0xd4, 0xd3, 0xc3, 0xa5, 0xbb, 0x61, 0xbc, 0x0b, 0xc5, 0xe1, 0xd3,
+0xea, 0xe6, 0x22, 0xfc, 0xe4, 0x11, 0x25, 0x26, 0x8d, 0x37, 0xf7, 0x43, 0x63, 0x49, 0x65, 0x45,
+0x3d, 0x37, 0x45, 0x1f, 0xae, 0x00, 0x55, 0xe0, 0xdb, 0xc3, 0x35, 0xb0, 0xfe, 0xa7, 0x5f, 0xab,
+0x65, 0xb8, 0xa5, 0xcc, 0x36, 0xe5, 0xf2, 0xff, 0x8c, 0x1a, 0x1f, 0x33, 0x6f, 0x47, 0x02, 0x55,
+0x1a, 0x59, 0x5f, 0x51, 0x17, 0x3d, 0xff, 0x1d, 0x78, 0xf8, 0xad, 0xd2, 0x69, 0xb3, 0xa0, 0x9f,
+0x88, 0x99, 0x5e, 0xa0, 0x8f, 0xb1, 0x0d, 0xca, 0x3e, 0xe7, 0x5e, 0x06, 0xfd, 0x24, 0xb9, 0x40,
+0xc4, 0x56, 0xb4, 0x63, 0x5a, 0x64, 0xf0, 0x56, 0xfd, 0x3b, 0xe2, 0x16, 0x02, 0xed, 0x6d, 0xc5,
+0x84, 0xa6, 0xb0, 0x94, 0x12, 0x91, 0x8c, 0x9a, 0xc3, 0xae, 0xdf, 0xca, 0xe4, 0xeb, 0xda, 0x0e,
+0xbb, 0x30, 0x13, 0x4e, 0x38, 0x63, 0x80, 0x6c, 0x82, 0x67, 0x15, 0x54, 0x61, 0x34, 0xca, 0x0c,
+0xd5, 0xe2, 0xa7, 0xbc, 0xe2, 0x9f, 0x38, 0x90, 0xb4, 0x8e, 0x72, 0x9a, 0x55, 0xb1, 0x97, 0xd0,
+0xea, 0xf4, 0x3c, 0x1a, 0x83, 0x3c, 0xfe, 0x57, 0x14, 0x69, 0xde, 0x6c, 0x96, 0x62, 0x77, 0x4b,
+0x9b, 0x2a, 0xce, 0x03, 0xff, 0xdb, 0x7f, 0xb8, 0x7c, 0x9e, 0x38, 0x91, 0xe8, 0x91, 0xde, 0x9f,
+0x3d, 0xb9, 0xff, 0xda, 0xa0, 0x00, 0xbb, 0x25, 0x8d, 0x45, 0x56, 0x5c, 0x56, 0x67, 0x9a, 0x65,
+0x88, 0x57, 0x91, 0x3f, 0x4f, 0x20, 0xfc, 0xfc, 0x57, 0xd9, 0xbd, 0xb9, 0xac, 0xa2, 0xc2, 0x97,
+0x4c, 0x9a, 0x0a, 0xaa, 0xf9, 0xc4, 0x20, 0xe7, 0xa2, 0x0b, 0x1d, 0x2d, 0x45, 0x47, 0x92, 0x57,
+0x06, 0x5d, 0xba, 0x57, 0x75, 0x49, 0xed, 0x33, 0xb0, 0x18, 0xe6, 0xf9, 0x3d, 0xda, 0x31, 0xbe,
+0x50, 0xaa, 0x3c, 0xa2, 0x74, 0xa7, 0x4f, 0xb9, 0x7d, 0xd4, 0x62, 0xf4, 0xcc, 0x13, 0x29, 0x2e,
+0xe7, 0x40, 0xc5, 0x4a, 0x49, 0x4c, 0x8b, 0x46, 0x89, 0x3a, 0xed, 0x28, 0xae, 0x12, 0x00, 0xf9,
+0x97, 0xde, 0x31, 0xc7, 0x45, 0xb7, 0x1b, 0xb2, 0x03, 0xb9, 0x39, 0xca, 0x59, 0xe2, 0xa6, 0xfc,
+0xee, 0x14, 0xef, 0x27, 0x39, 0x34, 0x03, 0x3a, 0x07, 0x3a, 0x31, 0x35, 0x01, 0x2c, 0xcd, 0x1e,
+0xb6, 0x0d, 0xe6, 0xf9, 0x7e, 0xe5, 0xe1, 0xd3, 0xb7, 0xc8, 0x69, 0xc6, 0x6f, 0xcd, 0xdf, 0xdb,
+0x2e, 0xee, 0xb2, 0x00, 0x86, 0x10, 0x18, 0x1c, 0xf1, 0x22, 0xb1, 0x25, 0x17, 0x25, 0x05, 0x22,
+0x8b, 0x1c, 0x88, 0x14, 0x32, 0x0a, 0x1a, 0xfe, 0x9a, 0xf1, 0xcc, 0xe6, 0xfd, 0xdf, 0x9f, 0xde,
+0xdd, 0xe2, 0x0c, 0xeb, 0xe4, 0xf4, 0x5c, 0xfe, 0xe8, 0x05, 0xe6, 0x0a, 0x9a, 0x0d, 0x8e, 0x0e,
+0xa6, 0x0e, 0x68, 0x0e, 0x02, 0x0e, 0x3c, 0x0d, 0x84, 0x0b, 0x5e, 0x08, 0xea, 0x03, 0xac, 0xfe,
+0xa2, 0xf9, 0x06, 0xf6, 0x2e, 0xf4, 0x28, 0xf4, 0x28, 0xf5, 0x34, 0xf6, 0xda, 0xf6, 0x10, 0xf7,
+0x04, 0xf7, 0x8a, 0xf7, 0x86, 0xf9, 0xa2, 0xfd, 0x0c, 0x04, 0xbc, 0x0b, 0x44, 0x13, 0xca, 0x18,
+0x80, 0x1a, 0xee, 0x17, 0xde, 0x11, 0xb6, 0x09, 0x28, 0x01, 0x36, 0xf9, 0xfc, 0xf1, 0xac, 0xeb,
+0x4c, 0xe6, 0x07, 0xe2, 0xf1, 0xdf, 0x05, 0xe1, 0x76, 0xe6, 0xe0, 0xf0, 0xca, 0xff, 0x22, 0x11,
+0xb5, 0x21, 0xab, 0x2d, 0xa5, 0x32, 0xcb, 0x2f, 0x3f, 0x26, 0x70, 0x18, 0x06, 0x09, 0xba, 0xf9,
+0xb0, 0xeb, 0x0b, 0xdf, 0x29, 0xd4, 0x6b, 0xcc, 0x51, 0xc9, 0xb3, 0xcc, 0x8f, 0xd7, 0x0a, 0xea,
+0xd4, 0x01, 0x92, 0x1b, 0x2b, 0x32, 0xf3, 0x41, 0xc9, 0x47, 0x57, 0x43, 0x1f, 0x36, 0x59, 0x23,
+0xba, 0x0d, 0xb0, 0xf7, 0xaf, 0xe2, 0x15, 0xd0, 0x5d, 0xc1, 0xe9, 0xb7, 0x19, 0xb6, 0xa3, 0xbd,
+0x4d, 0xcf, 0x6a, 0xe9, 0xdc, 0x08, 0x21, 0x28, 0xad, 0x42, 0xc9, 0x53, 0x32, 0x59, 0xb7, 0x52,
+0x13, 0x42, 0x43, 0x2a, 0x9c, 0x0e, 0xe0, 0xf1, 0x45, 0xd6, 0xbf, 0xbe, 0x7f, 0xad, 0x58, 0xa5,
+0xf8, 0xa7, 0x2d, 0xb6, 0x2b, 0xcf, 0x04, 0xf0, 0xde, 0x13, 0xad, 0x35, 0xfd, 0x50, 0xe2, 0x61,
+0x32, 0x66, 0x3c, 0x5d, 0xe9, 0x48, 0x71, 0x2c, 0x40, 0x0b, 0xb2, 0xe8, 0x93, 0xc8, 0x91, 0xae,
+0x14, 0x9e, 0x60, 0x99, 0x78, 0xa1, 0xf3, 0xb5, 0x5f, 0xd4, 0x9e, 0xf8, 0x0f, 0x1e, 0x2f, 0x40,
+0xf6, 0x5a, 0xfc, 0x6a, 0x84, 0x6d, 0x14, 0x62, 0x45, 0x4a, 0x1f, 0x29, 0xe4, 0x02, 0x0d, 0xdc,
+0xab, 0xb9, 0x7a, 0xa0, 0xbc, 0x93, 0x84, 0x94, 0x6c, 0xa2, 0x55, 0xbb, 0x33, 0xdc, 0x28, 0x01,
+0xe7, 0x25, 0xf7, 0x46, 0xaa, 0x60, 0x5c, 0x6f, 0xf4, 0x6f, 0xa8, 0x61, 0xed, 0x45, 0xe5, 0x20,
+0x46, 0xf7, 0x11, 0xcf, 0x43, 0xae, 0x6c, 0x99, 0x30, 0x92, 0x60, 0x98, 0x02, 0xaa, 0x9b, 0xc4,
+0x34, 0xe5, 0x5c, 0x08, 0x25, 0x2b, 0x5f, 0x4a, 0x48, 0x62, 0xca, 0x6e, 0xdc, 0x6c, 0x54, 0x5b,
+0x8b, 0x3c, 0x26, 0x15, 0x46, 0xeb, 0x99, 0xc5, 0x7e, 0xa9, 0x2c, 0x9a, 0xf4, 0x97, 0x64, 0xa1,
+0x15, 0xb4, 0x03, 0xce, 0xbc, 0xec, 0xc8, 0x0d, 0x43, 0x2e, 0xf5, 0x4a, 0x08, 0x60, 0x44, 0x69,
+0xce, 0x63, 0x7d, 0x4f, 0x7f, 0x2f, 0x18, 0x09, 0xcb, 0xe2, 0x71, 0xc2, 0x8f, 0xac, 0x8e, 0xa2,
+0xca, 0xa3, 0x6b, 0xae, 0xc5, 0xc0, 0xb5, 0xd8, 0x88, 0xf4, 0xfa, 0x11, 0x91, 0x2e, 0x3d, 0x47,
+0x04, 0x58, 0x4e, 0x5d, 0x1a, 0x55, 0x85, 0x40, 0x89, 0x22, 0xcc, 0x00, 0xb5, 0xe0, 0x55, 0xc7,
+0x1b, 0xb7, 0xdf, 0xb0, 0x9d, 0xb3, 0x13, 0xbe, 0xb9, 0xce, 0xd6, 0xe3, 0xd6, 0xfb, 0x9c, 0x14,
+0xc9, 0x2b, 0x69, 0x3e, 0xbd, 0x49, 0x2d, 0x4b, 0x05, 0x42, 0x9f, 0x2f, 0x1e, 0x17, 0x8e, 0xfc,
+0x74, 0xe4, 0xff, 0xd1, 0x05, 0xc7, 0xb3, 0xc3, 0x5d, 0xc7, 0xa3, 0xd0, 0x7d, 0xde, 0x18, 0xef,
+0xf8, 0x00, 0x98, 0x12, 0x41, 0x22, 0x3f, 0x2e, 0xe5, 0x34, 0x01, 0x35, 0x45, 0x2e, 0xb1, 0x21,
+0xec, 0x10, 0xc4, 0xfe, 0x36, 0xee, 0xa5, 0xe1, 0x4b, 0xda, 0x91, 0xd8, 0xfb, 0xdb, 0x43, 0xe3,
+0xe8, 0xec, 0x84, 0xf7, 0xb2, 0x01, 0xd8, 0x0a, 0x9a, 0x12, 0xc2, 0x18, 0xeb, 0x1c, 0x8f, 0x1e,
+0xd7, 0x1c, 0x9a, 0x17, 0x72, 0x0f, 0x6c, 0x05, 0xcc, 0xfb, 0x56, 0xf4, 0x1c, 0xf0, 0x4c, 0xef,
+0x38, 0xf1, 0x7a, 0xf4, 0x96, 0xf7, 0xd2, 0xf9, 0xb4, 0xfa, 0x50, 0xfb, 0xb8, 0xfc, 0xfa, 0xff,
+0x04, 0x05, 0xda, 0x0a, 0xd2, 0x0f, 0x5a, 0x12, 0xf8, 0x11, 0x26, 0x0f, 0xa6, 0x0b, 0x98, 0x08,
+0xc2, 0x06, 0xe0, 0x05, 0xd8, 0x04, 0x52, 0x02, 0x74, 0xfd, 0x7c, 0xf6, 0xc6, 0xee, 0x4e, 0xe8,
+0x60, 0xe5, 0x96, 0xe7, 0xb0, 0xee, 0x3e, 0xf9, 0xda, 0x04, 0x1a, 0x0f, 0xb2, 0x16, 0xa8, 0x1b,
+0x39, 0x1e, 0x59, 0x1f, 0xc9, 0x1e, 0xc6, 0x1b, 0x64, 0x15, 0xf6, 0x0a, 0xee, 0xfc, 0x36, 0xed,
+0x55, 0xde, 0x27, 0xd3, 0x89, 0xce, 0x93, 0xd1, 0xe9, 0xdb, 0x8c, 0xeb, 0xd8, 0xfd, 0x80, 0x0f,
+0xe9, 0x1e, 0xcf, 0x2a, 0xf3, 0x32, 0x69, 0x36, 0xad, 0x34, 0xfd, 0x2c, 0x39, 0x1f, 0x54, 0x0c,
+0x1c, 0xf6, 0xdd, 0xdf, 0x53, 0xcc, 0x2d, 0xbf, 0x35, 0xba, 0x11, 0xbf, 0x03, 0xcd, 0x37, 0xe2,
+0x6a, 0xfb, 0x3c, 0x15, 0x4d, 0x2c, 0x53, 0x3e, 0x73, 0x49, 0x09, 0x4c, 0xff, 0x45, 0x85, 0x37,
+0x1d, 0x22, 0x2c, 0x08, 0x70, 0xec, 0x0b, 0xd2, 0x89, 0xbc, 0x6d, 0xae, 0x46, 0xaa, 0x17, 0xb1,
+0xb1, 0xc2, 0x55, 0xdd, 0x98, 0xfd, 0x69, 0x1e, 0x93, 0x3b, 0x25, 0x51, 0x3c, 0x5c, 0xd0, 0x5b,
+0x27, 0x50, 0x71, 0x3b, 0x35, 0x20, 0xc0, 0x01, 0xb9, 0xe2, 0x6b, 0xc6, 0x97, 0xaf, 0x4c, 0xa1,
+0x08, 0x9e, 0x46, 0xa7, 0x89, 0xbd, 0x45, 0xde, 0x1e, 0x05, 0xaf, 0x2b, 0x2f, 0x4c, 0xda, 0x61,
+0x62, 0x6a, 0x38, 0x65, 0x4b, 0x54, 0xe5, 0x3a, 0xea, 0x1b, 0x7a, 0xfa, 0x83, 0xd9, 0xb5, 0xbb,
+0x78, 0xa4, 0x0a, 0x97, 0x06, 0x96, 0x64, 0xa3, 0xfb, 0xbe, 0x92, 0xe5, 0x02, 0x11, 0x27, 0x3a,
+0x04, 0x5a, 0xdc, 0x6c, 0xba, 0x70, 0xce, 0x66, 0xf5, 0x51, 0xa9, 0x35, 0x00, 0x15, 0xb2, 0xf2,
+0x4d, 0xd1, 0x97, 0xb3, 0x48, 0x9d, 0xb8, 0x91, 0x46, 0x94, 0x48, 0xa6, 0xa7, 0xc6, 0xc4, 0xf0,
+0x47, 0x1d, 0x93, 0x44, 0x04, 0x61, 0x3c, 0x6f, 0xe0, 0x6e, 0x02, 0x62, 0x77, 0x4b, 0x81, 0x2e,
+0xb0, 0x0d, 0x20, 0xeb, 0xbf, 0xc9, 0x4d, 0xad, 0x6e, 0x99, 0x2a, 0x92, 0xaa, 0x99, 0x11, 0xb0,
+0x07, 0xd3, 0xda, 0xfc, 0x43, 0x26, 0x17, 0x49, 0xc4, 0x60, 0xde, 0x6a, 0xf6, 0x67, 0xa0, 0x59,
+0xab, 0x42, 0xbd, 0x25, 0x3c, 0x05, 0xb3, 0xe3, 0xd9, 0xc4, 0x29, 0xac, 0x82, 0x9d, 0x60, 0x9b,
+0xaa, 0xa6, 0x9b, 0xbe, 0x0f, 0xe0, 0xa2, 0x05, 0x85, 0x29, 0xc1, 0x46, 0x88, 0x59, 0x9a, 0x60,
+0xd6, 0x5b, 0x0d, 0x4d, 0x65, 0x36, 0x70, 0x1a, 0xea, 0xfb, 0x3d, 0xde, 0x9d, 0xc4, 0x3d, 0xb2,
+0x90, 0xa9, 0x53, 0xab, 0xc1, 0xb7, 0x47, 0xcd, 0x3e, 0xe9, 0xf0, 0x07, 0x3f, 0x25, 0x2f, 0x3d,
+0xb1, 0x4c, 0xdd, 0x51, 0x57, 0x4c, 0xe1, 0x3d, 0x4f, 0x28, 0xaa, 0x0e, 0x52, 0xf4, 0x8b, 0xdc,
+0x21, 0xca, 0xed, 0xbe, 0x75, 0xbb, 0x5b, 0xbf, 0x2d, 0xca, 0xbd, 0xda, 0xc4, 0xef, 0x02, 0x07,
+0x97, 0x1d, 0x4d, 0x30, 0x2d, 0x3c, 0x3d, 0x3f, 0x7b, 0x39, 0x39, 0x2c, 0x0c, 0x1a, 0xc0, 0x05,
+0xb2, 0xf2, 0x09, 0xe3, 0x3b, 0xd8, 0x75, 0xd2, 0x37, 0xd1, 0xc3, 0xd3, 0xe1, 0xd9, 0xee, 0xe3,
+0x5a, 0xf1, 0x6c, 0x01, 0xc6, 0x11, 0x9d, 0x1f, 0x37, 0x28, 0x11, 0x2a, 0x19, 0x25, 0xfc, 0x1a,
+0x6c, 0x0e, 0xd4, 0x01, 0x8e, 0xf7, 0x60, 0xf0, 0x08, 0xec, 0xb4, 0xe9, 0x78, 0xe8, 0xe2, 0xe7,
+0x76, 0xe8, 0x64, 0xeb, 0x3a, 0xf1, 0xd6, 0xf9, 0xb6, 0x03, 0x80, 0x0c, 0x24, 0x12, 0x8e, 0x13,
+0x0c, 0x11, 0x52, 0x0c, 0x52, 0x07, 0x7a, 0x03, 0x8c, 0x01, 0x26, 0x01, 0xf2, 0x00, 0xd8, 0xff,
+0x26, 0xfd, 0xc0, 0xf8, 0xb4, 0xf3, 0xa0, 0xef, 0xba, 0xed, 0x84, 0xee, 0x74, 0xf1, 0x7c, 0xf5,
+0x4c, 0xf9, 0x74, 0xfc, 0x4c, 0xff, 0x8e, 0x02, 0xca, 0x06, 0x14, 0x0c, 0xd2, 0x11, 0x5a, 0x16,
+0xa8, 0x18, 0x4c, 0x17, 0xe6, 0x11, 0x98, 0x08, 0xac, 0xfc, 0x18, 0xf0, 0x38, 0xe5, 0x8f, 0xdd,
+0x39, 0xda, 0x71, 0xdb, 0x43, 0xe0, 0x36, 0xe8, 0xe6, 0xf2, 0x14, 0xff, 0x2c, 0x0c, 0x10, 0x19,
+0xef, 0x23, 0x7d, 0x2b, 0x77, 0x2e, 0xc1, 0x2b, 0xb5, 0x22, 0xf0, 0x13, 0x60, 0x00, 0x46, 0xeb,
+0xaf, 0xd7, 0x25, 0xc9, 0x31, 0xc2, 0x69, 0xc3, 0x39, 0xcc, 0xe1, 0xda, 0x66, 0xed, 0x42, 0x01,
+0x06, 0x15, 0xc5, 0x26, 0x11, 0x35, 0x71, 0x3e, 0x69, 0x41, 0xbb, 0x3c, 0x35, 0x2f, 0xac, 0x19,
+0x10, 0xfe, 0x83, 0xe0, 0x2d, 0xc6, 0xe7, 0xb3, 0x85, 0xac, 0xcf, 0xb0, 0xf5, 0xbe, 0xe1, 0xd3,
+0x9e, 0xec, 0x4a, 0x06, 0x97, 0x1e, 0x39, 0x34, 0x0f, 0x45, 0x8b, 0x4f, 0xc7, 0x51, 0xbb, 0x49,
+0xc1, 0x36, 0x22, 0x1a, 0x1c, 0xf7, 0x25, 0xd3, 0xfb, 0xb4, 0x7a, 0xa1, 0x00, 0x9c, 0xfe, 0xa3,
+0xd5, 0xb6, 0xcd, 0xd0, 0x64, 0xee, 0x62, 0x0c, 0xa3, 0x28, 0x23, 0x41, 0xc7, 0x53, 0x1c, 0x5e,
+0x7a, 0x5d, 0x73, 0x50, 0x07, 0x37, 0xa8, 0x13, 0x5a, 0xeb, 0x79, 0xc4, 0xb2, 0xa5, 0x38, 0x94,
+0xde, 0x91, 0x58, 0x9d, 0xf9, 0xb3, 0xb9, 0xd1, 0xf6, 0xf2, 0x8c, 0x14, 0xa9, 0x33, 0xe3, 0x4d,
+0x74, 0x60, 0x30, 0x68, 0xec, 0x62, 0x17, 0x50, 0xfb, 0x30, 0x8e, 0x09, 0x51, 0xdf, 0xb5, 0xb8,
+0xf4, 0x9b, 0x4e, 0x8d, 0xd2, 0x8d, 0x44, 0x9c, 0xb7, 0xb5, 0xa3, 0xd6, 0xc6, 0xfa, 0x9d, 0x1e,
+0x05, 0x3f, 0xc4, 0x58, 0x74, 0x68, 0x98, 0x6b, 0xca, 0x60, 0xc1, 0x48, 0xb3, 0x26, 0xae, 0xfe,
+0x13, 0xd6, 0x6f, 0xb2, 0x02, 0x99, 0x1c, 0x8d, 0xd8, 0x8f, 0x1e, 0xa0, 0x81, 0xbb, 0x73, 0xde,
+0x3e, 0x04, 0xe9, 0x28, 0x37, 0x48, 0xbc, 0x5e, 0x86, 0x69, 0x14, 0x67, 0x78, 0x57, 0x1d, 0x3d,
+0x68, 0x1b, 0x04, 0xf6, 0x59, 0xd1, 0xc7, 0xb1, 0xda, 0x9b, 0x76, 0x92, 0xf8, 0x96, 0xc0, 0xa8,
+0x9f, 0xc5, 0x44, 0xe9, 0xe2, 0x0e, 0x63, 0x31, 0x9b, 0x4c, 0x90, 0x5d, 0xac, 0x62, 0x96, 0x5b,
+0x19, 0x4a, 0xdf, 0x30, 0x8c, 0x12, 0xe6, 0xf1, 0x01, 0xd2, 0xbd, 0xb6, 0xe4, 0xa3, 0xbe, 0x9c,
+0xae, 0xa2, 0x91, 0xb5, 0x73, 0xd2, 0xce, 0xf4, 0x28, 0x17, 0x71, 0x34, 0x53, 0x49, 0xed, 0x53,
+0x17, 0x54, 0xdf, 0x4a, 0x8f, 0x3a, 0xdd, 0x24, 0xd2, 0x0b, 0xe4, 0xf0, 0x5d, 0xd6, 0xa3, 0xbf,
+0x5d, 0xb0, 0x83, 0xab, 0xdf, 0xb2, 0xb9, 0xc5, 0x71, 0xe0, 0x56, 0xfe, 0x1c, 0x1a, 0x07, 0x30,
+0xe9, 0x3d, 0x49, 0x43, 0xe9, 0x40, 0xc7, 0x38, 0x01, 0x2c, 0xbc, 0x1b, 0xae, 0x08, 0xbc, 0xf3,
+0xbd, 0xde, 0xdb, 0xcc, 0x77, 0xc1, 0x0d, 0xbf, 0xc7, 0xc6, 0x31, 0xd7, 0xe6, 0xec, 0x30, 0x03,
+0x98, 0x16, 0x7b, 0x24, 0x2f, 0x2c, 0x1d, 0x2e, 0xa3, 0x2b, 0xed, 0x25, 0xd3, 0x1d, 0x66, 0x13,
+0xde, 0x06, 0xe8, 0xf8, 0xaa, 0xea, 0x7b, 0xde, 0xdd, 0xd6, 0x97, 0xd5, 0x37, 0xdb, 0x54, 0xe6,
+0xf2, 0xf3, 0x52, 0x01, 0x34, 0x0c, 0x7a, 0x13, 0x2c, 0x17, 0x1a, 0x18, 0xe2, 0x16, 0x8c, 0x14,
+0x64, 0x11, 0x84, 0x0d, 0x74, 0x08, 0x42, 0x02, 0x62, 0xfb, 0xca, 0xf4, 0xae, 0xef, 0x34, 0xed,
+0xcc, 0xed, 0xbe, 0xf0, 0x14, 0xf5, 0x6e, 0xf9, 0xea, 0xfc, 0x16, 0xff, 0x56, 0x00, 0x44, 0x01,
+0x7e, 0x02, 0xa2, 0x04, 0xf4, 0x07, 0x02, 0x0c, 0xbc, 0x0f, 0xf6, 0x11, 0x7e, 0x11, 0x0a, 0x0e,
+0x40, 0x08, 0x32, 0x01, 0x58, 0xfa, 0xa6, 0xf4, 0x76, 0xf0, 0x8a, 0xed, 0x6a, 0xeb, 0x1e, 0xea,
+0xee, 0xe9, 0x5e, 0xeb, 0x4c, 0xef, 0xc2, 0xf6, 0x6e, 0x01, 0x58, 0x0e, 0x64, 0x1b, 0x43, 0x25,
+0xa7, 0x29, 0x3b, 0x27, 0xa7, 0x1e, 0xaa, 0x11, 0x24, 0x03, 0x10, 0xf5, 0x20, 0xe9, 0x8d, 0xdf,
+0x83, 0xd8, 0x6b, 0xd4, 0x9f, 0xd3, 0x47, 0xd7, 0x49, 0xe0, 0xec, 0xee, 0x2e, 0x02, 0xec, 0x17,
+0x13, 0x2c, 0xbd, 0x3a, 0xb3, 0x40, 0xbf, 0x3c, 0xd7, 0x2f, 0xef, 0x1c, 0x74, 0x07, 0x8a, 0xf2,
+0xd3, 0xdf, 0x99, 0xd0, 0x77, 0xc5, 0x4f, 0xbf, 0x53, 0xbf, 0xcf, 0xc6, 0x45, 0xd6, 0x02, 0xed,
+0xf6, 0x08, 0xd3, 0x25, 0xdb, 0x3e, 0x29, 0x4f, 0x23, 0x54, 0x05, 0x4d, 0xc1, 0x3b, 0xbf, 0x23,
+0x88, 0x08, 0x66, 0xed, 0xd9, 0xd4, 0xef, 0xc0, 0xd9, 0xb2, 0xb3, 0xac, 0xb1, 0xaf, 0x1d, 0xbd,
+0x6d, 0xd4, 0x4c, 0xf3, 0xbc, 0x15, 0x93, 0x36, 0xbd, 0x50, 0x32, 0x60, 0xa2, 0x62, 0xc4, 0x57,
+0x39, 0x42, 0x3d, 0x25, 0x96, 0x04, 0x24, 0xe4, 0x0d, 0xc7, 0x19, 0xb0, 0xfc, 0xa1, 0x76, 0x9e,
+0xec, 0xa6, 0x23, 0xbb, 0x21, 0xd9, 0xe2, 0xfc, 0xb1, 0x21, 0x93, 0x42, 0xaa, 0x5b, 0x86, 0x69,
+0xe2, 0x69, 0x04, 0x5d, 0x99, 0x44, 0xf9, 0x23, 0xe2, 0xfe, 0xdf, 0xd9, 0x39, 0xb9, 0x70, 0xa1,
+0x8a, 0x95, 0x0c, 0x97, 0xbc, 0xa5, 0xa3, 0xbf, 0x97, 0xe1, 0xf0, 0x06, 0x67, 0x2b, 0x1f, 0x4b,
+0x9e, 0x62, 0xce, 0x6e, 0x82, 0x6d, 0x3e, 0x5e, 0xa3, 0x42, 0x2b, 0x1e, 0x6e, 0xf5, 0xf3, 0xcd,
+0x2f, 0xad, 0xe2, 0x97, 0xb0, 0x90, 0x86, 0x97, 0xf8, 0xaa, 0xf9, 0xc7, 0xac, 0xea, 0x0c, 0x0f,
+0xc1, 0x31, 0x3b, 0x4f, 0xbc, 0x64, 0x10, 0x6f, 0xa6, 0x6b, 0xdc, 0x59, 0x49, 0x3b, 0xe0, 0x13,
+0x62, 0xe9, 0x33, 0xc2, 0x74, 0xa4, 0x5a, 0x94, 0xc2, 0x92, 0x8e, 0x9e, 0xfb, 0xb4, 0x7d, 0xd2,
+0x96, 0xf3, 0x3e, 0x15, 0xb1, 0x34, 0x8f, 0x4f, 0xaa, 0x62, 0xce, 0x6a, 0xe4, 0x64, 0x93, 0x50,
+0x0b, 0x30, 0x3c, 0x08, 0x8b, 0xdf, 0xad, 0xbc, 0xf8, 0xa4, 0xac, 0x9a, 0xa2, 0x9d, 0x95, 0xab,
+0xb9, 0xc1, 0xf9, 0xdc, 0xbe, 0xfa, 0xc8, 0x18, 0x9d, 0x34, 0xed, 0x4b, 0x6e, 0x5b, 0x06, 0x60,
+0x2a, 0x57, 0x79, 0x41, 0xb7, 0x21, 0x0c, 0xfd, 0xe3, 0xd9, 0x07, 0xbe, 0xe1, 0xac, 0xba, 0xa7,
+0x2b, 0xad, 0x2d, 0xbb, 0x3d, 0xcf, 0xf4, 0xe6, 0x8a, 0x00, 0xe2, 0x19, 0x0f, 0x31, 0xb5, 0x43,
+0xf9, 0x4e, 0x31, 0x50, 0x57, 0x46, 0xf7, 0x31, 0x84, 0x16, 0x7a, 0xf8, 0xff, 0xdc, 0x35, 0xc8,
+0xd1, 0xbc, 0x5b, 0xba, 0x27, 0xc0, 0x25, 0xcc, 0x93, 0xdc, 0xfc, 0xef, 0x2a, 0x04, 0xc2, 0x17,
+0xbd, 0x28, 0x7b, 0x35, 0x29, 0x3c, 0x63, 0x3b, 0xb9, 0x32, 0x35, 0x23, 0x04, 0x0f, 0x62, 0xf9,
+0x06, 0xe6, 0x87, 0xd7, 0xad, 0xcf, 0xa3, 0xce, 0x8f, 0xd3, 0xe9, 0xdc, 0x76, 0xe9, 0x44, 0xf7,
+0xd6, 0x04, 0x0c, 0x11, 0xe4, 0x1a, 0x07, 0x22, 0x91, 0x25, 0x23, 0x25, 0x55, 0x20, 0x56, 0x17,
+0x0a, 0x0c, 0x18, 0x00, 0x68, 0xf5, 0x48, 0xee, 0x02, 0xec, 0x00, 0xee, 0x2e, 0xf3, 0xb8, 0xf9,
+0x96, 0xff, 0x18, 0x04, 0x66, 0x07, 0x8a, 0x0a, 0x0a, 0x0e, 0x60, 0x11, 0x44, 0x13, 0xda, 0x12,
+0xac, 0x0f, 0x2e, 0x0a, 0x16, 0x04, 0x14, 0xff, 0x1c, 0xfc, 0x40, 0xfb, 0xb0, 0xfb, 0xc0, 0xfb,
+0xb2, 0xfa, 0xf4, 0xf7, 0xf0, 0xf3, 0x66, 0xf0, 0x38, 0xef, 0xb6, 0xf1, 0x06, 0xf8, 0x18, 0x01,
+0x78, 0x0a, 0x60, 0x12, 0x16, 0x17, 0x7c, 0x18, 0xc0, 0x17, 0xd2, 0x15, 0x70, 0x13, 0x50, 0x10,
+0x4a, 0x0b, 0x72, 0x03, 0x20, 0xf9, 0x24, 0xed, 0x99, 0xe1, 0x3d, 0xd9, 0x9b, 0xd6, 0x9b, 0xda,
+0x2c, 0xe5, 0x70, 0xf4, 0x44, 0x05, 0xd8, 0x14, 0x21, 0x21, 0x29, 0x29, 0x37, 0x2d, 0xab, 0x2d,
+0x0f, 0x2a, 0x81, 0x22, 0x22, 0x16, 0x76, 0x05, 0x5c, 0xf2, 0xeb, 0xde, 0x83, 0xce, 0x13, 0xc4,
+0xd7, 0xc1, 0xa1, 0xc8, 0xb5, 0xd7, 0xc2, 0xec, 0x64, 0x04, 0x1c, 0x1b, 0xf3, 0x2d, 0x9b, 0x3b,
+0xd7, 0x42, 0x0b, 0x43, 0xb9, 0x3b, 0x37, 0x2d, 0x9c, 0x18, 0xf4, 0xff, 0x04, 0xe6, 0x53, 0xce,
+0xe1, 0xbb, 0x89, 0xb1, 0x39, 0xb1, 0x0f, 0xbb, 0xc1, 0xce, 0x88, 0xe9, 0xfc, 0x07, 0xa1, 0x25,
+0xdb, 0x3e, 0x3d, 0x50, 0xf6, 0x57, 0xcc, 0x54, 0x3b, 0x47, 0x7f, 0x31, 0xca, 0x15, 0x50, 0xf7,
+0xd7, 0xd9, 0xe9, 0xbf, 0xe7, 0xac, 0x4e, 0xa3, 0x80, 0xa4, 0x75, 0xb1, 0x93, 0xc9, 0x34, 0xea,
+0x2c, 0x0f, 0xdd, 0x32, 0xc9, 0x4f, 0x32, 0x62, 0x62, 0x67, 0x16, 0x5f, 0x75, 0x4b, 0xb3, 0x2f,
+0x68, 0x0f, 0x12, 0xee, 0xed, 0xce, 0xa1, 0xb4, 0x12, 0xa2, 0x8c, 0x99, 0xfe, 0x9c, 0x3b, 0xad,
+0x17, 0xca, 0x30, 0xf0, 0x26, 0x1a, 0xf5, 0x40, 0x84, 0x5e, 0xd2, 0x6e, 0x98, 0x6f, 0x0e, 0x62,
+0x9f, 0x49, 0x73, 0x2a, 0x28, 0x08, 0x18, 0xe6, 0xb5, 0xc6, 0xe3, 0xac, 0x40, 0x9b, 0x84, 0x94,
+0xb4, 0x9a, 0x07, 0xaf, 0x69, 0xd0, 0xa6, 0xfa, 0xbf, 0x26, 0x35, 0x4d, 0x28, 0x68, 0xc2, 0x73,
+0xce, 0x6f, 0x48, 0x5e, 0x3d, 0x43, 0xeb, 0x22, 0x5c, 0x00, 0xbf, 0xde, 0x5d, 0xc0, 0x12, 0xa8,
+0xe2, 0x98, 0x66, 0x95, 0xc2, 0x9f, 0x27, 0xb8, 0x97, 0xdc, 0x3a, 0x07, 0x61, 0x31, 0xdf, 0x53,
+0xc6, 0x69, 0xc2, 0x70, 0x46, 0x69, 0xf6, 0x55, 0xbb, 0x3a, 0xda, 0x1a, 0x82, 0xf9, 0x29, 0xd9,
+0xe1, 0xbc, 0x78, 0xa7, 0xd8, 0x9b, 0x84, 0x9c, 0x72, 0xaa, 0x3b, 0xc5, 0xea, 0xe8, 0x84, 0x10,
+0x6f, 0x35, 0x6d, 0x52, 0x94, 0x63, 0x4c, 0x67, 0x82, 0x5e, 0x3b, 0x4b, 0xe3, 0x30, 0x5c, 0x12,
+0x68, 0xf2, 0x85, 0xd4, 0xc1, 0xbb, 0x0c, 0xab, 0xac, 0xa4, 0x9a, 0xa9, 0xc5, 0xb9, 0x6d, 0xd3,
+0x30, 0xf3, 0x68, 0x14, 0xbd, 0x32, 0xd1, 0x49, 0x24, 0x57, 0x56, 0x59, 0x63, 0x50, 0x87, 0x3e,
+0x07, 0x26, 0x12, 0x0a, 0xda, 0xed, 0xab, 0xd4, 0x83, 0xc1, 0xa1, 0xb6, 0xc3, 0xb4, 0x37, 0xbc,
+0x59, 0xcb, 0xd1, 0xe0, 0x0c, 0xfa, 0x08, 0x14, 0x89, 0x2b, 0x93, 0x3d, 0x85, 0x47, 0x0d, 0x48,
+0x57, 0x3f, 0x8d, 0x2e, 0xd6, 0x18, 0xfa, 0x00, 0xbe, 0xea, 0xf9, 0xd8, 0x47, 0xcd, 0x69, 0xc8,
+0x07, 0xca, 0xc5, 0xd0, 0xad, 0xdb, 0x06, 0xea, 0xee, 0xfa, 0x0e, 0x0d, 0x2b, 0x1e, 0xb5, 0x2b,
+0x1f, 0x33, 0x1b, 0x33, 0x8f, 0x2b, 0x41, 0x1e, 0xf6, 0x0d, 0x94, 0xfd, 0x0c, 0xf0, 0x82, 0xe6,
+0x63, 0xe1, 0xe3, 0xdf, 0x13, 0xe1, 0xe6, 0xe3, 0x5e, 0xe8, 0xce, 0xee, 0x7e, 0xf7, 0x22, 0x02,
+0x3c, 0x0d, 0xbe, 0x16, 0x4f, 0x1c, 0xc7, 0x1c, 0x2c, 0x18, 0x36, 0x10, 0x36, 0x07, 0x8a, 0xff,
+0x66, 0xfa, 0x08, 0xf8, 0x2a, 0xf7, 0xda, 0xf6, 0xe6, 0xf5, 0xea, 0xf3, 0xba, 0xf1, 0x66, 0xf0,
+0x3a, 0xf1, 0xba, 0xf4, 0xfc, 0xf9, 0xc0, 0xff, 0x5c, 0x04, 0xe2, 0x06, 0x96, 0x07, 0x74, 0x07,
+0xfc, 0x07, 0xb6, 0x09, 0x42, 0x0c, 0x88, 0x0e, 0x60, 0x0f, 0x80, 0x0d, 0x92, 0x08, 0xb2, 0x00,
+0x4c, 0xf7, 0x3a, 0xee, 0x20, 0xe7, 0x61, 0xe3, 0x69, 0xe3, 0x8e, 0xe6, 0x3c, 0xec, 0x68, 0xf3,
+0xc8, 0xfb, 0x26, 0x05, 0xdc, 0x0e, 0x42, 0x18, 0xe9, 0x1f, 0xc7, 0x24, 0xa9, 0x25, 0x81, 0x21,
+0x44, 0x18, 0x78, 0x0a, 0xc2, 0xf9, 0x9a, 0xe8, 0x65, 0xd9, 0x19, 0xcf, 0x5d, 0xcb, 0x47, 0xce,
+0x75, 0xd7, 0x7c, 0xe5, 0x52, 0xf6, 0x34, 0x08, 0x50, 0x19, 0xd5, 0x27, 0xf5, 0x32, 0xd9, 0x38,
+0xd5, 0x38, 0x2b, 0x32, 0x53, 0x24, 0x68, 0x10, 0x36, 0xf8, 0xc5, 0xde, 0x69, 0xc8, 0x53, 0xb9,
+0x35, 0xb4, 0xad, 0xb9, 0x7f, 0xc8, 0xef, 0xdd, 0x5a, 0xf6, 0xfc, 0x0e, 0x1f, 0x25, 0x7d, 0x37,
+0x4b, 0x44, 0x8f, 0x4a, 0x13, 0x49, 0xd9, 0x3e, 0x91, 0x2b, 0x72, 0x10, 0x6a, 0xf0, 0xb7, 0xcf,
+0x83, 0xb4, 0xd4, 0xa3, 0xd6, 0xa0, 0x34, 0xab, 0x7b, 0xc0, 0x8d, 0xdc, 0x04, 0xfb, 0x1c, 0x18,
+0xc1, 0x31, 0xf7, 0x45, 0xad, 0x53, 0x2a, 0x59, 0xd0, 0x54, 0xc1, 0x45, 0x17, 0x2c, 0x22, 0x0a,
+0xd2, 0xe3, 0xf3, 0xbe, 0x64, 0xa2, 0xa0, 0x93, 0x96, 0x94, 0xfc, 0xa3, 0x63, 0xbe, 0x05, 0xdf,
+0x1e, 0x01, 0x17, 0x21, 0x97, 0x3c, 0x03, 0x52, 0x68, 0x5f, 0xd6, 0x62, 0x94, 0x5a, 0x2f, 0x46,
+0xe9, 0x26, 0xca, 0xff, 0x73, 0xd6, 0x0b, 0xb1, 0xa0, 0x96, 0x60, 0x8b, 0x1a, 0x90, 0x0a, 0xa3,
+0x8b, 0xc0, 0xc2, 0xe3, 0xfc, 0x07, 0xb5, 0x29, 0x57, 0x46, 0xb4, 0x5b, 0x40, 0x67, 0xe6, 0x66,
+0x74, 0x59, 0xe1, 0x3f, 0x75, 0x1c, 0xc0, 0xf3, 0x47, 0xcb, 0xf8, 0xa8, 0x3a, 0x92, 0x68, 0x8a,
+0x94, 0x91, 0x50, 0xa6, 0x49, 0xc5, 0xca, 0xe9, 0x66, 0x0f, 0x1f, 0x32, 0x8d, 0x4e, 0xea, 0x61,
+0x88, 0x69, 0xee, 0x63, 0xe3, 0x51, 0x11, 0x35, 0x2a, 0x11, 0x80, 0xea, 0xbd, 0xc5, 0xce, 0xa7,
+0xd6, 0x94, 0x4a, 0x8f, 0xcc, 0x97, 0x5b, 0xad, 0x01, 0xcd, 0x2c, 0xf2, 0xbe, 0x17, 0x25, 0x39,
+0xf9, 0x52, 0xe6, 0x61, 0x46, 0x64, 0x14, 0x5a, 0x11, 0x45, 0x55, 0x28, 0xfe, 0x06, 0x9a, 0xe4,
+0x03, 0xc5, 0xb7, 0xab, 0x02, 0x9c, 0x88, 0x98, 0xfc, 0xa1, 0x1d, 0xb8, 0xcd, 0xd7, 0xf8, 0xfb,
+0x4b, 0x1f, 0x43, 0x3d, 0xb5, 0x51, 0xca, 0x5a, 0x1a, 0x58, 0xe9, 0x4a, 0xa1, 0x36, 0xdd, 0x1c,
+0x94, 0x00, 0x04, 0xe4, 0xb5, 0xc9, 0xb7, 0xb4, 0x28, 0xa8, 0x7a, 0xa6, 0xfb, 0xb0, 0x0b, 0xc7,
+0xec, 0xe4, 0xc0, 0x05, 0xed, 0x23, 0x13, 0x3b, 0xa9, 0x48, 0xdb, 0x4b, 0xdd, 0x45, 0x21, 0x39,
+0xa7, 0x27, 0x90, 0x13, 0xa0, 0xfd, 0xa8, 0xe7, 0x23, 0xd3, 0xa5, 0xc2, 0x19, 0xb9, 0xef, 0xb8,
+0x3d, 0xc3, 0xcf, 0xd6, 0x10, 0xf0, 0xfe, 0x09, 0x6f, 0x20, 0xf7, 0x2f, 0x8b, 0x37, 0x73, 0x37,
+0x9b, 0x31, 0x99, 0x27, 0x78, 0x1b, 0x8c, 0x0d, 0x98, 0xfe, 0x3e, 0xef, 0x87, 0xe0, 0xad, 0xd4,
+0xdd, 0xcd, 0x3d, 0xce, 0x29, 0xd6, 0xa8, 0xe4, 0x70, 0xf6, 0x04, 0x08, 0x52, 0x16, 0x4b, 0x1f,
+0xd7, 0x22, 0xb5, 0x21, 0x9d, 0x1d, 0xe4, 0x17, 0x48, 0x11, 0x16, 0x0a, 0x40, 0x02, 0x18, 0xfa,
+0xfa, 0xf1, 0xe6, 0xea, 0x42, 0xe6, 0x44, 0xe5, 0x5a, 0xe8, 0xe2, 0xee, 0x22, 0xf7, 0x44, 0xff,
+0x08, 0x06, 0x28, 0x0a, 0xcc, 0x0b, 0xb6, 0x0b, 0xda, 0x0a, 0x24, 0x0a, 0xee, 0x09, 0x0c, 0x0a,
+0x36, 0x0a, 0x86, 0x09, 0xfe, 0x06, 0xe0, 0x02, 0x8c, 0xfd, 0x46, 0xf8, 0x1c, 0xf4, 0x80, 0xf1,
+0xc0, 0xf0, 0x3c, 0xf1, 0x64, 0xf2, 0x8e, 0xf3, 0xd4, 0xf4, 0xc2, 0xf6, 0x06, 0xfa, 0x20, 0xff,
+0x28, 0x06, 0x9e, 0x0e, 0xe0, 0x16, 0x1f, 0x1d, 0x21, 0x1f, 0xfe, 0x1b, 0xee, 0x13, 0x80, 0x08,
+0x0c, 0xfc, 0x7e, 0xf0, 0x58, 0xe7, 0x01, 0xe1, 0xa1, 0xdd, 0xb1, 0xdc, 0x8b, 0xde, 0x59, 0xe3,
+0xc4, 0xeb, 0x1e, 0xf8, 0xaa, 0x07, 0xca, 0x18, 0x89, 0x28, 0x89, 0x33, 0xe3, 0x36, 0x99, 0x31,
+0x73, 0x24, 0x1e, 0x12, 0x16, 0xfe, 0x42, 0xeb, 0xcf, 0xdb, 0xa3, 0xd0, 0xbd, 0xc9, 0x67, 0xc7,
+0x35, 0xca, 0xcb, 0xd2, 0xb7, 0xe1, 0x50, 0xf6, 0xb0, 0x0e, 0x9b, 0x27, 0xab, 0x3c, 0xdb, 0x49,
+0x35, 0x4c, 0x1d, 0x43, 0x7f, 0x30, 0x9a, 0x17, 0xc4, 0xfc, 0x85, 0xe3, 0x6f, 0xce, 0x1b, 0xbf,
+0x4f, 0xb6, 0x7f, 0xb4, 0x57, 0xba, 0x87, 0xc8, 0xa3, 0xde, 0x6e, 0xfb, 0xec, 0x1a, 0xad, 0x38,
+0xcf, 0x4f, 0x4e, 0x5c, 0xf8, 0x5b, 0xb9, 0x4e, 0xf1, 0x36, 0xac, 0x18, 0x52, 0xf8, 0xa3, 0xd9,
+0x09, 0xc0, 0x93, 0xad, 0x24, 0xa4, 0xc2, 0xa4, 0xdd, 0xaf, 0x7f, 0xc5, 0xa9, 0xe3, 0xcc, 0x06,
+0x01, 0x2a, 0xb5, 0x48, 0x88, 0x5e, 0x94, 0x68, 0xf4, 0x64, 0x3b, 0x54, 0xf9, 0x38, 0x00, 0x17,
+0x82, 0xf2, 0xe3, 0xcf, 0x15, 0xb3, 0xb2, 0x9f, 0xdc, 0x97, 0xa4, 0x9c, 0xfb, 0xad, 0xef, 0xc9,
+0x0c, 0xed, 0x98, 0x12, 0xd7, 0x35, 0xcb, 0x52, 0x66, 0x66, 0xd4, 0x6d, 0x0a, 0x68, 0x26, 0x55,
+0x7f, 0x37, 0x64, 0x12, 0x68, 0xea, 0xb1, 0xc4, 0x9c, 0xa6, 0x74, 0x94, 0x6c, 0x90, 0xe0, 0x9a,
+0xd7, 0xb1, 0x55, 0xd2, 0x78, 0xf7, 0xad, 0x1c, 0xeb, 0x3d, 0x4c, 0x58, 0x5a, 0x69, 0xc2, 0x6e,
+0xec, 0x66, 0xeb, 0x51, 0xab, 0x31, 0xd6, 0x09, 0xcb, 0xdf, 0xc7, 0xb9, 0xee, 0x9d, 0x4c, 0x90,
+0xe4, 0x91, 0x82, 0xa1, 0x09, 0xbc, 0x5d, 0xdd, 0x16, 0x01, 0x45, 0x23, 0x1f, 0x41, 0x7c, 0x58,
+0x22, 0x67, 0x68, 0x6a, 0xba, 0x60, 0xbd, 0x49, 0xb9, 0x27, 0xe4, 0xfe, 0x93, 0xd5, 0xb1, 0xb2,
+0x00, 0x9c, 0x28, 0x94, 0xe0, 0x9a, 0x7d, 0xad, 0x6b, 0xc8, 0xc6, 0xe7, 0xce, 0x07, 0xb7, 0x25,
+0x9d, 0x3f, 0x93, 0x53, 0x56, 0x5f, 0x50, 0x60, 0xca, 0x54, 0xeb, 0x3c, 0x3a, 0x1b, 0xcc, 0xf4,
+0x1b, 0xd0, 0x9d, 0xb3, 0x6e, 0xa3, 0xc0, 0xa0, 0x0c, 0xaa, 0x95, 0xbc, 0xfd, 0xd4, 0x0a, 0xf0,
+0x4a, 0x0b, 0x7b, 0x24, 0x3d, 0x3a, 0x5d, 0x4a, 0xf5, 0x52, 0x99, 0x51, 0x47, 0x45, 0x65, 0x2e,
+0x22, 0x10, 0x58, 0xef, 0xd7, 0xd1, 0x7f, 0xbc, 0xc3, 0xb1, 0x1b, 0xb2, 0x9d, 0xbb, 0xed, 0xcb,
+0x59, 0xe0, 0xb4, 0xf6, 0xb6, 0x0c, 0xe5, 0x20, 0x7d, 0x31, 0x29, 0x3d, 0x2d, 0x42, 0x15, 0x3f,
+0x5d, 0x33, 0x35, 0x20, 0x3a, 0x08, 0x80, 0xef, 0x37, 0xda, 0x81, 0xcb, 0xfb, 0xc4, 0x57, 0xc6,
+0x61, 0xce, 0x2f, 0xdb, 0xd8, 0xea, 0x42, 0xfb, 0x28, 0x0b, 0xf2, 0x18, 0xd1, 0x23, 0xaf, 0x2a,
+0x0d, 0x2d, 0x6d, 0x2a, 0xc5, 0x22, 0x94, 0x16, 0x54, 0x07, 0x7a, 0xf7, 0x74, 0xe9, 0x79, 0xdf,
+0xa5, 0xda, 0x7f, 0xdb, 0xff, 0xe0, 0x98, 0xe9, 0x84, 0xf3, 0x42, 0xfd, 0xac, 0x05, 0x4a, 0x0c,
+0xec, 0x10, 0xfe, 0x13, 0xe8, 0x15, 0x96, 0x16, 0x5a, 0x15, 0xc4, 0x11, 0xa8, 0x0b, 0xe0, 0x03,
+0xd0, 0xfb, 0x4a, 0xf5, 0xac, 0xf1, 0x22, 0xf1, 0xfa, 0xf2, 0xc8, 0xf5, 0x62, 0xf8, 0xde, 0xf9,
+0x0c, 0xfa, 0x4e, 0xf9, 0x28, 0xf9, 0x10, 0xfb, 0x9c, 0xff, 0x50, 0x06, 0x60, 0x0d, 0xd6, 0x12,
+0x1a, 0x15, 0x2e, 0x14, 0xe0, 0x10, 0xd8, 0x0c, 0x08, 0x09, 0xc0, 0x05, 0x52, 0x02, 0xdc, 0xfd,
+0xc8, 0xf7, 0x3c, 0xf0, 0x5e, 0xe8, 0x0f, 0xe2, 0xdf, 0xdf, 0x5f, 0xe3, 0x96, 0xec, 0x00, 0xfa,
+0x0e, 0x09, 0x92, 0x16, 0x6d, 0x20, 0x9d, 0x25, 0xa5, 0x26, 0x6f, 0x24, 0xb5, 0x1f, 0x3c, 0x18,
+0x10, 0x0e, 0xee, 0x00, 0xb2, 0xf1, 0xf7, 0xe1, 0x55, 0xd4, 0x97, 0xcb, 0xfb, 0xc9, 0x9d, 0xd0,
+0xcb, 0xde, 0x76, 0xf2, 0x14, 0x08, 0x93, 0x1c, 0xcf, 0x2c, 0x47, 0x37, 0x6f, 0x3b, 0x9d, 0x39,
+0xeb, 0x31, 0xbd, 0x24, 0x76, 0x12, 0xb4, 0xfc, 0xde, 0xe5, 0xc9, 0xd0, 0x75, 0xc0, 0x9f, 0xb7,
+0x0d, 0xb8, 0x53, 0xc2, 0x4b, 0xd5, 0x86, 0xee, 0xa4, 0x0a, 0xd5, 0x25, 0x47, 0x3c, 0x47, 0x4b,
+0x53, 0x51, 0xb5, 0x4d, 0xbd, 0x40, 0xa1, 0x2b, 0xe0, 0x10, 0x80, 0xf3, 0x2f, 0xd7, 0x4f, 0xbf,
+0xc3, 0xae, 0x92, 0xa7, 0xd2, 0xaa, 0xab, 0xb8, 0x3d, 0xd0, 0x30, 0xef, 0x86, 0x11, 0x77, 0x32,
+0x5f, 0x4d, 0x60, 0x5e, 0x04, 0x63, 0xb4, 0x5a, 0xed, 0x46, 0x9f, 0x2a, 0xc2, 0x09, 0x50, 0xe8,
+0x25, 0xca, 0x4b, 0xb2, 0xfe, 0xa2, 0x8e, 0x9d, 0x1c, 0xa3, 0x3d, 0xb4, 0x1b, 0xd0, 0x0a, 0xf4,
+0x72, 0x1b, 0x8d, 0x40, 0x7a, 0x5d, 0x66, 0x6d, 0x0a, 0x6e, 0xf8, 0x5f, 0x37, 0x46, 0x1f, 0x25,
+0x52, 0x01, 0xd7, 0xde, 0xd7, 0xc0, 0xd4, 0xa9, 0xba, 0x9b, 0x08, 0x98, 0x12, 0xa0, 0x7b, 0xb4,
+0x7f, 0xd4, 0xc8, 0xfc, 0x9b, 0x27, 0xef, 0x4d, 0x6e, 0x69, 0xac, 0x75, 0x3a, 0x71, 0xee, 0x5d,
+0x4d, 0x40, 0x3d, 0x1d, 0x26, 0xf9, 0x27, 0xd7, 0x29, 0xba, 0xba, 0xa4, 0xb6, 0x98, 0x98, 0x97,
+0xd8, 0xa2, 0x0b, 0xbb, 0x79, 0xde, 0xc0, 0x08, 0x3d, 0x33, 0xfc, 0x56, 0x2e, 0x6e, 0x66, 0x75,
+0x6e, 0x6c, 0x6a, 0x56, 0xd5, 0x37, 0x4c, 0x15, 0x4a, 0xf2, 0xe9, 0xd1, 0xd5, 0xb6, 0x90, 0xa3,
+0x3a, 0x9a, 0x8c, 0x9c, 0x55, 0xab, 0x57, 0xc6, 0xcc, 0xea, 0x80, 0x13, 0x11, 0x3a, 0x82, 0x58,
+0x54, 0x6a, 0x64, 0x6d, 0x4a, 0x62, 0x07, 0x4c, 0xc5, 0x2e, 0x32, 0x0e, 0x4e, 0xed, 0x11, 0xcf,
+0x95, 0xb6, 0xae, 0xa6, 0x30, 0xa1, 0x28, 0xa7, 0xcb, 0xb8, 0x71, 0xd4, 0xb6, 0xf6, 0x9c, 0x1a,
+0x0b, 0x3b, 0x71, 0x53, 0x68, 0x60, 0xa8, 0x60, 0x1a, 0x55, 0x0b, 0x40, 0xe9, 0x24, 0xbe, 0x06,
+0x02, 0xe9, 0xe7, 0xce, 0x4d, 0xbb, 0x5d, 0xb0, 0x67, 0xaf, 0x59, 0xb8, 0x21, 0xca, 0x75, 0xe2,
+0x7c, 0xfe, 0xb2, 0x1a, 0xbd, 0x33, 0x61, 0x46, 0x1b, 0x50, 0x99, 0x4f, 0x03, 0x45, 0x1d, 0x32,
+0xdc, 0x19, 0xa2, 0xff, 0xc4, 0xe6, 0x75, 0xd2, 0x0d, 0xc5, 0xc9, 0xbf, 0xad, 0xc2, 0x7b, 0xcc,
+0x71, 0xdb, 0xb6, 0xed, 0x92, 0x01, 0xa4, 0x15, 0xcf, 0x27, 0xc1, 0x35, 0x05, 0x3d, 0x21, 0x3c,
+0x27, 0x33, 0x83, 0x23, 0xe0, 0x0f, 0xca, 0xfb, 0x60, 0xea, 0xe5, 0xdd, 0x41, 0xd7, 0x45, 0xd6,
+0xe9, 0xd9, 0x9b, 0xe0, 0xe8, 0xe8, 0x9e, 0xf2, 0xa8, 0xfd, 0xe2, 0x09, 0x2e, 0x16, 0x39, 0x20,
+0x13, 0x26, 0x31, 0x26, 0x41, 0x20, 0xd4, 0x15, 0x54, 0x09, 0x96, 0xfd, 0xae, 0xf4, 0x78, 0xef,
+0xb6, 0xed, 0x36, 0xee, 0x90, 0xef, 0xc0, 0xf0, 0xa6, 0xf1, 0x0e, 0xf3, 0x22, 0xf6, 0x6c, 0xfb,
+0x64, 0x02, 0x76, 0x09, 0xba, 0x0e, 0xf4, 0x10, 0xea, 0x0f, 0x96, 0x0c, 0xa4, 0x08, 0xd8, 0x05,
+0xd6, 0x04, 0x12, 0x05, 0x48, 0x05, 0x52, 0x04, 0x5e, 0x01, 0x4a, 0xfc, 0xd0, 0xf5, 0x86, 0xef,
+0x4c, 0xeb, 0x38, 0xea, 0x48, 0xec, 0x0e, 0xf1, 0x1e, 0xf7, 0x68, 0xfd, 0x44, 0x03, 0xd4, 0x08,
+0xbc, 0x0e, 0xa6, 0x14, 0xa2, 0x19, 0xaf, 0x1c, 0xb9, 0x1c, 0x04, 0x19, 0x42, 0x11, 0xc2, 0x05,
+0xdc, 0xf7, 0xd8, 0xe9, 0xbf, 0xdd, 0xfd, 0xd5, 0x1b, 0xd4, 0x07, 0xd8, 0x1f, 0xe1, 0xa8, 0xed,
+0x2a, 0xfc, 0x50, 0x0b, 0x88, 0x19, 0x61, 0x25, 0xc1, 0x2d, 0x77, 0x31, 0x1b, 0x30, 0x49, 0x29,
+0xd5, 0x1c, 0x76, 0x0b, 0xa4, 0xf6, 0xe9, 0xe0, 0xf9, 0xcd, 0x0d, 0xc1, 0xf3, 0xbc, 0x93, 0xc2,
+0xa5, 0xd0, 0xb2, 0xe4, 0xa2, 0xfb, 0x74, 0x12, 0x99, 0x26, 0x15, 0x36, 0xdd, 0x3f, 0x6b, 0x43,
+0x5f, 0x40, 0x2b, 0x36, 0xbd, 0x24, 0x06, 0x0d, 0x04, 0xf1, 0x43, 0xd4, 0x73, 0xbb, 0x85, 0xab,
+0xfc, 0xa7, 0x93, 0xb1, 0x1d, 0xc6, 0xdd, 0xe1, 0x14, 0x00, 0x93, 0x1c, 0x65, 0x34, 0xf5, 0x45,
+0x47, 0x50, 0xfd, 0x52, 0x0b, 0x4d, 0x6d, 0x3e, 0x23, 0x27, 0x94, 0x08, 0xb0, 0xe5, 0x87, 0xc3,
+0x02, 0xa8, 0xba, 0x98, 0xe0, 0x98, 0x06, 0xa8, 0x31, 0xc3, 0xb8, 0xe4, 0x70, 0x07, 0x0f, 0x27,
+0xc7, 0x40, 0x3f, 0x53, 0x62, 0x5d, 0x30, 0x5e, 0xec, 0x54, 0x39, 0x41, 0xd5, 0x23, 0x36, 0xff,
+0xaf, 0xd7, 0x45, 0xb3, 0xd6, 0x98, 0xee, 0x8c, 0xdc, 0x91, 0xf6, 0xa5, 0x0f, 0xc5, 0xf8, 0xe9,
+0xd4, 0x0e, 0xeb, 0x2f, 0x97, 0x4a, 0x36, 0x5d, 0x0c, 0x66, 0xd2, 0x63, 0xbe, 0x55, 0x97, 0x3c,
+0x3e, 0x1a, 0xf4, 0xf1, 0x8b, 0xc9, 0x0a, 0xa7, 0x72, 0x90, 0x2e, 0x89, 0xe2, 0x91, 0xec, 0xa8,
+0x0f, 0xca, 0x0c, 0xf0, 0xd0, 0x15, 0x7b, 0x37, 0x3f, 0x52, 0xdc, 0x63, 0x12, 0x6a, 0x8c, 0x63,
+0xa1, 0x50, 0xd9, 0x32, 0xb0, 0x0d, 0x8a, 0xe5, 0xb9, 0xbf, 0xce, 0xa1, 0xdc, 0x8f, 0x52, 0x8c,
+0x76, 0x97, 0x9f, 0xaf, 0x17, 0xd1, 0x1c, 0xf7, 0x8f, 0x1c, 0x4f, 0x3d, 0x6a, 0x56, 0xd2, 0x64,
+0xc4, 0x66, 0x84, 0x5b, 0xbf, 0x44, 0x7f, 0x25, 0xd4, 0x01, 0x99, 0xdd, 0x51, 0xbd, 0xa8, 0xa4,
+0xa6, 0x96, 0x48, 0x95, 0x1a, 0xa1, 0x13, 0xb9, 0xf7, 0xd9, 0xee, 0xfe, 0xd7, 0x22, 0x3d, 0x41,
+0x6e, 0x56, 0xfe, 0x5f, 0xc6, 0x5c, 0xc7, 0x4d, 0xd3, 0x35, 0x66, 0x18, 0x10, 0xf9, 0x01, 0xdb,
+0xdf, 0xc0, 0x2d, 0xad, 0x74, 0xa2, 0xa6, 0xa2, 0xa7, 0xae, 0xd7, 0xc5, 0xd8, 0xe4, 0x1a, 0x07,
+0x5b, 0x27, 0xaf, 0x40, 0xfb, 0x4f, 0xbd, 0x53, 0x53, 0x4c, 0x4b, 0x3c, 0x93, 0x26, 0x44, 0x0e,
+0xc2, 0xf5, 0x95, 0xde, 0x3f, 0xca, 0x1d, 0xbb, 0xa1, 0xb2, 0x93, 0xb3, 0xe9, 0xbe, 0x9d, 0xd3,
+0x02, 0xef, 0x1c, 0x0c, 0xc3, 0x25, 0x35, 0x38, 0x49, 0x41, 0xa7, 0x40, 0x71, 0x38, 0xa9, 0x2a,
+0x16, 0x1a, 0x8a, 0x08, 0x1c, 0xf7, 0xb2, 0xe6, 0x1b, 0xd8, 0x9d, 0xcc, 0xab, 0xc6, 0xd1, 0xc7,
+0x2b, 0xd1, 0xaf, 0xe1, 0x74, 0xf6, 0x66, 0x0b, 0xdf, 0x1c, 0x05, 0x28, 0x2b, 0x2c, 0x61, 0x2a,
+0x0b, 0x24, 0x3c, 0x1b, 0x30, 0x11, 0xe6, 0x06, 0xba, 0xfc, 0xd0, 0xf2, 0x66, 0xe9, 0xa7, 0xe1,
+0x19, 0xdd, 0x2f, 0xdd, 0x79, 0xe2, 0x3c, 0xec, 0x82, 0xf8, 0xae, 0x04, 0x1a, 0x0e, 0x9e, 0x13,
+0x46, 0x15, 0x0a, 0x14, 0x2e, 0x11, 0xc2, 0x0d, 0x70, 0x0a, 0x94, 0x07, 0xe2, 0x04, 0xb8, 0x01,
+0xc0, 0xfd, 0x44, 0xf9, 0xc4, 0xf4, 0x78, 0xf1, 0xf8, 0xef, 0x9e, 0xf0, 0x2a, 0xf3, 0x78, 0xf6,
+0xa2, 0xf9, 0x28, 0xfc, 0x0a, 0xfe, 0xb6, 0xff, 0xd2, 0x01, 0x7e, 0x04, 0x40, 0x08, 0xbe, 0x0c,
+0x26, 0x11, 0x44, 0x14, 0x92, 0x14, 0x3e, 0x11, 0x6c, 0x0a, 0x32, 0x01, 0x7e, 0xf7, 0xec, 0xee,
+0xa6, 0xe8, 0x2e, 0xe5, 0x0a, 0xe4, 0x14, 0xe5, 0xe6, 0xe7, 0x92, 0xec, 0x50, 0xf3, 0x70, 0xfc,
+0xec, 0x07, 0xf2, 0x14, 0x3b, 0x21, 0x59, 0x2a, 0xb7, 0x2d, 0x61, 0x29, 0xdf, 0x1d, 0xe0, 0x0c,
+0xe0, 0xf9, 0x5a, 0xe8, 0xa1, 0xda, 0x01, 0xd2, 0xa1, 0xce, 0x95, 0xcf, 0xbd, 0xd4, 0xab, 0xdd,
+0x70, 0xea, 0x0a, 0xfb, 0x6a, 0x0e, 0x7f, 0x22, 0x53, 0x34, 0x4d, 0x40, 0x15, 0x43, 0x67, 0x3b,
+0x93, 0x29, 0x92, 0x11, 0x60, 0xf7, 0x8b, 0xdf, 0xf5, 0xcc, 0x07, 0xc1, 0xc3, 0xbb, 0xc7, 0xbc,
+0x0f, 0xc4, 0x73, 0xd1, 0x10, 0xe5, 0xa2, 0xfd, 0xe4, 0x18, 0x4f, 0x33, 0x77, 0x48, 0x85, 0x54,
+0xa9, 0x54, 0x3b, 0x48, 0x4f, 0x31, 0xb2, 0x13, 0x3e, 0xf4, 0x2b, 0xd7, 0x3f, 0xc0, 0xe5, 0xb0,
+0x52, 0xaa, 0x7d, 0xac, 0x9f, 0xb7, 0xbf, 0xcb, 0x32, 0xe7, 0x7e, 0x07, 0x59, 0x28, 0x91, 0x45,
+0x82, 0x5a, 0xf6, 0x63, 0xda, 0x5f, 0x77, 0x4e, 0xe7, 0x32, 0xaa, 0x10, 0x0c, 0xed, 0x4b, 0xcc,
+0x6b, 0xb2, 0x04, 0xa2, 0x74, 0x9c, 0x36, 0xa2, 0x2f, 0xb3, 0x0d, 0xce, 0x76, 0xef, 0xce, 0x13,
+0xf5, 0x35, 0x25, 0x52, 0xb2, 0x64, 0xbe, 0x6a, 0x92, 0x63, 0xcb, 0x4f, 0xbd, 0x31, 0x4c, 0x0d,
+0xa0, 0xe6, 0xfb, 0xc2, 0x42, 0xa7, 0xf0, 0x96, 0xee, 0x93, 0xba, 0x9e, 0x89, 0xb5, 0xe9, 0xd5,
+0x1a, 0xfb, 0x0f, 0x20, 0xed, 0x40, 0xfc, 0x59, 0x1e, 0x69, 0x30, 0x6c, 0x9a, 0x62, 0xbf, 0x4c,
+0x0f, 0x2d, 0x5c, 0x06, 0xe7, 0xdd, 0x47, 0xb9, 0x3e, 0x9e, 0xd4, 0x90, 0x82, 0x92, 0x9c, 0xa2,
+0x41, 0xbe, 0x39, 0xe1, 0x38, 0x06, 0xdb, 0x28, 0xef, 0x45, 0x46, 0x5b, 0x1c, 0x67, 0xe0, 0x67,
+0xaa, 0x5c, 0xbd, 0x45, 0xb5, 0x24, 0x24, 0xfd, 0x95, 0xd4, 0xd1, 0xb1, 0x88, 0x9a, 0x64, 0x92,
+0x92, 0x99, 0xf9, 0xad, 0x89, 0xcb, 0x76, 0xed, 0x2e, 0x0f, 0x65, 0x2d, 0xf9, 0x45, 0x64, 0x57,
+0x38, 0x60, 0xd6, 0x5e, 0x4b, 0x52, 0x85, 0x3a, 0x7e, 0x19, 0x2a, 0xf3, 0xbd, 0xcd, 0xd1, 0xaf,
+0x7a, 0x9e, 0xfc, 0x9b, 0x28, 0xa7, 0xe5, 0xbc, 0xdb, 0xd8, 0xcc, 0xf6, 0x60, 0x13, 0x3f, 0x2c,
+0x39, 0x40, 0xe7, 0x4d, 0x35, 0x54, 0x23, 0x51, 0x05, 0x44, 0xe9, 0x2c, 0xfe, 0x0d, 0xf0, 0xeb,
+0x69, 0xcc, 0x47, 0xb5, 0x44, 0xaa, 0xf3, 0xab, 0x6f, 0xb8, 0x99, 0xcc, 0x88, 0xe4, 0x26, 0xfd,
+0x2c, 0x14, 0xbf, 0x27, 0x15, 0x37, 0x47, 0x41, 0x9d, 0x44, 0x85, 0x40, 0xcb, 0x33, 0x5f, 0x1f,
+0xbc, 0x05, 0xa6, 0xea, 0xfd, 0xd2, 0xf5, 0xc2, 0x79, 0xbc, 0x91, 0xbf, 0xa1, 0xca, 0xa1, 0xda,
+0x60, 0xed, 0x46, 0x00, 0x5e, 0x11, 0xd9, 0x1f, 0x5f, 0x2a, 0x65, 0x30, 0x85, 0x31, 0xc9, 0x2c,
+0xb1, 0x22, 0xd6, 0x13, 0xdc, 0x01, 0x9c, 0xef, 0x2d, 0xe0, 0xcf, 0xd5, 0x15, 0xd2, 0xdf, 0xd4,
+0xb9, 0xdc, 0x60, 0xe8, 0x34, 0xf5, 0xb2, 0x01, 0x58, 0x0c, 0x26, 0x14, 0xfa, 0x18, 0x08, 0x1b,
+0xa4, 0x1a, 0x2c, 0x18, 0xce, 0x13, 0x46, 0x0d, 0xfe, 0x04, 0xd0, 0xfb, 0x18, 0xf3, 0xa8, 0xec,
+0xa2, 0xe9, 0x6a, 0xea, 0x68, 0xee, 0x32, 0xf4, 0x24, 0xfa, 0xfc, 0xfe, 0xf6, 0x01, 0xf4, 0x02,
+0xd8, 0x02, 0xbe, 0x02, 0xe4, 0x03, 0xa6, 0x06, 0x1e, 0x0a, 0xe4, 0x0c, 0xc2, 0x0d, 0x04, 0x0c,
+0x5c, 0x08, 0x34, 0x04, 0xb4, 0x00, 0xba, 0xfe, 0xc8, 0xfd, 0xc2, 0xfc, 0xc8, 0xfa, 0x1c, 0xf7,
+0x54, 0xf2, 0x8a, 0xed, 0x8e, 0xea, 0x50, 0xeb, 0xb8, 0xf0, 0x5a, 0xfa, 0x2a, 0x06, 0x8a, 0x11,
+0xfa, 0x19, 0x1d, 0x1e, 0x23, 0x1e, 0x42, 0x1b, 0x9a, 0x16, 0xce, 0x10, 0x94, 0x09, 0x80, 0x00,
+0x92, 0xf5, 0x9e, 0xe9, 0x4f, 0xde, 0x15, 0xd6, 0x47, 0xd3, 0x77, 0xd7, 0xcf, 0xe2, 0x84, 0xf3,
+0xea, 0x06, 0x82, 0x19, 0x17, 0x28, 0x03, 0x31, 0xbd, 0x33, 0x1b, 0x31, 0xbb, 0x29, 0x7b, 0x1e,
+0x7c, 0x0f, 0x8c, 0xfd, 0x4a, 0xea, 0xa5, 0xd7, 0xf1, 0xc8, 0x5d, 0xc0, 0x29, 0xc0, 0xfd, 0xc8,
+0xeb, 0xd9, 0xf6, 0xf0, 0xa2, 0x0a, 0x15, 0x23, 0xd9, 0x36, 0x9b, 0x43, 0xf3, 0x47, 0x13, 0x44,
+0x6d, 0x38, 0x21, 0x26, 0x10, 0x0f, 0x2c, 0xf5, 0xb1, 0xdb, 0xdf, 0xc5, 0x65, 0xb6, 0xf3, 0xaf,
+0xf3, 0xb2, 0xdb, 0xbf, 0x65, 0xd5, 0x5c, 0xf1, 0x48, 0x10, 0x03, 0x2e, 0x43, 0x46, 0x96, 0x55,
+0xf8, 0x59, 0x8f, 0x52, 0xbf, 0x40, 0xaf, 0x26, 0xec, 0x07, 0x32, 0xe8, 0x75, 0xcb, 0x1f, 0xb5,
+0x90, 0xa7, 0xf6, 0xa3, 0x9a, 0xaa, 0x61, 0xbb, 0x43, 0xd5, 0xfa, 0xf5, 0xb0, 0x19, 0x95, 0x3b,
+0x70, 0x56, 0xec, 0x65, 0x3a, 0x67, 0x16, 0x5a, 0x4f, 0x41, 0x9f, 0x20, 0x3a, 0xfd, 0x4f, 0xdb,
+0xb1, 0xbe, 0x4a, 0xaa, 0x52, 0x9f, 0x76, 0x9e, 0x04, 0xa8, 0xf3, 0xbb, 0x97, 0xd9, 0x40, 0xfe,
+0x69, 0x25, 0x67, 0x49, 0x24, 0x64, 0xbc, 0x70, 0xfe, 0x6c, 0x08, 0x5a, 0x05, 0x3c, 0x30, 0x18,
+0x7c, 0xf3, 0x27, 0xd2, 0x3d, 0xb7, 0xd8, 0xa4, 0xdc, 0x9b, 0xf2, 0x9c, 0xee, 0xa8, 0x03, 0xc0,
+0x1b, 0xe1, 0xa2, 0x08, 0x21, 0x31, 0x39, 0x54, 0xcc, 0x6b, 0x5e, 0x73, 0x6a, 0x6a, 0x0f, 0x53,
+0xd1, 0x32, 0xa8, 0x0e, 0x4c, 0xeb, 0x41, 0xcc, 0x0f, 0xb4, 0x74, 0xa4, 0x2e, 0x9e, 0x4c, 0xa2,
+0x63, 0xb1, 0x73, 0xcb, 0x32, 0xee, 0x62, 0x15, 0x37, 0x3b, 0xb8, 0x59, 0x8e, 0x6b, 0xde, 0x6d,
+0x06, 0x61, 0x41, 0x48, 0x7b, 0x28, 0x72, 0x06, 0xbe, 0xe5, 0xcb, 0xc9, 0x93, 0xb4, 0xc0, 0xa7,
+0xb2, 0xa4, 0xcf, 0xab, 0xc3, 0xbd, 0x07, 0xd9, 0x9e, 0xfa, 0x3f, 0x1e, 0xa5, 0x3e, 0xd6, 0x56,
+0x4a, 0x63, 0x16, 0x62, 0x21, 0x54, 0x85, 0x3c, 0xff, 0x1e, 0xda, 0xff, 0x5b, 0xe2, 0x91, 0xc9,
+0xeb, 0xb7, 0x39, 0xaf, 0x19, 0xb0, 0xb3, 0xba, 0xfb, 0xcd, 0xaa, 0xe7, 0xca, 0x04, 0xa5, 0x21,
+0x97, 0x3a, 0x59, 0x4c, 0x6b, 0x54, 0x91, 0x51, 0xaf, 0x44, 0xc3, 0x2f, 0xfc, 0x15, 0x2e, 0xfb,
+0x4f, 0xe2, 0x87, 0xce, 0xff, 0xc1, 0x8f, 0xbd, 0xd7, 0xc1, 0x99, 0xcd, 0x0f, 0xdf, 0x10, 0xf4,
+0xe0, 0x09, 0xa3, 0x1e, 0x4f, 0x30, 0xa5, 0x3c, 0xf9, 0x41, 0x21, 0x3f, 0x25, 0x34, 0xc5, 0x22,
+0x90, 0x0d, 0xe6, 0xf7, 0x0c, 0xe5, 0x67, 0xd7, 0xb5, 0xd0, 0xf7, 0xd0, 0x05, 0xd7, 0x1f, 0xe1,
+0x60, 0xed, 0x6a, 0xfa, 0x82, 0x07, 0xde, 0x13, 0x2f, 0x1f, 0x9d, 0x27, 0xc7, 0x2b, 0x43, 0x2a,
+0xa7, 0x22, 0x62, 0x16, 0x56, 0x07, 0xda, 0xf8, 0x66, 0xed, 0xbe, 0xe6, 0x2e, 0xe5, 0xb2, 0xe7,
+0x80, 0xec, 0xd0, 0xf1, 0xac, 0xf6, 0x0a, 0xfb, 0xc4, 0xff, 0x4e, 0x05, 0xba, 0x0b, 0xb6, 0x11,
+0xaa, 0x15, 0x52, 0x16, 0xec, 0x12, 0x96, 0x0c, 0x24, 0x05, 0xd0, 0xfe, 0x66, 0xfb, 0xc0, 0xfa,
+0x46, 0xfc, 0x5e, 0xfe, 0x28, 0xff, 0xfa, 0xfd, 0xc4, 0xfa, 0xda, 0xf6, 0x06, 0xf4, 0x5c, 0xf3,
+0x5e, 0xf5, 0x6a, 0xf9, 0x16, 0xfe, 0x72, 0x02, 0x9e, 0x05, 0xd6, 0x07, 0xe2, 0x09, 0x86, 0x0c,
+0xd8, 0x0f, 0xf6, 0x12, 0x72, 0x14, 0x38, 0x13, 0x80, 0x0e, 0x40, 0x06, 0x94, 0xfb, 0x1c, 0xf0,
+0x4c, 0xe6, 0xe5, 0xdf, 0x19, 0xde, 0x35, 0xe1, 0x54, 0xe8, 0x7a, 0xf2, 0xe4, 0xfd, 0x7e, 0x09,
+0x82, 0x14, 0x25, 0x1e, 0x63, 0x25, 0x41, 0x29, 0x9f, 0x28, 0x4f, 0x23, 0x2c, 0x19, 0x9c, 0x0a,
+0x2e, 0xf9, 0xde, 0xe6, 0xbd, 0xd6, 0x79, 0xcb, 0x3f, 0xc7, 0x53, 0xcb, 0xf7, 0xd6, 0x92, 0xe8,
+0x10, 0xfd, 0x92, 0x11, 0xbf, 0x23, 0xcf, 0x31, 0x8d, 0x3a, 0x27, 0x3d, 0x67, 0x39, 0x75, 0x2f,
+0xd1, 0x1f, 0x14, 0x0b, 0xea, 0xf2, 0x0d, 0xda, 0x59, 0xc4, 0xe9, 0xb5, 0xb9, 0xb1, 0x6d, 0xb9,
+0xef, 0xcb, 0xb2, 0xe5, 0x50, 0x02, 0x37, 0x1d, 0x89, 0x33, 0x29, 0x43, 0x53, 0x4b, 0xe7, 0x4b,
+0xe7, 0x44, 0xdd, 0x36, 0x05, 0x22, 0x4e, 0x07, 0xee, 0xe8, 0xbd, 0xca, 0x97, 0xb1, 0xb8, 0xa2,
+0xa0, 0xa1, 0xed, 0xae, 0x77, 0xc8, 0x16, 0xe9, 0x20, 0x0b, 0x9f, 0x29, 0x57, 0x41, 0x27, 0x51,
+0x68, 0x58, 0xec, 0x56, 0xc9, 0x4c, 0x31, 0x3a, 0xcf, 0x1f, 0x32, 0xff, 0x85, 0xdb, 0xc7, 0xb9,
+0x3c, 0xa0, 0xfe, 0x93, 0xb2, 0x97, 0xf2, 0xaa, 0xfd, 0xc9, 0xd8, 0xee, 0x84, 0x13, 0x53, 0x33,
+0xa3, 0x4b, 0x48, 0x5b, 0x70, 0x61, 0x98, 0x5d, 0xa7, 0x4f, 0x3b, 0x38, 0x6c, 0x18, 0x22, 0xf3,
+0xaf, 0xcc, 0x26, 0xab, 0x70, 0x94, 0xc6, 0x8c, 0x88, 0x95, 0x29, 0xad, 0x53, 0xcf, 0x18, 0xf6,
+0xa0, 0x1b, 0x81, 0x3b, 0x6b, 0x53, 0x04, 0x62, 0x00, 0x66, 0x98, 0x5e, 0x1b, 0x4c, 0xb5, 0x2f,
+0x14, 0x0c, 0x04, 0xe5, 0xad, 0xbf, 0xe8, 0xa1, 0x82, 0x90, 0xc4, 0x8d, 0x4c, 0x9a, 0xff, 0xb3,
+0xb3, 0xd6, 0x18, 0xfd, 0xe5, 0x21, 0x11, 0x41, 0x04, 0x58, 0x8c, 0x64, 0x00, 0x65, 0x4e, 0x59,
+0x61, 0x42, 0x09, 0x23, 0xbe, 0xfe, 0xbb, 0xd9, 0x2f, 0xb9, 0x3a, 0xa1, 0xcc, 0x94, 0x84, 0x95,
+0x78, 0xa3, 0xff, 0xbc, 0xc5, 0xde, 0xcc, 0x03, 0x31, 0x27, 0xa9, 0x44, 0xea, 0x58, 0x9a, 0x61,
+0x82, 0x5d, 0x73, 0x4d, 0x2b, 0x34, 0xbc, 0x14, 0xb0, 0xf3, 0x69, 0xd4, 0x63, 0xba, 0x56, 0xa8,
+0xe2, 0x9f, 0x18, 0xa2, 0x99, 0xaf, 0xab, 0xc7, 0x1a, 0xe7, 0xe0, 0x09, 0x4b, 0x2a, 0x35, 0x44,
+0x11, 0x54, 0xb2, 0x57, 0x7f, 0x4f, 0xb5, 0x3d, 0x35, 0x25, 0xd8, 0x09, 0xc0, 0xee, 0x47, 0xd6,
+0xcf, 0xc2, 0x37, 0xb5, 0xdb, 0xae, 0x5d, 0xb1, 0xcd, 0xbd, 0x71, 0xd3, 0x08, 0xf0, 0xaa, 0x0e,
+0x55, 0x2a, 0xc1, 0x3e, 0xbf, 0x48, 0xc7, 0x47, 0x73, 0x3d, 0x37, 0x2c, 0x9c, 0x17, 0x9a, 0x02,
+0xce, 0xee, 0xb9, 0xdd, 0xd9, 0xcf, 0xf5, 0xc5, 0x71, 0xc1, 0xc7, 0xc3, 0x27, 0xce, 0x6b, 0xe0,
+0x9a, 0xf7, 0xbe, 0x0f, 0x3b, 0x24, 0xa9, 0x31, 0x87, 0x36, 0x17, 0x33, 0x83, 0x29, 0x73, 0x1c,
+0x70, 0x0e, 0xc8, 0x00, 0x9e, 0xf4, 0xfe, 0xe9, 0x1b, 0xe1, 0x43, 0xda, 0x91, 0xd6, 0x9d, 0xd7,
+0x51, 0xde, 0x4e, 0xea, 0x9a, 0xf9, 0x42, 0x09, 0xd6, 0x15, 0x95, 0x1d, 0x73, 0x1f, 0xab, 0x1c,
+0x0e, 0x17, 0x14, 0x10, 0x4e, 0x09, 0x5c, 0x03, 0x50, 0xfe, 0xb4, 0xf9, 0x1e, 0xf5, 0xc0, 0xf0,
+0x4c, 0xed, 0x88, 0xeb, 0x54, 0xec, 0x1c, 0xf0, 0xf2, 0xf5, 0x7e, 0xfc, 0x44, 0x02, 0xfe, 0x05,
+0xe4, 0x07, 0x1a, 0x08, 0xa2, 0x07, 0x6a, 0x07, 0xe4, 0x07, 0x02, 0x09, 0x78, 0x0a, 0x74, 0x0b,
+0xb4, 0x0a, 0xd8, 0x07, 0x94, 0x02, 0xf8, 0xfb, 0x1a, 0xf5, 0x56, 0xef, 0xb2, 0xeb, 0x7c, 0xea,
+0x72, 0xeb, 0xc8, 0xed, 0x4c, 0xf1, 0x8e, 0xf5, 0xd8, 0xfa, 0x38, 0x01, 0xde, 0x08, 0x74, 0x11,
+0xfc, 0x19, 0x77, 0x20, 0xcf, 0x22, 0xa7, 0x1f, 0x60, 0x16, 0x76, 0x08, 0x44, 0xf8, 0x00, 0xe9,
+0x51, 0xdd, 0x69, 0xd6, 0x7b, 0xd4, 0xeb, 0xd6, 0xdb, 0xdc, 0x96, 0xe5, 0x10, 0xf1, 0x1e, 0xff,
+0xfa, 0x0e, 0x61, 0x1f, 0xe9, 0x2d, 0xbb, 0x37, 0xfb, 0x39, 0xd1, 0x32, 0xed, 0x22, 0xe0, 0x0c,
+0x82, 0xf4, 0x21, 0xde, 0x13, 0xcd, 0x3f, 0xc3, 0x83, 0xc0, 0xcd, 0xc3, 0xad, 0xcc, 0x85, 0xda,
+0xa2, 0xec, 0x30, 0x02, 0x8a, 0x19, 0x39, 0x30, 0xc9, 0x42, 0x71, 0x4d, 0x3f, 0x4d, 0x3d, 0x41,
+0xd5, 0x2a, 0xaa, 0x0d, 0xb8, 0xee, 0x9d, 0xd2, 0x87, 0xbd, 0x19, 0xb1, 0xd1, 0xad, 0x07, 0xb3,
+0x9f, 0xbf, 0xf3, 0xd2, 0x36, 0xec, 0x16, 0x09, 0x9d, 0x26, 0x81, 0x41, 0x26, 0x55, 0x4e, 0x5e,
+0x46, 0x5a, 0xfb, 0x48, 0x17, 0x2d, 0x12, 0x0b, 0xb2, 0xe7, 0x15, 0xc8, 0x51, 0xb0, 0x86, 0xa2,
+0xcc, 0x9f, 0x74, 0xa7, 0xfb, 0xb8, 0x4b, 0xd3, 0xa2, 0xf3, 0x42, 0x16, 0x2f, 0x37, 0x0d, 0x52,
+0x70, 0x63, 0x42, 0x68, 0x60, 0x5f, 0xef, 0x49, 0xe3, 0x2a, 0x04, 0x06, 0x63, 0xe0, 0xe7, 0xbe,
+0xd6, 0xa5, 0x6a, 0x98, 0x58, 0x97, 0xd2, 0xa2, 0x9d, 0xb9, 0x5d, 0xd9, 0x22, 0xfe, 0x4f, 0x23,
+0x03, 0x44, 0x6e, 0x5c, 0xfe, 0x69, 0xd8, 0x6a, 0xf4, 0x5e, 0x51, 0x47, 0xb1, 0x26, 0x76, 0x00,
+0x43, 0xd9, 0x57, 0xb6, 0xf6, 0x9c, 0xd6, 0x90, 0x62, 0x93, 0xe8, 0xa3, 0x29, 0xc0, 0x5e, 0xe4,
+0x0e, 0x0b, 0x33, 0x2f, 0xa1, 0x4c, 0xcc, 0x60, 0x3a, 0x6a, 0xda, 0x67, 0xb8, 0x59, 0x09, 0x41,
+0xa9, 0x1f, 0xca, 0xf8, 0x71, 0xd1, 0x41, 0xaf, 0x26, 0x98, 0xec, 0x8f, 0x52, 0x97, 0xd9, 0xac,
+0xa7, 0xcc, 0x5a, 0xf1, 0xca, 0x15, 0x75, 0x35, 0x97, 0x4d, 0x1c, 0x5d, 0x28, 0x63, 0xfe, 0x5e,
+0x77, 0x50, 0xc9, 0x37, 0xb4, 0x16, 0xa2, 0xf0, 0xd7, 0xca, 0xdb, 0xab, 0x70, 0x99, 0x7c, 0x96,
+0x9e, 0xa2, 0xdf, 0xba, 0x87, 0xda, 0x6a, 0xfc, 0xec, 0x1b, 0xe3, 0x35, 0xf3, 0x48, 0x87, 0x54,
+0x1c, 0x58, 0xa7, 0x52, 0xd7, 0x43, 0xdb, 0x2b, 0x64, 0x0c, 0x44, 0xe9, 0x09, 0xc8, 0x0b, 0xaf,
+0xb8, 0xa2, 0xaa, 0xa4, 0x33, 0xb3, 0xf3, 0xca, 0x0c, 0xe7, 0x60, 0x03, 0x9f, 0x1c, 0xe3, 0x30,
+0x7b, 0x3f, 0xab, 0x47, 0xff, 0x48, 0xc5, 0x42, 0x8d, 0x34, 0xab, 0x1e, 0x6e, 0x03, 0x38, 0xe6,
+0x2f, 0xcc, 0x1f, 0xba, 0x05, 0xb3, 0x69, 0xb7, 0x57, 0xc5, 0x57, 0xd9, 0xf8, 0xef, 0x22, 0x06,
+0x6c, 0x19, 0x89, 0x28, 0xc5, 0x32, 0x8f, 0x37, 0xad, 0x36, 0xd7, 0x2f, 0x5d, 0x23, 0x2c, 0x12,
+0xd4, 0xfd, 0x5c, 0xe9, 0xf5, 0xd7, 0xd9, 0xcc, 0x6d, 0xc9, 0xc9, 0xcd, 0x4d, 0xd8, 0xdc, 0xe6,
+0xcc, 0xf6, 0xea, 0x05, 0xba, 0x12, 0xe6, 0x1b, 0x53, 0x21, 0x8d, 0x22, 0x7b, 0x20, 0x76, 0x1b,
+0xec, 0x13, 0x4e, 0x0a, 0x62, 0xff, 0x38, 0xf4, 0x5a, 0xea, 0xb1, 0xe3, 0xeb, 0xe0, 0xf1, 0xe2,
+0xbc, 0xe8, 0xda, 0xf0, 0x00, 0xfa, 0x58, 0x02, 0x7a, 0x08, 0xe2, 0x0b, 0xb4, 0x0c, 0xbc, 0x0b,
+0x86, 0x0a, 0x8a, 0x09, 0x06, 0x09, 0x96, 0x08, 0xf4, 0x06, 0xca, 0x03, 0x88, 0xff, 0x20, 0xfb,
+0xe0, 0xf7, 0x92, 0xf6, 0x26, 0xf7, 0xe2, 0xf8, 0x96, 0xfa, 0xf0, 0xfa, 0xd8, 0xf9, 0x74, 0xf7,
+0x24, 0xf5, 0x98, 0xf4, 0xf8, 0xf6, 0xd2, 0xfc, 0xfa, 0x04, 0x80, 0x0d, 0x1e, 0x14, 0x46, 0x17,
+0x68, 0x16, 0x9a, 0x12, 0x54, 0x0d, 0xcc, 0x07, 0x6e, 0x02, 0xb2, 0xfc, 0x24, 0xf6, 0x86, 0xee,
+0x78, 0xe6, 0xcd, 0xdf, 0xa7, 0xdc, 0x0d, 0xdf, 0x8c, 0xe7, 0x4e, 0xf5, 0xe8, 0x05, 0x64, 0x16,
+0x59, 0x23, 0xbb, 0x2a, 0x21, 0x2c, 0x3b, 0x28, 0x9d, 0x20, 0x2c, 0x16, 0xc6, 0x09, 0x9a, 0xfb,
+0x7c, 0xec, 0x67, 0xdd, 0xe3, 0xd0, 0x1d, 0xc9, 0x69, 0xc8, 0xcd, 0xcf, 0xff, 0xde, 0x06, 0xf4,
+0x88, 0x0b, 0xdf, 0x21, 0x8b, 0x33, 0x3b, 0x3e, 0x89, 0x40, 0x6f, 0x3b, 0xc9, 0x2f, 0x01, 0x1f,
+0x68, 0x0a, 0xb0, 0xf3, 0x1d, 0xdd, 0x87, 0xc9, 0x89, 0xbb, 0x71, 0xb5, 0xdd, 0xb8, 0xbb, 0xc5,
+0x9f, 0xda, 0x56, 0xf5, 0x30, 0x12, 0x71, 0x2d, 0xff, 0x42, 0xd3, 0x4f, 0x5f, 0x52, 0x81, 0x4a,
+0x79, 0x39, 0x43, 0x21, 0xf2, 0x04, 0x68, 0xe7, 0x97, 0xcc, 0x77, 0xb7, 0xf8, 0xaa, 0x7e, 0xa8,
+0x39, 0xb0, 0xc1, 0xc1, 0x59, 0xdb, 0x76, 0xfa, 0x58, 0x1b, 0xff, 0x39, 0x09, 0x52, 0xc4, 0x5f,
+0xd4, 0x60, 0xa1, 0x54, 0x45, 0x3d, 0xf9, 0x1d, 0x30, 0xfb, 0x71, 0xd9, 0x25, 0xbd, 0x9e, 0xa9,
+0x22, 0xa0, 0x68, 0xa1, 0xd5, 0xac, 0xd9, 0xc1, 0xd9, 0xde, 0x5c, 0x01, 0x91, 0x25, 0xdb, 0x46,
+0x22, 0x60, 0x4e, 0x6c, 0x26, 0x69, 0xc4, 0x56, 0x95, 0x38, 0xd6, 0x13, 0x12, 0xee, 0x71, 0xcc,
+0x63, 0xb2, 0x1a, 0xa2, 0x0a, 0x9c, 0x3c, 0xa0, 0x45, 0xae, 0xcf, 0xc5, 0x6e, 0xe5, 0x52, 0x0a,
+0x5f, 0x30, 0xd3, 0x51, 0x26, 0x69, 0xd2, 0x71, 0x96, 0x69, 0x37, 0x52, 0x71, 0x30, 0x12, 0x0a,
+0xca, 0xe4, 0x09, 0xc5, 0x8f, 0xad, 0xe8, 0x9f, 0x8e, 0x9c, 0x28, 0xa3, 0xe1, 0xb3, 0x11, 0xce,
+0xd2, 0xef, 0xae, 0x15, 0xb1, 0x3a, 0x54, 0x59, 0x14, 0x6c, 0x22, 0x6f, 0xfc, 0x61, 0x75, 0x47,
+0xd1, 0x24, 0xe2, 0xff, 0x87, 0xdd, 0x45, 0xc1, 0x81, 0xad, 0x4a, 0xa3, 0xb6, 0xa2, 0x21, 0xac,
+0xf3, 0xbe, 0x7f, 0xda, 0x20, 0xfc, 0xe9, 0x1f, 0xa9, 0x40, 0x84, 0x59, 0x6a, 0x66, 0xe2, 0x64,
+0x92, 0x55, 0x81, 0x3b, 0x86, 0x1b, 0x54, 0xfa, 0x01, 0xdc, 0x6f, 0xc3, 0xbf, 0xb2, 0x53, 0xab,
+0x77, 0xad, 0x1f, 0xb9, 0xa3, 0xcd, 0xd8, 0xe8, 0xca, 0x07, 0x65, 0x26, 0xd5, 0x40, 0x1f, 0x53,
+0xc2, 0x5a, 0x78, 0x56, 0x25, 0x47, 0x8d, 0x2f, 0x16, 0x13, 0x00, 0xf6, 0xa1, 0xdb, 0x59, 0xc7,
+0xcf, 0xba, 0x49, 0xb7, 0xe3, 0xbc, 0xbf, 0xca, 0xd3, 0xde, 0x8a, 0xf6, 0x1a, 0x0f, 0x8b, 0x25,
+0xdb, 0x37, 0xe7, 0x43, 0x09, 0x48, 0x95, 0x43, 0x97, 0x36, 0xc7, 0x22, 0x48, 0x0b, 0x88, 0xf3,
+0xc5, 0xde, 0xcb, 0xcf, 0x65, 0xc8, 0x01, 0xc9, 0xff, 0xd0, 0x3f, 0xde, 0xa2, 0xee, 0xb0, 0xff,
+0xc0, 0x0f, 0xd1, 0x1d, 0xeb, 0x28, 0x77, 0x30, 0x25, 0x33, 0xfb, 0x2f, 0x95, 0x26, 0x26, 0x18,
+0x8e, 0x06, 0x3e, 0xf5, 0x30, 0xe7, 0x59, 0xde, 0xdd, 0xdb, 0x01, 0xdf, 0x56, 0xe6, 0x92, 0xef,
+0xd4, 0xf8, 0xf6, 0x00, 0x0a, 0x08, 0x8a, 0x0e, 0xa8, 0x14, 0xf4, 0x19, 0x2f, 0x1d, 0x25, 0x1d,
+0x9a, 0x18, 0x2a, 0x10, 0xc0, 0x05, 0xbc, 0xfb, 0x92, 0xf4, 0x60, 0xf1, 0xf8, 0xf1, 0x2c, 0xf5,
+0x40, 0xf9, 0x3e, 0xfc, 0x6e, 0xfd, 0x2c, 0xfd, 0x8e, 0xfc, 0xfa, 0xfc, 0x24, 0xff, 0xfc, 0x02,
+0x3c, 0x07, 0x86, 0x0a, 0xb0, 0x0b, 0xb2, 0x0a, 0xba, 0x08, 0x4e, 0x07, 0x46, 0x07, 0x8e, 0x08,
+0x46, 0x0a, 0xce, 0x0a, 0xf8, 0x08, 0x52, 0x04, 0x36, 0xfd, 0x18, 0xf5, 0xc6, 0xed, 0x1c, 0xe9,
+0x26, 0xe8, 0x5a, 0xeb, 0xd0, 0xf1, 0xfa, 0xf9, 0x9a, 0x02, 0xba, 0x0a, 0x2a, 0x12, 0x94, 0x18,
+0xb7, 0x1d, 0x83, 0x20, 0x47, 0x20, 0x2e, 0x1c, 0xee, 0x13, 0x16, 0x08, 0xb2, 0xf9, 0xbe, 0xea,
+0x37, 0xdd, 0xeb, 0xd3, 0xb9, 0xd0, 0x8f, 0xd4, 0xeb, 0xde, 0x18, 0xee, 0x92, 0xff, 0x12, 0x11,
+0xa5, 0x20, 0x8b, 0x2c, 0xe1, 0x33, 0xcf, 0x35, 0xf9, 0x31, 0x99, 0x28, 0x2c, 0x1a, 0xa6, 0x07,
+0xb8, 0xf2, 0x83, 0xdd, 0x1f, 0xcb, 0xb7, 0xbe, 0x3b, 0xbb, 0x33, 0xc2, 0xb1, 0xd2, 0x02, 0xea,
+0x4c, 0x04, 0x57, 0x1d, 0xf1, 0x31, 0x29, 0x40, 0xef, 0x46, 0x59, 0x46, 0xbd, 0x3e, 0x5b, 0x30,
+0x67, 0x1c, 0x06, 0x04, 0x1a, 0xe9, 0xaf, 0xce, 0x7d, 0xb8, 0x08, 0xab, 0x9a, 0xa9, 0x85, 0xb5,
+0x13, 0xcd, 0x38, 0xec, 0x30, 0x0d, 0x07, 0x2b, 0xfb, 0x41, 0x3b, 0x50, 0x9e, 0x55, 0x05, 0x52,
+0x6d, 0x46, 0x97, 0x33, 0x80, 0x1a, 0xa8, 0xfc, 0xb9, 0xdc, 0x6d, 0xbe, 0xe8, 0xa6, 0xf2, 0x9a,
+0xd0, 0x9d, 0x17, 0xb0, 0x83, 0xce, 0x74, 0xf3, 0x7a, 0x18, 0x2d, 0x38, 0x45, 0x4f, 0x66, 0x5c,
+0x48, 0x5f, 0xd4, 0x58, 0x73, 0x49, 0x43, 0x32, 0x84, 0x14, 0x36, 0xf2, 0xd3, 0xce, 0x63, 0xaf,
+0x72, 0x99, 0x76, 0x91, 0xe2, 0x99, 0x65, 0xb1, 0x37, 0xd4, 0xf6, 0xfb, 0x21, 0x22, 0xb1, 0x41,
+0xb8, 0x57, 0x5a, 0x63, 0x04, 0x64, 0x58, 0x5a, 0x2b, 0x47, 0xcf, 0x2b, 0xf2, 0x09, 0xc2, 0xe4,
+0xe9, 0xc0, 0xb6, 0xa3, 0x62, 0x92, 0xc2, 0x8f, 0xe0, 0x9c, 0xdf, 0xb7, 0x47, 0xdc, 0x10, 0x04,
+0x39, 0x29, 0xa3, 0x47, 0x3e, 0x5c, 0xea, 0x65, 0xf4, 0x63, 0xcc, 0x56, 0xa3, 0x3f, 0x91, 0x20,
+0x98, 0xfc, 0xcb, 0xd7, 0x3b, 0xb7, 0x5a, 0x9f, 0xb4, 0x93, 0xd4, 0x95, 0x96, 0xa5, 0x07, 0xc1,
+0x3c, 0xe4, 0x22, 0x0a, 0x57, 0x2d, 0xc9, 0x49, 0x8e, 0x5c, 0xc6, 0x63, 0xa0, 0x5e, 0xdd, 0x4d,
+0x9f, 0x33, 0x34, 0x13, 0x84, 0xf0, 0x9f, 0xcf, 0xeb, 0xb4, 0x56, 0xa3, 0x6c, 0x9c, 0xf6, 0xa0,
+0xd3, 0xb0, 0xb1, 0xca, 0x8e, 0xeb, 0xcc, 0x0e, 0x77, 0x2f, 0x6d, 0x49, 0xf8, 0x58, 0x44, 0x5c,
+0x1b, 0x53, 0x67, 0x3f, 0x5d, 0x24, 0xda, 0x05, 0xe8, 0xe7, 0x0b, 0xce, 0x6d, 0xba, 0x6d, 0xae,
+0xe8, 0xaa, 0x0d, 0xb0, 0x7d, 0xbe, 0x5b, 0xd5, 0x58, 0xf2, 0xaa, 0x11, 0x75, 0x2e, 0xef, 0x43,
+0x0d, 0x4f, 0x51, 0x4e, 0x9d, 0x42, 0xcd, 0x2e, 0x96, 0x16, 0xe6, 0xfd, 0x6c, 0xe7, 0xe5, 0xd4,
+0x4f, 0xc7, 0x05, 0xbf, 0x71, 0xbc, 0xab, 0xc0, 0x53, 0xcc, 0x79, 0xdf, 0x2c, 0xf8, 0x46, 0x12,
+0x59, 0x29, 0x45, 0x39, 0x73, 0x3f, 0xc5, 0x3b, 0x03, 0x30, 0x3d, 0x1f, 0xcc, 0x0c, 0x08, 0xfb,
+0xda, 0xeb, 0xf3, 0xdf, 0x1f, 0xd7, 0x8f, 0xd1, 0xeb, 0xcf, 0xf7, 0xd2, 0xcd, 0xdb, 0xfe, 0xe9,
+0xd2, 0xfb, 0x3c, 0x0e, 0x6f, 0x1d, 0xad, 0x26, 0xeb, 0x28, 0xcf, 0x24, 0x53, 0x1c, 0xbc, 0x11,
+0xee, 0x06, 0xc0, 0xfd, 0x3a, 0xf6, 0x3a, 0xf0, 0x8e, 0xeb, 0x14, 0xe8, 0x22, 0xe6, 0x5e, 0xe6,
+0xa0, 0xe9, 0x26, 0xf0, 0x30, 0xf9, 0x98, 0x02, 0xbe, 0x0a, 0xd6, 0x0f, 0x94, 0x11, 0x7e, 0x10,
+0x9c, 0x0d, 0x22, 0x0a, 0x0a, 0x07, 0xda, 0x04, 0x7e, 0x03, 0xb4, 0x02, 0x6e, 0x01, 0x18, 0xff,
+0x62, 0xfb, 0xf6, 0xf6, 0xba, 0xf2, 0xde, 0xef, 0x48, 0xef, 0xea, 0xf0, 0x0c, 0xf4, 0x8a, 0xf7,
+0xf6, 0xfa, 0x38, 0xfe, 0x94, 0x01, 0x42, 0x05, 0x98, 0x09, 0xc8, 0x0e, 0x08, 0x14, 0xf2, 0x17,
+0xfc, 0x18, 0x1e, 0x16, 0x90, 0x0e, 0x2e, 0x03, 0x0a, 0xf6, 0xb6, 0xe9, 0xcb, 0xe0, 0x3d, 0xdc,
+0x03, 0xdc, 0x8f, 0xdf, 0xf8, 0xe5, 0x26, 0xee, 0xf4, 0xf7, 0x04, 0x03, 0x20, 0x0f, 0x84, 0x1b,
+0xa1, 0x26, 0x83, 0x2e, 0x87, 0x30, 0xe7, 0x2a, 0x87, 0x1d, 0xec, 0x09, 0x60, 0xf3, 0x73, 0xde,
+0x85, 0xce, 0xf3, 0xc5, 0xfb, 0xc4, 0x55, 0xca, 0xcb, 0xd4, 0xfb, 0xe2, 0x90, 0xf3, 0x06, 0x06,
+0x40, 0x19, 0xa5, 0x2b, 0xd3, 0x3a, 0xbd, 0x43, 0xf1, 0x43, 0xc1, 0x39, 0x6f, 0x25, 0x16, 0x0a,
+0x70, 0xec, 0x77, 0xd1, 0xd9, 0xbd, 0x4d, 0xb3, 0x33, 0xb2, 0x87, 0xb9, 0xa5, 0xc7, 0x09, 0xdb,
+0x56, 0xf2, 0x04, 0x0c, 0x15, 0x26, 0xab, 0x3d, 0xf7, 0x4e, 0x0e, 0x57, 0x0f, 0x53, 0xbb, 0x42,
+0xe3, 0x27, 0x9a, 0x06, 0x14, 0xe4, 0xdb, 0xc5, 0x01, 0xb0, 0xca, 0xa4, 0x6a, 0xa4, 0xd1, 0xad,
+0x13, 0xc0, 0x35, 0xd9, 0x34, 0xf7, 0x14, 0x17, 0x91, 0x35, 0xd1, 0x4e, 0x12, 0x5f, 0x20, 0x63,
+0xf2, 0x59, 0x83, 0x44, 0x51, 0x25, 0xb2, 0x00, 0xbd, 0xdb, 0xc3, 0xbb, 0xdc, 0xa4, 0x98, 0x99,
+0x98, 0x9a, 0x92, 0xa7, 0xd7, 0xbe, 0xe3, 0xdd, 0x4c, 0x01, 0xe7, 0x24, 0x5b, 0x44, 0xdc, 0x5b,
+0x50, 0x68, 0xf4, 0x67, 0xb8, 0x5a, 0x11, 0x42, 0xdd, 0x20, 0xca, 0xfa, 0x65, 0xd4, 0x09, 0xb3,
+0x8a, 0x9b, 0x06, 0x91, 0xf2, 0x94, 0x6a, 0xa6, 0x2d, 0xc3, 0x8c, 0xe7, 0x68, 0x0e, 0x8b, 0x32,
+0xdb, 0x4f, 0x4c, 0x63, 0xf2, 0x6a, 0x52, 0x66, 0xf0, 0x55, 0xb9, 0x3b, 0xd0, 0x19, 0x6a, 0xf3,
+0x17, 0xcd, 0x4b, 0xac, 0x64, 0x96, 0xf2, 0x8e, 0xfc, 0x96, 0x31, 0xad, 0x31, 0xce, 0x6e, 0xf4,
+0x84, 0x1a, 0x87, 0x3b, 0x0f, 0x54, 0x84, 0x62, 0x22, 0x66, 0xd6, 0x5e, 0x95, 0x4d, 0x7b, 0x33,
+0x44, 0x12, 0x02, 0xed, 0x1b, 0xc8, 0x88, 0xa9, 0xd6, 0x96, 0x76, 0x93, 0xd0, 0x9f, 0x8d, 0xb9,
+0xb7, 0xdb, 0xba, 0x00, 0xd3, 0x22, 0x31, 0x3e, 0x35, 0x51, 0xe0, 0x5a, 0x64, 0x5b, 0xa1, 0x52,
+0x61, 0x41, 0x5d, 0x28, 0x2e, 0x09, 0x5c, 0xe6, 0x23, 0xc5, 0x53, 0xab, 0xae, 0x9d, 0x20, 0x9f,
+0x77, 0xae, 0xf5, 0xc8, 0x04, 0xe9, 0x20, 0x09, 0xe7, 0x24, 0x41, 0x3a, 0x23, 0x48, 0x69, 0x4e,
+0x17, 0x4d, 0x19, 0x44, 0x01, 0x34, 0xfb, 0x1c, 0xf0, 0x00, 0xcf, 0xe2, 0x61, 0xc7, 0xbd, 0xb3,
+0xa7, 0xab, 0x63, 0xb0, 0xbf, 0xc0, 0xb7, 0xd8, 0xa6, 0xf3, 0x54, 0x0d, 0x67, 0x22, 0xc9, 0x31,
+0x19, 0x3b, 0x37, 0x3e, 0x3b, 0x3b, 0x5d, 0x32, 0xd5, 0x23, 0xc0, 0x10, 0x72, 0xfa, 0xc0, 0xe3,
+0x69, 0xd0, 0xc7, 0xc3, 0x3f, 0xc0, 0xf7, 0xc5, 0x81, 0xd3, 0x02, 0xe6, 0xc0, 0xf9, 0xac, 0x0b,
+0x1a, 0x1a, 0x13, 0x24, 0x7f, 0x29, 0x51, 0x2a, 0xb9, 0x26, 0x73, 0x1f, 0x2a, 0x15, 0x3c, 0x08,
+0x3a, 0xfa, 0x6c, 0xec, 0xed, 0xe0, 0x7b, 0xd9, 0x53, 0xd7, 0x03, 0xdb, 0xab, 0xe3, 0x5c, 0xef,
+0xbe, 0xfb, 0xf4, 0x06, 0x66, 0x0f, 0xb2, 0x14, 0x7e, 0x16, 0x7a, 0x15, 0x6e, 0x12, 0x2c, 0x0e,
+0xb6, 0x09, 0x28, 0x05, 0x60, 0x00, 0x3a, 0xfb, 0xf2, 0xf5, 0x46, 0xf1, 0xa4, 0xee, 0x90, 0xee,
+0x50, 0xf1, 0xfc, 0xf5, 0xf8, 0xfa, 0xd4, 0xfe, 0xa4, 0x00, 0x66, 0x00, 0xee, 0xfe, 0x90, 0xfd,
+0x76, 0xfd, 0xae, 0xff, 0xec, 0x03, 0x2a, 0x09, 0x60, 0x0d, 0xfc, 0x0e, 0x86, 0x0d, 0x88, 0x09,
+0x98, 0x04, 0xf0, 0xff, 0x5c, 0xfc, 0x78, 0xf9, 0x9e, 0xf6, 0xd2, 0xf2, 0x3e, 0xee, 0xd4, 0xe9,
+0x2a, 0xe7, 0x2c, 0xe8, 0x9a, 0xed, 0xaa, 0xf7, 0xb0, 0x04, 0x60, 0x12, 0x85, 0x1d, 0xc9, 0x23,
+0x4b, 0x24, 0xc3, 0x1f, 0xca, 0x17, 0xf6, 0x0d, 0x6e, 0x03, 0x68, 0xf8, 0x3e, 0xed, 0x31, 0xe2,
+0x87, 0xd8, 0x51, 0xd2, 0x75, 0xd1, 0x45, 0xd7, 0xee, 0xe3, 0xea, 0xf5, 0xc0, 0x0a, 0xef, 0x1e,
+0xeb, 0x2e, 0x11, 0x38, 0x55, 0x39, 0x4b, 0x33, 0xa7, 0x27, 0x0c, 0x18, 0xca, 0x05, 0x60, 0xf2,
+0x2f, 0xdf, 0x7d, 0xce, 0x73, 0xc2, 0x41, 0xbd, 0xb1, 0xc0, 0xdf, 0xcc, 0x85, 0xe0, 0x50, 0xf9,
+0xd8, 0x13, 0x6d, 0x2c, 0x71, 0x3f, 0xff, 0x49, 0xeb, 0x4a, 0x99, 0x42, 0x1f, 0x32, 0x88, 0x1b,
+0x5e, 0x01, 0x2e, 0xe6, 0x89, 0xcd, 0x43, 0xba, 0x47, 0xaf, 0x19, 0xae, 0xe1, 0xb6, 0xd3, 0xc8,
+0xcd, 0xe1, 0x22, 0xff, 0x47, 0x1d, 0xd9, 0x38, 0xed, 0x4d, 0xac, 0x59, 0xba, 0x59, 0xc5, 0x4d,
+0x91, 0x37, 0xaa, 0x19, 0x30, 0xf8, 0x89, 0xd7, 0x3b, 0xbc, 0xe8, 0xa9, 0x4c, 0xa2, 0x98, 0xa5,
+0xef, 0xb2, 0x15, 0xc9, 0xac, 0xe5, 0x0a, 0x06, 0xd3, 0x26, 0x73, 0x44, 0xe2, 0x5a, 0xea, 0x65,
+0xf4, 0x62, 0xb5, 0x51, 0xdf, 0x34, 0xd2, 0x10, 0xe2, 0xea, 0xc5, 0xc8, 0xff, 0xae, 0x2c, 0xa0,
+0x98, 0x9c, 0xae, 0xa3, 0x33, 0xb4, 0xe9, 0xcc, 0xac, 0xeb, 0xe6, 0x0d, 0x69, 0x30, 0x29, 0x4f,
+0x32, 0x65, 0xc8, 0x6d, 0x66, 0x66, 0x99, 0x4f, 0x8f, 0x2d, 0x0a, 0x06, 0x51, 0xdf, 0x9f, 0xbe,
+0xf0, 0xa7, 0x98, 0x9c, 0x3a, 0x9c, 0xe6, 0xa5, 0x6b, 0xb8, 0xeb, 0xd2, 0x64, 0xf3, 0x1a, 0x17,
+0x21, 0x3a, 0xc2, 0x57, 0xa8, 0x6a, 0x70, 0x6e, 0xb2, 0x61, 0x59, 0x46, 0xed, 0x21, 0x80, 0xfa,
+0x07, 0xd6, 0x13, 0xb9, 0x76, 0xa6, 0xc8, 0x9e, 0x52, 0xa1, 0x49, 0xad, 0xd9, 0xc1, 0xeb, 0xdd,
+0x1e, 0xff, 0x33, 0x22, 0xa9, 0x42, 0xc2, 0x5b, 0xf6, 0x68, 0x1c, 0x67, 0x58, 0x56, 0xd1, 0x39,
+0xc4, 0x16, 0xbe, 0xf2, 0xcd, 0xd2, 0x2f, 0xba, 0x3a, 0xab, 0x66, 0xa6, 0xee, 0xaa, 0x45, 0xb8,
+0xdd, 0xcd, 0xea, 0xe9, 0x72, 0x09, 0xcd, 0x28, 0x01, 0x44, 0xf8, 0x56, 0x84, 0x5e, 0x32, 0x59,
+0xdd, 0x47, 0x8b, 0x2d, 0x48, 0x0e, 0xfa, 0xee, 0x7b, 0xd3, 0x0d, 0xbf, 0x4f, 0xb3, 0x39, 0xb1,
+0x57, 0xb8, 0x91, 0xc7, 0x8b, 0xdd, 0x8c, 0xf7, 0xa6, 0x12, 0x47, 0x2b, 0xc1, 0x3e, 0x83, 0x4a,
+0x63, 0x4d, 0xf9, 0x46, 0x81, 0x37, 0x85, 0x21, 0xee, 0x07, 0x7c, 0xee, 0x99, 0xd8, 0x15, 0xc9,
+0x5f, 0xc1, 0x39, 0xc2, 0x13, 0xcb, 0xf9, 0xd9, 0x48, 0xed, 0x08, 0x02, 0x8a, 0x15, 0xed, 0x25,
+0xd5, 0x31, 0xaf, 0x38, 0xc7, 0x39, 0x87, 0x34, 0xeb, 0x28, 0x42, 0x18, 0xa8, 0x04, 0x2e, 0xf1,
+0xf7, 0xe0, 0x61, 0xd6, 0xf7, 0xd2, 0x27, 0xd6, 0xed, 0xde, 0x66, 0xeb, 0xda, 0xf8, 0x7e, 0x05,
+0x06, 0x10, 0x26, 0x18, 0x29, 0x1e, 0x41, 0x22, 0xb5, 0x23, 0xc7, 0x21, 0x88, 0x1b, 0xf0, 0x10,
+0x00, 0x04, 0x22, 0xf7, 0x38, 0xed, 0x02, 0xe8, 0xfa, 0xe7, 0x3a, 0xec, 0xba, 0xf2, 0x56, 0xf9,
+0xbe, 0xfe, 0x62, 0x02, 0x94, 0x04, 0x72, 0x06, 0xe2, 0x08, 0x3e, 0x0c, 0x9e, 0x0f, 0x56, 0x11,
+0x60, 0x10, 0x9a, 0x0c, 0x14, 0x07, 0xf0, 0x01, 0xd4, 0xfe, 0x46, 0xfe, 0xd6, 0xff, 0xe6, 0x01,
+0xc4, 0x02, 0xc4, 0x01, 0x92, 0xfe, 0xd0, 0xf9, 0x02, 0xf5, 0x10, 0xf2, 0xe8, 0xf1, 0xfa, 0xf4,
+0x70, 0xfa, 0xaa, 0x00, 0x8e, 0x06, 0x52, 0x0b, 0x26, 0x0f, 0x44, 0x12, 0x0c, 0x15, 0xe0, 0x16,
+0x0a, 0x17, 0x50, 0x14, 0x48, 0x0e, 0x44, 0x05, 0x1a, 0xfa, 0x8e, 0xee, 0x3e, 0xe4, 0x5d, 0xdd,
+0x6b, 0xdb, 0x2f, 0xdf, 0xf6, 0xe7, 0x8c, 0xf4, 0xd0, 0x02, 0x00, 0x11, 0x79, 0x1d, 0xc1, 0x26,
+0x3f, 0x2c, 0x3f, 0x2d, 0x41, 0x29, 0x89, 0x20, 0xb6, 0x13, 0xae, 0x03, 0x0a, 0xf2, 0x97, 0xe0,
+0xb7, 0xd1, 0x1d, 0xc8, 0xdb, 0xc5, 0x0b, 0xcc, 0x75, 0xda, 0xfe, 0xee, 0x88, 0x06, 0x3d, 0x1d,
+0xf5, 0x2f, 0x6d, 0x3c, 0x83, 0x41, 0x45, 0x3f, 0x7f, 0x36, 0x25, 0x28, 0x6e, 0x15, 0xb4, 0xff,
+0x8e, 0xe8, 0x93, 0xd2, 0x4b, 0xc0, 0x01, 0xb5, 0xa5, 0xb3, 0xf5, 0xbd, 0xff, 0xd2, 0xe2, 0xef,
+0x6a, 0x0f, 0x43, 0x2c, 0x59, 0x42, 0x01, 0x4f, 0xdd, 0x51, 0xad, 0x4b, 0x71, 0x3e, 0x31, 0x2b,
+0xbc, 0x13, 0x28, 0xf9, 0x77, 0xdd, 0x6b, 0xc3, 0xe7, 0xae, 0xec, 0xa3, 0xac, 0xa5, 0xd3, 0xb5,
+0x3f, 0xd2, 0x38, 0xf6, 0x1c, 0x1b, 0xe1, 0x3a, 0x49, 0x51, 0xa4, 0x5c, 0xfa, 0x5c, 0x9b, 0x53,
+0x7d, 0x42, 0x47, 0x2b, 0x30, 0x0f, 0xe4, 0xef, 0x43, 0xd0, 0x17, 0xb4, 0xe4, 0x9f, 0x06, 0x98,
+0x38, 0x9f, 0xb3, 0xb5, 0x3b, 0xd8, 0x62, 0x00, 0x43, 0x27, 0xed, 0x46, 0x0c, 0x5c, 0x84, 0x65,
+0x58, 0x63, 0xf0, 0x56, 0x1f, 0x42, 0x8d, 0x26, 0xd4, 0x05, 0xc9, 0xe2, 0x37, 0xc1, 0x04, 0xa6,
+0x9c, 0x95, 0x56, 0x93, 0xb8, 0xa0, 0x41, 0xbc, 0xb9, 0xe1, 0x7a, 0x0a, 0x3d, 0x30, 0x2d, 0x4e,
+0x7a, 0x61, 0xa2, 0x68, 0x12, 0x64, 0xf2, 0x54, 0xb1, 0x3c, 0xc1, 0x1d, 0x4a, 0xfa, 0x09, 0xd6,
+0xed, 0xb5, 0xce, 0x9e, 0xac, 0x93, 0xda, 0x96, 0x16, 0xa8, 0x49, 0xc5, 0x24, 0xea, 0x0a, 0x11,
+0x9f, 0x34, 0x87, 0x50, 0xe8, 0x61, 0x1c, 0x67, 0x08, 0x60, 0xed, 0x4d, 0xd7, 0x32, 0x6e, 0x11,
+0xb6, 0xed, 0xfd, 0xcb, 0xb5, 0xb0, 0x4c, 0x9f, 0xe8, 0x99, 0xc0, 0xa0, 0x4d, 0xb3, 0x6f, 0xcf,
+0xbc, 0xf1, 0x9a, 0x15, 0x43, 0x36, 0x79, 0x4f, 0x0a, 0x5e, 0x84, 0x60, 0x64, 0x56, 0xab, 0x41,
+0x05, 0x25, 0x76, 0x04, 0xf0, 0xe3, 0xaf, 0xc7, 0x01, 0xb3, 0xd0, 0xa7, 0x94, 0xa6, 0xdb, 0xae,
+0x71, 0xc0, 0xaf, 0xd9, 0x08, 0xf8, 0xb0, 0x17, 0x77, 0x34, 0xdb, 0x49, 0xe4, 0x54, 0xdb, 0x53,
+0x4f, 0x47, 0xab, 0x31, 0x9a, 0x16, 0x00, 0xfa, 0xf1, 0xdf, 0x2d, 0xcb, 0x65, 0xbd, 0xcd, 0xb6,
+0x61, 0xb7, 0x1d, 0xbf, 0x93, 0xcd, 0xad, 0xe2, 0x26, 0xfc, 0x12, 0x17, 0x17, 0x2f, 0x45, 0x40,
+0x25, 0x47, 0x47, 0x43, 0xed, 0x35, 0xf1, 0x21, 0x5e, 0x0b, 0x8c, 0xf5, 0x71, 0xe3, 0xd1, 0xd5,
+0x6d, 0xcd, 0xb3, 0xc9, 0x99, 0xca, 0x4f, 0xd0, 0x39, 0xdb, 0x32, 0xeb, 0xca, 0xfe, 0x52, 0x13,
+0xdb, 0x24, 0x2b, 0x30, 0x39, 0x33, 0xe9, 0x2d, 0x4b, 0x22, 0x58, 0x13, 0x40, 0x04, 0x30, 0xf7,
+0x46, 0xed, 0x80, 0xe6, 0x63, 0xe2, 0x85, 0xe0, 0xa3, 0xe0, 0x5d, 0xe3, 0xe0, 0xe8, 0xc6, 0xf1,
+0x28, 0xfd, 0x22, 0x09, 0x62, 0x13, 0xa2, 0x19, 0xda, 0x1a, 0x7a, 0x17, 0x68, 0x11, 0x3e, 0x0a,
+0xe2, 0x03, 0x1c, 0xff, 0xfc, 0xfb, 0xf0, 0xf9, 0x4a, 0xf8, 0x98, 0xf6, 0x92, 0xf4, 0xb2, 0xf2,
+0x90, 0xf1, 0x12, 0xf2, 0xa0, 0xf4, 0xc8, 0xf8, 0x52, 0xfd, 0x2c, 0x01, 0x00, 0x04, 0x9e, 0x05,
+0x68, 0x06, 0x3c, 0x07, 0xae, 0x08, 0xac, 0x0a, 0xb8, 0x0c, 0x22, 0x0e, 0xe0, 0x0d, 0x72, 0x0b,
+0x4a, 0x06, 0x92, 0xfe, 0x8a, 0xf5, 0xe8, 0xec, 0xb4, 0xe6, 0xee, 0xe3, 0xfa, 0xe4, 0x14, 0xe9,
+0x46, 0xef, 0x98, 0xf6, 0x7a, 0xfe, 0xb6, 0x06, 0x16, 0x0f, 0x7c, 0x17, 0xbd, 0x1e, 0xcf, 0x23,
+0x17, 0x25, 0x11, 0x21, 0xda, 0x16, 0x3a, 0x07, 0x8a, 0xf4, 0x2f, 0xe2, 0x05, 0xd4, 0x77, 0xcc,
+0x2b, 0xcc, 0x53, 0xd2, 0x1d, 0xdd, 0xca, 0xea, 0xf2, 0xf9, 0xcc, 0x09, 0x84, 0x19, 0xdb, 0x27,
+0x81, 0x33, 0x5f, 0x3a, 0x41, 0x3a, 0x63, 0x31, 0x01, 0x20, 0xb4, 0x07, 0x9a, 0xec, 0x93, 0xd3,
+0x39, 0xc1, 0x51, 0xb8, 0xfd, 0xb8, 0xcd, 0xc1, 0xa9, 0xd0, 0xd0, 0xe3, 0x58, 0xf9, 0xd2, 0x0f,
+0xaf, 0x25, 0x45, 0x39, 0xe7, 0x47, 0xe1, 0x4e, 0x8f, 0x4b, 0xc7, 0x3c, 0x77, 0x23, 0x4c, 0x03,
+0x6d, 0xe1, 0x91, 0xc3, 0x97, 0xae, 0x32, 0xa5, 0x7c, 0xa7, 0xa7, 0xb3, 0xab, 0xc7, 0xcb, 0xe0,
+0xf4, 0xfc, 0xa4, 0x19, 0xb5, 0x34, 0x13, 0x4b, 0xe0, 0x59, 0xd8, 0x5d, 0x0c, 0x55, 0xe3, 0x3f,
+0xdf, 0x20, 0x42, 0xfc, 0x3d, 0xd7, 0xc7, 0xb7, 0x28, 0xa2, 0x2c, 0x99, 0xde, 0x9c, 0x07, 0xac,
+0x41, 0xc4, 0x07, 0xe3, 0x16, 0x05, 0xe9, 0x26, 0x11, 0x45, 0xe0, 0x5b, 0xcc, 0x67, 0x9a, 0x66,
+0x06, 0x58, 0xa1, 0x3d, 0xd4, 0x1a, 0xee, 0xf3, 0xe9, 0xcd, 0xd1, 0xad, 0x64, 0x98, 0x24, 0x90,
+0xde, 0x95, 0x86, 0xa8, 0xfb, 0xc5, 0x5c, 0xea, 0x36, 0x11, 0xe3, 0x35, 0xbd, 0x53, 0x20, 0x67,
+0xa6, 0x6d, 0xe2, 0x66, 0xbb, 0x53, 0xe9, 0x36, 0x64, 0x13, 0x94, 0xec, 0xed, 0xc6, 0x88, 0xa7,
+0x18, 0x93, 0x98, 0x8c, 0x64, 0x95, 0x61, 0xac, 0x79, 0xce, 0x9c, 0xf6, 0xdd, 0x1e, 0xe7, 0x41,
+0x86, 0x5b, 0x6c, 0x69, 0x92, 0x6a, 0x14, 0x60, 0x87, 0x4b, 0xf7, 0x2e, 0x6e, 0x0c, 0xfa, 0xe6,
+0xc7, 0xc2, 0xda, 0xa4, 0x68, 0x92, 0xc6, 0x8e, 0x3c, 0x9b, 0x01, 0xb6, 0xc5, 0xda, 0x10, 0x03,
+0xcb, 0x28, 0x0f, 0x47, 0xf2, 0x5a, 0x6c, 0x63, 0x32, 0x61, 0x4e, 0x55, 0x2f, 0x41, 0x17, 0x26,
+0xb2, 0x05, 0x6f, 0xe2, 0xb5, 0xc0, 0xf4, 0xa5, 0x1a, 0x97, 0x90, 0x97, 0xa8, 0xa7, 0x9d, 0xc4,
+0x96, 0xe8, 0x7e, 0x0d, 0x67, 0x2d, 0x43, 0x45, 0x6f, 0x53, 0x20, 0x58, 0x01, 0x54, 0x21, 0x48,
+0x5d, 0x35, 0x45, 0x1c, 0x96, 0xfe, 0xcf, 0xde, 0x93, 0xc1, 0xb3, 0xab, 0xea, 0xa1, 0x44, 0xa6,
+0x33, 0xb8, 0xe3, 0xd3, 0x9c, 0xf3, 0xf2, 0x11, 0xf3, 0x2a, 0xbf, 0x3c, 0x75, 0x46, 0xad, 0x48,
+0x0b, 0x44, 0x13, 0x39, 0x3f, 0x28, 0x8a, 0x12, 0x92, 0xf9, 0xf1, 0xdf, 0x4f, 0xc9, 0xef, 0xb9,
+0xbd, 0xb4, 0xf1, 0xba, 0x01, 0xcb, 0x7b, 0xe1, 0xca, 0xf9, 0x32, 0x10, 0x19, 0x22, 0x41, 0x2e,
+0xb5, 0x34, 0x55, 0x35, 0xd3, 0x30, 0x87, 0x27, 0x82, 0x1a, 0x42, 0x0a, 0x7a, 0xf8, 0xf6, 0xe6,
+0x1f, 0xd8, 0x7b, 0xce, 0xb1, 0xcb, 0x79, 0xd0, 0x81, 0xdb, 0x9a, 0xea, 0xc6, 0xfa, 0xa2, 0x09,
+0x7a, 0x15, 0x69, 0x1d, 0x11, 0x21, 0xbb, 0x20, 0x41, 0x1d, 0x22, 0x17, 0x66, 0x0f, 0xec, 0x06,
+0x08, 0xfe, 0x34, 0xf5, 0x30, 0xed, 0x22, 0xe7, 0xfe, 0xe3, 0x94, 0xe4, 0xce, 0xe8, 0xc8, 0xef,
+0xf6, 0xf7, 0x92, 0xff, 0x7c, 0x05, 0xf2, 0x08, 0x40, 0x0a, 0xea, 0x09, 0xf4, 0x08, 0x62, 0x08,
+0xcc, 0x08, 0xc0, 0x09, 0x22, 0x0a, 0xfc, 0x08, 0x78, 0x05, 0x14, 0x00, 0x24, 0xfa, 0x2e, 0xf5,
+0x3c, 0xf2, 0x6c, 0xf1, 0xdc, 0xf1, 0x86, 0xf2, 0xbc, 0xf2, 0x4a, 0xf2, 0x28, 0xf2, 0xa4, 0xf3,
+0xde, 0xf7, 0x3a, 0xff, 0x18, 0x09, 0xba, 0x13, 0x43, 0x1c, 0x0f, 0x20, 0x41, 0x1e, 0x94, 0x17,
+0xa2, 0x0d, 0xb6, 0x02, 0xa4, 0xf8, 0x04, 0xf0, 0xb8, 0xe8, 0x5b, 0xe2, 0x29, 0xdd, 0x19, 0xda,
+0xd9, 0xda, 0x9f, 0xe0, 0xde, 0xeb, 0xea, 0xfb, 0x92, 0x0e, 0x9d, 0x20, 0x5d, 0x2e, 0x51, 0x35,
+0x47, 0x34, 0xcf, 0x2b, 0xe5, 0x1d, 0x1e, 0x0d, 0x90, 0xfb, 0x8c, 0xea, 0x51, 0xdb, 0xa5, 0xce,
+0x2d, 0xc6, 0x4d, 0xc3, 0xc9, 0xc7, 0x1d, 0xd4, 0x76, 0xe7, 0x62, 0xff, 0xbc, 0x18, 0xc7, 0x2f,
+0xb3, 0x40, 0xef, 0x48, 0x4f, 0x47, 0x55, 0x3c, 0xcf, 0x29, 0x80, 0x12, 0x1a, 0xf9, 0x31, 0xe0,
+0x43, 0xca, 0xef, 0xb9, 0x1d, 0xb1, 0x8b, 0xb1, 0x9b, 0xbb, 0xad, 0xce, 0x62, 0xe8, 0xea, 0x05,
+0x7f, 0x23, 0x81, 0x3d, 0x67, 0x50, 0x74, 0x59, 0xe8, 0x56, 0xa1, 0x48, 0xdf, 0x30, 0xae, 0x12,
+0xcc, 0xf1, 0x35, 0xd2, 0x4d, 0xb8, 0x3e, 0xa7, 0x0a, 0xa1, 0x0c, 0xa6, 0xbf, 0xb5, 0x29, 0xce,
+0x8a, 0xec, 0x8c, 0x0d, 0xcb, 0x2d, 0xf1, 0x49, 0x14, 0x5e, 0xea, 0x66, 0x32, 0x62, 0xa5, 0x4f,
+0xc3, 0x31, 0x92, 0x0c, 0x96, 0xe5, 0x41, 0xc2, 0xda, 0xa7, 0x48, 0x99, 0x56, 0x97, 0x5e, 0xa1,
+0x7d, 0xb5, 0x5f, 0xd1, 0x52, 0xf2, 0x64, 0x15, 0x41, 0x37, 0x53, 0x54, 0xa2, 0x68, 0xf0, 0x6f,
+0xb2, 0x67, 0x1b, 0x50, 0x91, 0x2c, 0xbe, 0x02, 0x0b, 0xd9, 0xd1, 0xb5, 0xde, 0x9d, 0x24, 0x93,
+0x32, 0x95, 0x98, 0xa2, 0x33, 0xb9, 0xf7, 0xd6, 0x4c, 0xf9, 0x4f, 0x1d, 0xb7, 0x3f, 0x68, 0x5c,
+0xd6, 0x6e, 0x9c, 0x72, 0xb2, 0x65, 0x59, 0x49, 0x37, 0x22, 0xc6, 0xf6, 0x0b, 0xce, 0xef, 0xad,
+0x1c, 0x9a, 0x52, 0x93, 0x96, 0x98, 0x68, 0xa8, 0xd1, 0xc0, 0xcd, 0xdf, 0xe2, 0x02, 0x01, 0x27,
+0x05, 0x48, 0x94, 0x61, 0x5c, 0x6f, 0xc0, 0x6d, 0xfa, 0x5b, 0x9d, 0x3c, 0x18, 0x15, 0xf0, 0xeb,
+0x67, 0xc7, 0x5f, 0xac, 0x2a, 0x9d, 0x08, 0x9a, 0xc0, 0xa1, 0xdf, 0xb2, 0xdd, 0xcb, 0x8a, 0xea,
+0x2c, 0x0c, 0x3f, 0x2d, 0xfb, 0x49, 0x46, 0x5e, 0xbe, 0x66, 0x2c, 0x61, 0x13, 0x4e, 0x57, 0x30,
+0xe4, 0x0c, 0x08, 0xe9, 0x1b, 0xca, 0xc3, 0xb3, 0x9c, 0xa7, 0x02, 0xa6, 0x81, 0xae, 0xd9, 0xbf,
+0x35, 0xd8, 0x28, 0xf5, 0xa0, 0x13, 0x03, 0x30, 0xe3, 0x46, 0x30, 0x55, 0xe2, 0x58, 0x3b, 0x51,
+0x57, 0x3f, 0x71, 0x25, 0x80, 0x07, 0xa4, 0xe9, 0x09, 0xd0, 0xeb, 0xbd, 0xdd, 0xb4, 0x6d, 0xb5,
+0x13, 0xbf, 0x4f, 0xd0, 0x9e, 0xe6, 0x34, 0xff, 0x10, 0x17, 0x7d, 0x2b, 0x7f, 0x3a, 0xf7, 0x42,
+0x3f, 0x44, 0xf7, 0x3d, 0x6b, 0x30, 0xdd, 0x1c, 0x9a, 0x05, 0x18, 0xee, 0xf7, 0xd9, 0x0f, 0xcc,
+0x17, 0xc6, 0x55, 0xc8, 0x01, 0xd2, 0x03, 0xe1, 0x80, 0xf2, 0x06, 0x04, 0xa4, 0x13, 0x03, 0x20,
+0xbd, 0x28, 0xbd, 0x2d, 0x05, 0x2f, 0xef, 0x2b, 0xd5, 0x23, 0x10, 0x17, 0x08, 0x07, 0x76, 0xf6,
+0x66, 0xe8, 0x33, 0xdf, 0x17, 0xdc, 0xef, 0xde, 0x2a, 0xe6, 0xaa, 0xef, 0x5c, 0xf9, 0xd0, 0x01,
+0x84, 0x08, 0x82, 0x0d, 0xde, 0x11, 0xe6, 0x15, 0x3c, 0x19, 0xbe, 0x1a, 0x32, 0x19, 0xf4, 0x13,
+0x94, 0x0b, 0x3c, 0x02, 0x34, 0xfa, 0x3c, 0xf5, 0xa8, 0xf3, 0xda, 0xf4, 0x50, 0xf7, 0x8c, 0xf9,
+0x8c, 0xfa, 0x2c, 0xfa, 0x44, 0xf9, 0x1e, 0xf9, 0xe8, 0xfa, 0x16, 0xff, 0x20, 0x05, 0x7e, 0x0b,
+0x82, 0x10, 0xfa, 0x12, 0xf0, 0x12, 0x5a, 0x11, 0x44, 0x0f, 0x3c, 0x0d, 0x34, 0x0b, 0x72, 0x08,
+0xf2, 0x03, 0x78, 0xfd, 0xa0, 0xf5, 0x68, 0xed, 0x46, 0xe6, 0x39, 0xe2, 0xc1, 0xe2, 0x6e, 0xe8,
+0x4c, 0xf2, 0xe4, 0xfe, 0x0c, 0x0c, 0xd8, 0x17, 0xab, 0x20, 0xff, 0x25, 0xc7, 0x27, 0xfb, 0x25,
+0x59, 0x20, 0x0a, 0x17, 0xb2, 0x0a, 0x1c, 0xfc, 0xca, 0xec, 0x69, 0xde, 0x01, 0xd3, 0xb7, 0xcc,
+0x31, 0xcd, 0x19, 0xd5, 0xd6, 0xe3, 0xb6, 0xf7, 0x92, 0x0d, 0x11, 0x22, 0x2f, 0x32, 0x11, 0x3c,
+0x9f, 0x3e, 0xff, 0x39, 0x27, 0x2f, 0x55, 0x1f, 0x0a, 0x0c, 0xec, 0xf6, 0xf7, 0xe1, 0x17, 0xcf,
+0x99, 0xc0, 0xd1, 0xb8, 0x29, 0xba, 0x8f, 0xc5, 0x59, 0xda, 0xf8, 0xf5, 0x72, 0x14, 0x7f, 0x30,
+0xad, 0x45, 0x1d, 0x51, 0x2d, 0x52, 0x7d, 0x49, 0x25, 0x39, 0x65, 0x23, 0x72, 0x0a, 0x2a, 0xf0,
+0x7b, 0xd6, 0xcf, 0xbf, 0x09, 0xaf, 0x68, 0xa7, 0x22, 0xab, 0x9b, 0xbb, 0x93, 0xd7, 0x34, 0xfb,
+0x45, 0x20, 0x95, 0x40, 0x1c, 0x57, 0x52, 0x61, 0x12, 0x5f, 0x29, 0x52, 0x79, 0x3d, 0x8d, 0x23,
+0x74, 0x06, 0xf0, 0xe7, 0x8d, 0xca, 0x63, 0xb1, 0x02, 0xa0, 0x14, 0x9a, 0x4c, 0xa2, 0x0d, 0xb9,
+0xbf, 0xdb, 0xf4, 0x04, 0x85, 0x2d, 0xd5, 0x4e, 0x52, 0x64, 0x10, 0x6c, 0xd0, 0x66, 0xca, 0x56,
+0xc3, 0x3e, 0x2d, 0x21, 0x4a, 0x00, 0x55, 0xde, 0x57, 0xbe, 0x56, 0xa4, 0xbe, 0x94, 0x04, 0x93,
+0xbe, 0xa0, 0x21, 0xbd, 0x4c, 0xe4, 0xaa, 0x0f, 0x2d, 0x38, 0xb6, 0x57, 0xd2, 0x6a, 0x26, 0x70,
+0x68, 0x68, 0xaa, 0x55, 0xd5, 0x3a, 0x54, 0x1a, 0x92, 0xf6, 0xd5, 0xd2, 0x0d, 0xb3, 0xca, 0x9b,
+0xd0, 0x90, 0x86, 0x94, 0x48, 0xa7, 0xdb, 0xc6, 0xc0, 0xee, 0x98, 0x18, 0x51, 0x3e, 0xf2, 0x5a,
+0x96, 0x6b, 0x82, 0x6e, 0xb2, 0x64, 0xdf, 0x4f, 0xa5, 0x32, 0xe6, 0x0f, 0x18, 0xeb, 0x33, 0xc8,
+0xb7, 0xab, 0x94, 0x99, 0x50, 0x94, 0xde, 0x9c, 0x0d, 0xb2, 0x59, 0xd1, 0xb8, 0xf6, 0x19, 0x1d,
+0x55, 0x3f, 0x26, 0x59, 0x7e, 0x67, 0xaa, 0x68, 0xb0, 0x5c, 0xb9, 0x45, 0xe3, 0x26, 0xc0, 0x03,
+0x9d, 0xe0, 0x0d, 0xc2, 0xb9, 0xab, 0x40, 0xa0, 0x60, 0xa0, 0x53, 0xab, 0xfd, 0xbf, 0x29, 0xdc,
+0xca, 0xfc, 0x27, 0x1e, 0x31, 0x3c, 0x97, 0x52, 0x02, 0x5e, 0x9e, 0x5c, 0xcf, 0x4e, 0x07, 0x37,
+0xda, 0x18, 0xae, 0xf8, 0xcb, 0xda, 0x2b, 0xc3, 0x17, 0xb4, 0x1b, 0xae, 0xf7, 0xb0, 0xc3, 0xbb,
+0x41, 0xcd, 0x5c, 0xe4, 0x92, 0xff, 0xb2, 0x1b, 0x17, 0x35, 0x89, 0x47, 0xaf, 0x4f, 0x13, 0x4c,
+0x97, 0x3d, 0x01, 0x27, 0x8a, 0x0c, 0x7a, 0xf2, 0x5f, 0xdc, 0x67, 0xcc, 0x81, 0xc3, 0x2d, 0xc1,
+0x81, 0xc4, 0xdd, 0xcc, 0x27, 0xda, 0xcc, 0xeb, 0xf0, 0x00, 0x42, 0x17, 0x15, 0x2b, 0xc7, 0x38,
+0x8b, 0x3d, 0x99, 0x38, 0x4b, 0x2b, 0xfc, 0x18, 0x12, 0x05, 0x28, 0xf3, 0x38, 0xe5, 0x19, 0xdc,
+0x5f, 0xd7, 0x63, 0xd6, 0x67, 0xd8, 0x47, 0xdd, 0x5e, 0xe5, 0xb2, 0xf0, 0xb0, 0xfe, 0xa8, 0x0d,
+0x06, 0x1b, 0xab, 0x23, 0x0d, 0x26, 0x39, 0x22, 0x90, 0x19, 0x68, 0x0e, 0x94, 0x03, 0x98, 0xfa,
+0x38, 0xf4, 0x48, 0xf0, 0x32, 0xee, 0x3c, 0xed, 0xf2, 0xec, 0x60, 0xed, 0x0a, 0xef, 0x98, 0xf2,
+0x08, 0xf8, 0xfa, 0xfe, 0xcc, 0x05, 0x48, 0x0b, 0xfc, 0x0d, 0x2e, 0x0e, 0x80, 0x0c, 0x10, 0x0a,
+0xc0, 0x07, 0x80, 0x06, 0xee, 0x05, 0x92, 0x05, 0xf0, 0x04, 0xf4, 0x02, 0x52, 0xff, 0x0e, 0xfa,
+0x32, 0xf4, 0xc8, 0xee, 0x62, 0xeb, 0xe8, 0xea, 0x8e, 0xed, 0x30, 0xf2, 0x26, 0xf8, 0x8c, 0xfe,
+0xc0, 0x04, 0x7c, 0x0a, 0xc2, 0x0f, 0x96, 0x14, 0xbc, 0x18, 0x2e, 0x1b, 0x02, 0x1b, 0x60, 0x17,
+0x48, 0x0f, 0x3a, 0x03, 0x7e, 0xf4, 0xc0, 0xe5, 0xf3, 0xd9, 0xf5, 0xd3, 0x71, 0xd4, 0xe1, 0xda,
+0x58, 0xe5, 0x2c, 0xf2, 0xc6, 0xff, 0xf8, 0x0c, 0x62, 0x19, 0x2f, 0x24, 0xa9, 0x2c, 0x51, 0x31,
+0xb1, 0x30, 0x39, 0x29, 0xbc, 0x1a, 0xe6, 0x05, 0xca, 0xed, 0xb9, 0xd6, 0x2f, 0xc5, 0xa5, 0xbc,
+0x1f, 0xbe, 0x25, 0xc8, 0x19, 0xd8, 0x80, 0xeb, 0xec, 0xff, 0xae, 0x13, 0x91, 0x25, 0xcb, 0x34,
+0xb9, 0x3f, 0x8f, 0x44, 0x59, 0x41, 0xc9, 0x34, 0xbd, 0x1e, 0xd8, 0x01, 0x4d, 0xe2, 0xb1, 0xc5,
+0x7b, 0xb1, 0xc0, 0xa8, 0xf9, 0xab, 0xa9, 0xb9, 0xb1, 0xce, 0xc0, 0xe7, 0x9a, 0x02, 0xcd, 0x1c,
+0x8f, 0x34, 0xc7, 0x47, 0x35, 0x54, 0xec, 0x56, 0x1f, 0x4e, 0xdf, 0x39, 0x1a, 0x1c, 0xac, 0xf8,
+0xe5, 0xd4, 0x95, 0xb6, 0x46, 0xa2, 0x20, 0x9b, 0xfa, 0xa0, 0xe3, 0xb1, 0x27, 0xcb, 0x82, 0xe9,
+0x96, 0x09, 0xa3, 0x28, 0xe1, 0x43, 0x42, 0x58, 0xd8, 0x62, 0xfe, 0x60, 0x39, 0x52, 0x09, 0x38,
+0x9c, 0x15, 0x32, 0xef, 0xdb, 0xc9, 0x16, 0xab, 0x86, 0x97, 0x5c, 0x91, 0x3a, 0x99, 0x8d, 0xad,
+0x6f, 0xcb, 0x08, 0xef, 0x6c, 0x14, 0x37, 0x37, 0x97, 0x53, 0x1a, 0x66, 0xd8, 0x6b, 0x0c, 0x64,
+0x9d, 0x4f, 0x5f, 0x31, 0xce, 0x0c, 0x0a, 0xe6, 0x5b, 0xc1, 0xb4, 0xa3, 0x76, 0x91, 0x48, 0x8d,
+0xca, 0x97, 0xa1, 0xaf, 0xf3, 0xd1, 0xac, 0xf9, 0x8b, 0x21, 0x77, 0x44, 0xec, 0x5d, 0x3a, 0x6b,
+0x26, 0x6b, 0x40, 0x5e, 0xe9, 0x46, 0x4f, 0x28, 0xf4, 0x04, 0x01, 0xe0, 0x67, 0xbd, 0xb6, 0xa1,
+0x6a, 0x91, 0x4e, 0x8f, 0x6e, 0x9c, 0x99, 0xb7, 0xbf, 0xdc, 0xe4, 0x05, 0xc7, 0x2c, 0x2f, 0x4c,
+0xaa, 0x60, 0x66, 0x68, 0xc4, 0x63, 0xd4, 0x54, 0x89, 0x3d, 0x29, 0x20, 0x0e, 0xff, 0x7f, 0xdc,
+0x61, 0xbc, 0x48, 0xa3, 0x82, 0x95, 0x48, 0x96, 0x5a, 0xa6, 0xa5, 0xc3, 0x52, 0xe9, 0xa8, 0x10,
+0x4b, 0x33, 0x2f, 0x4d, 0xc6, 0x5b, 0x08, 0x5f, 0xdc, 0x57, 0x37, 0x48, 0x49, 0x32, 0x60, 0x17,
+0x22, 0xf9, 0x33, 0xda, 0xfb, 0xbd, 0xa4, 0xa8, 0x02, 0x9f, 0xfc, 0xa2, 0x2d, 0xb5, 0x7b, 0xd2,
+0x48, 0xf5, 0x34, 0x17, 0x29, 0x33, 0x5b, 0x46, 0xd7, 0x4f, 0xe7, 0x4f, 0xdb, 0x47, 0xc9, 0x39,
+0x7f, 0x26, 0x58, 0x0f, 0x86, 0xf5, 0x87, 0xdb, 0xbd, 0xc4, 0xbb, 0xb4, 0xc9, 0xae, 0x3f, 0xb5,
+0xbf, 0xc6, 0x2f, 0xe0, 0x9c, 0xfc, 0xf4, 0x16, 0xbb, 0x2b, 0x63, 0x39, 0x43, 0x3f, 0x1f, 0x3e,
+0x0b, 0x37, 0xe9, 0x2a, 0x52, 0x1b, 0x96, 0x08, 0x94, 0xf4, 0x3f, 0xe1, 0xfd, 0xd0, 0x51, 0xc6,
+0x95, 0xc3, 0x59, 0xc9, 0xfb, 0xd6, 0xe2, 0xe9, 0x2e, 0xfe, 0xd2, 0x10, 0x1b, 0x1f, 0x0d, 0x28,
+0x79, 0x2b, 0xb3, 0x29, 0xa5, 0x23, 0xde, 0x1a, 0x0e, 0x10, 0x22, 0x04, 0x18, 0xf8, 0x0a, 0xed,
+0xf0, 0xe3, 0x91, 0xdd, 0x55, 0xdb, 0xe9, 0xdd, 0x10, 0xe5, 0x6a, 0xef, 0x18, 0xfb, 0xd0, 0x05,
+0x32, 0x0e, 0x2a, 0x13, 0xaa, 0x14, 0x76, 0x13, 0x70, 0x10, 0xb8, 0x0c, 0x3a, 0x09, 0x14, 0x06,
+0x40, 0x03, 0x22, 0x00, 0x26, 0xfc, 0x60, 0xf7, 0xb6, 0xf2, 0x7a, 0xef, 0x80, 0xee, 0x26, 0xf0,
+0x8c, 0xf3, 0x90, 0xf7, 0xa6, 0xfa, 0x92, 0xfc, 0x60, 0xfd, 0xec, 0xfd, 0x6c, 0xff, 0xb2, 0x02,
+0xe8, 0x07, 0x10, 0x0e, 0x7c, 0x13, 0x34, 0x16, 0xb6, 0x14, 0xca, 0x0e, 0xe4, 0x05, 0x54, 0xfc,
+0xdc, 0xf3, 0xcc, 0xed, 0xec, 0xe9, 0x8e, 0xe7, 0x14, 0xe6, 0x74, 0xe5, 0x96, 0xe6, 0xaa, 0xea,
+0xc2, 0xf2, 0x86, 0xfe, 0x24, 0x0d, 0xd0, 0x1b, 0x6f, 0x27, 0x6f, 0x2d, 0x05, 0x2c, 0x7b, 0x23,
+0xd6, 0x15, 0xd8, 0x05, 0xf4, 0xf5, 0x38, 0xe8, 0x0b, 0xdd, 0x75, 0xd4, 0x39, 0xcf, 0xeb, 0xcd,
+0xfd, 0xd1, 0x4b, 0xdc, 0x86, 0xec, 0x3a, 0x01, 0xb2, 0x17, 0x17, 0x2c, 0x33, 0x3b, 0x4b, 0x42,
+0xe5, 0x3f, 0x7f, 0x34, 0x39, 0x22, 0xf0, 0x0b, 0xe4, 0xf4, 0x3f, 0xdf, 0xff, 0xcc, 0xe1, 0xbf,
+0xf3, 0xb8, 0xe9, 0xb9, 0x47, 0xc3, 0xf1, 0xd4, 0x14, 0xed, 0xb2, 0x08, 0xf5, 0x23, 0xa9, 0x3b,
+0x2b, 0x4c, 0x49, 0x53, 0x71, 0x4f, 0xfd, 0x40, 0xeb, 0x29, 0x3a, 0x0d, 0x7e, 0xee, 0xaf, 0xd1,
+0x2b, 0xba, 0xac, 0xaa, 0x8e, 0xa5, 0x0e, 0xab, 0x35, 0xbb, 0xf1, 0xd3, 0x30, 0xf2, 0x38, 0x12,
+0xa5, 0x30, 0xdd, 0x49, 0x34, 0x5b, 0x02, 0x62, 0xfe, 0x5b, 0x99, 0x49, 0x9b, 0x2c, 0xd8, 0x08,
+0x37, 0xe3, 0x23, 0xc1, 0x8c, 0xa7, 0xa8, 0x99, 0xda, 0x98, 0x62, 0xa4, 0x71, 0xba, 0x0f, 0xd8,
+0xa2, 0xf9, 0x86, 0x1b, 0xc1, 0x3a, 0x59, 0x54, 0x54, 0x65, 0x90, 0x6a, 0xba, 0x61, 0xcd, 0x4a,
+0x7f, 0x28, 0x5a, 0xff, 0xeb, 0xd5, 0xa1, 0xb2, 0xc8, 0x9a, 0xf4, 0x90, 0xe2, 0x94, 0x06, 0xa5,
+0x5f, 0xbe, 0xff, 0xdd, 0x38, 0x00, 0x71, 0x22, 0xbb, 0x41, 0x44, 0x5b, 0x84, 0x6b, 0x92, 0x6e,
+0x34, 0x62, 0xdf, 0x46, 0x45, 0x20, 0x50, 0xf4, 0x49, 0xca, 0x02, 0xa9, 0xe8, 0x94, 0x5a, 0x8f,
+0x28, 0x97, 0xe0, 0xa9, 0xd5, 0xc4, 0x0e, 0xe5, 0x8a, 0x07, 0x99, 0x29, 0x8b, 0x48, 0x9e, 0x60,
+0xee, 0x6d, 0xe6, 0x6c, 0xa6, 0x5b, 0x71, 0x3c, 0xb4, 0x13, 0x2c, 0xe8, 0xfd, 0xc0, 0x5a, 0xa4,
+0x44, 0x95, 0xec, 0x93, 0xc6, 0x9e, 0xe9, 0xb2, 0x89, 0xce, 0x80, 0xee, 0x1a, 0x10, 0x85, 0x30,
+0xa7, 0x4c, 0xa0, 0x60, 0xf0, 0x68, 0x20, 0x63, 0xc3, 0x4e, 0x1b, 0x2f, 0xba, 0x08, 0xd9, 0xe1,
+0xbb, 0xc0, 0xa0, 0xa9, 0xcc, 0x9e, 0x24, 0xa0, 0x7d, 0xab, 0x8d, 0xbf, 0xe5, 0xd9, 0xb2, 0xf7,
+0x58, 0x16, 0xdb, 0x32, 0xb7, 0x49, 0x46, 0x58, 0xf4, 0x5b, 0x3b, 0x53, 0x99, 0x3f, 0xf9, 0x22,
+0x24, 0x02, 0x7b, 0xe1, 0xf7, 0xc5, 0x2f, 0xb3, 0x14, 0xab, 0x8d, 0xad, 0xa1, 0xb9, 0x2d, 0xcd,
+0xe4, 0xe5, 0xe4, 0x00, 0xa4, 0x1a, 0xdf, 0x30, 0x35, 0x41, 0x9f, 0x49, 0x85, 0x49, 0xc1, 0x40,
+0xed, 0x2f, 0x94, 0x19, 0xfc, 0xff, 0xd8, 0xe6, 0xb1, 0xd1, 0x85, 0xc3, 0xdd, 0xbd, 0x1f, 0xc1,
+0xfd, 0xcb, 0xed, 0xdc, 0x78, 0xf1, 0x2a, 0x06, 0xd2, 0x18, 0x87, 0x27, 0x1f, 0x31, 0x75, 0x35,
+0x85, 0x34, 0x5f, 0x2e, 0x7d, 0x23, 0x42, 0x14, 0x1e, 0x02, 0x9e, 0xef, 0xbb, 0xdf, 0x2b, 0xd5,
+0xad, 0xd1, 0x41, 0xd5, 0xaf, 0xde, 0xde, 0xeb, 0x26, 0xfa, 0x06, 0x07, 0xe8, 0x10, 0xe6, 0x17,
+0x0a, 0x1c, 0x37, 0x1e, 0xe9, 0x1e, 0x83, 0x1d, 0x56, 0x19, 0xbc, 0x11, 0x32, 0x07, 0x92, 0xfb,
+0x44, 0xf1, 0x6a, 0xea, 0x54, 0xe8, 0xae, 0xea, 0xe0, 0xef, 0x46, 0xf6, 0xc8, 0xfb, 0x70, 0xff,
+0x42, 0x01, 0x58, 0x02, 0xf4, 0x03, 0xe4, 0x06, 0x48, 0x0b, 0xf8, 0x0f, 0x20, 0x13, 0x86, 0x13,
+0xba, 0x10, 0xe8, 0x0b, 0xae, 0x06, 0x88, 0x02, 0x06, 0x00, 0xcc, 0xfe, 0x72, 0xfd, 0xfe, 0xfa,
+0x2e, 0xf7, 0x22, 0xf2, 0x98, 0xed, 0x04, 0xeb, 0xf0, 0xeb, 0xd6, 0xf0, 0x86, 0xf9, 0x54, 0x04,
+0x04, 0x0f, 0x8e, 0x17, 0xfd, 0x1c, 0x1b, 0x1f, 0x5d, 0x1e, 0x46, 0x1b, 0x42, 0x16, 0x0c, 0x0f,
+0x74, 0x05, 0xf0, 0xf9, 0xac, 0xed, 0x2d, 0xe2, 0x4b, 0xd9, 0xfd, 0xd4, 0x2d, 0xd6, 0xdb, 0xdd,
+0x54, 0xeb, 0xd0, 0xfc, 0x9a, 0x0f, 0xc5, 0x20, 0xd5, 0x2d, 0x6f, 0x35, 0xaf, 0x36, 0x99, 0x31,
+0x57, 0x27, 0x7e, 0x18, 0xa0, 0x06, 0x98, 0xf3, 0x2d, 0xe1, 0x49, 0xd1, 0x1f, 0xc6, 0xe9, 0xc0,
+0x85, 0xc3, 0x65, 0xce, 0x67, 0xe1, 0x40, 0xfa, 0x58, 0x15, 0x37, 0x2e, 0x69, 0x41, 0xa3, 0x4b,
+0xe9, 0x4b, 0xdd, 0x42, 0x2d, 0x32, 0xa5, 0x1c, 0x48, 0x04, 0xc2, 0xeb, 0xfd, 0xd4, 0x2b, 0xc2,
+0xeb, 0xb4, 0xdf, 0xaf, 0x17, 0xb4, 0x47, 0xc3, 0x8b, 0xdc, 0xfe, 0xfc, 0x83, 0x1f, 0x79, 0x3e,
+0x6b, 0x54, 0x86, 0x5e, 0xac, 0x5b, 0x9d, 0x4d, 0xb5, 0x37, 0xc3, 0x1c, 0xc8, 0xff, 0x2b, 0xe3,
+0xfb, 0xc8, 0x97, 0xb3, 0xc4, 0xa5, 0xa4, 0xa1, 0xa2, 0xa9, 0x9b, 0xbe, 0xe7, 0xde, 0x00, 0x06,
+0x85, 0x2d, 0x8b, 0x4e, 0x56, 0x64, 0xe8, 0x6b, 0x34, 0x65, 0xef, 0x52, 0xb3, 0x38, 0xca, 0x19,
+0x22, 0xf9, 0x41, 0xd9, 0xdb, 0xbc, 0xdc, 0xa6, 0x32, 0x9a, 0x4e, 0x99, 0x70, 0xa6, 0x73, 0xc1,
+0x42, 0xe7, 0x24, 0x12, 0xc1, 0x3a, 0xa4, 0x5a, 0x66, 0x6d, 0x2a, 0x71, 0xc0, 0x66, 0x7d, 0x51,
+0xad, 0x34, 0x78, 0x13, 0xb4, 0xf0, 0x09, 0xcf, 0x01, 0xb2, 0x26, 0x9d, 0x9a, 0x93, 0xc6, 0x97,
+0x70, 0xaa, 0x21, 0xca, 0x7a, 0xf2, 0x3f, 0x1d, 0x9d, 0x43, 0x6e, 0x60, 0x10, 0x70, 0x2c, 0x71,
+0xbe, 0x64, 0x75, 0x4d, 0xdf, 0x2e, 0xa8, 0x0b, 0x4a, 0xe7, 0x47, 0xc5, 0x06, 0xaa, 0xea, 0x98,
+0x84, 0x94, 0xfa, 0x9d, 0xbb, 0xb4, 0x23, 0xd6, 0x46, 0xfd, 0xb9, 0x24, 0xf7, 0x46, 0xee, 0x5f,
+0x7a, 0x6c, 0x62, 0x6b, 0x74, 0x5d, 0x05, 0x45, 0x59, 0x25, 0x9e, 0x01, 0xc5, 0xdd, 0x53, 0xbe,
+0x72, 0xa7, 0x08, 0x9c, 0x40, 0x9d, 0x74, 0xaa, 0x29, 0xc2, 0x79, 0xe1, 0x6a, 0x04, 0xbf, 0x26,
+0x81, 0x44, 0xc0, 0x59, 0xea, 0x63, 0x0e, 0x61, 0xb5, 0x51, 0xb1, 0x38, 0x1c, 0x19, 0x38, 0xf7,
+0x45, 0xd7, 0xc1, 0xbd, 0xa1, 0xad, 0x6a, 0xa8, 0x41, 0xad, 0x29, 0xbb, 0x65, 0xd0, 0x82, 0xea,
+0x8e, 0x07, 0x45, 0x24, 0x67, 0x3d, 0x4d, 0x4f, 0xd4, 0x56, 0x59, 0x52, 0xab, 0x42, 0x41, 0x2a,
+0x18, 0x0d, 0xd8, 0xef, 0x77, 0xd6, 0x51, 0xc4, 0xc9, 0xba, 0x81, 0xb9, 0x95, 0xbf, 0x69, 0xcb,
+0xc7, 0xdb, 0xea, 0xef, 0x6c, 0x06, 0x63, 0x1d, 0xb1, 0x31, 0x03, 0x40, 0x31, 0x45, 0x25, 0x40,
+0x65, 0x31, 0x5d, 0x1c, 0xe0, 0x04, 0xec, 0xee, 0x8f, 0xdd, 0x83, 0xd2, 0xbf, 0xcd, 0x39, 0xce,
+0x05, 0xd3, 0xf7, 0xda, 0xfe, 0xe5, 0x8c, 0xf3, 0x5e, 0x03, 0xfc, 0x13, 0xef, 0x22, 0xf1, 0x2c,
+0x0d, 0x30, 0x47, 0x2b, 0xe1, 0x1f, 0xde, 0x10, 0x3e, 0x01, 0x12, 0xf4, 0xc0, 0xea, 0x88, 0xe5,
+0xc4, 0xe3, 0x68, 0xe4, 0x74, 0xe6, 0xae, 0xe9, 0x34, 0xee, 0x6c, 0xf4, 0xb2, 0xfc, 0x3a, 0x06,
+0x62, 0x0f, 0x12, 0x16, 0xc0, 0x18, 0x02, 0x17, 0xe6, 0x11, 0x2c, 0x0b, 0xd8, 0x04, 0x0e, 0x00,
+0x18, 0xfd, 0x98, 0xfb, 0xc4, 0xfa, 0xcc, 0xf9, 0x26, 0xf8, 0xc4, 0xf5, 0x0a, 0xf3, 0x12, 0xf1,
+0xda, 0xf0, 0xfe, 0xf2, 0x44, 0xf7, 0x72, 0xfc, 0xb8, 0x01, 0xf8, 0x05, 0x46, 0x09, 0xc4, 0x0b,
+0xce, 0x0d, 0xc8, 0x0f, 0x40, 0x11, 0xf2, 0x11, 0xe8, 0x10, 0xb6, 0x0d, 0x90, 0x07, 0xc2, 0xfe,
+0xca, 0xf3, 0xf4, 0xe8, 0x8f, 0xe0, 0x75, 0xdc, 0xef, 0xdd, 0x30, 0xe4, 0x3c, 0xee, 0xd8, 0xf9,
+0x6e, 0x05, 0x04, 0x10, 0x48, 0x19, 0x7d, 0x20, 0x83, 0x25, 0x95, 0x27, 0xc7, 0x25, 0x6f, 0x1f,
+0xa2, 0x13, 0xee, 0x02, 0xfc, 0xee, 0x23, 0xdb, 0x7b, 0xcb, 0xd1, 0xc3, 0x43, 0xc5, 0x4d, 0xcf,
+0x6d, 0xdf, 0x7a, 0xf2, 0xd0, 0x05, 0x98, 0x17, 0xb7, 0x26, 0xa7, 0x32, 0x77, 0x3a, 0xf1, 0x3c,
+0xfd, 0x38, 0x65, 0x2d, 0x0e, 0x1a, 0x84, 0x00, 0x10, 0xe4, 0xc7, 0xc9, 0x01, 0xb7, 0x09, 0xaf,
+0x17, 0xb3, 0x49, 0xc1, 0xbf, 0xd6, 0xc6, 0xef, 0x38, 0x09, 0x7f, 0x20, 0x8d, 0x34, 0xd5, 0x43,
+0x07, 0x4d, 0x5d, 0x4e, 0x35, 0x46, 0x29, 0x34, 0x20, 0x19, 0x0e, 0xf8, 0xb1, 0xd5, 0x17, 0xb8,
+0x2a, 0xa4, 0xb4, 0x9d, 0xb2, 0xa4, 0x4f, 0xb7, 0xed, 0xd1, 0x96, 0xf0, 0x66, 0x0f, 0xc3, 0x2b,
+0x83, 0x43, 0x99, 0x54, 0xfa, 0x5c, 0x44, 0x5a, 0x03, 0x4c, 0x0d, 0x33, 0xda, 0x11, 0x84, 0xec,
+0x4b, 0xc8, 0xba, 0xaa, 0x56, 0x98, 0xc4, 0x93, 0x2e, 0x9d, 0xdd, 0xb2, 0x57, 0xd1, 0x4e, 0xf4,
+0xda, 0x17, 0x41, 0x38, 0x77, 0x52, 0x44, 0x63, 0x62, 0x68, 0x52, 0x60, 0xd1, 0x4b, 0x3f, 0x2d,
+0x76, 0x08, 0xd7, 0xe1, 0x17, 0xbe, 0xe2, 0xa1, 0x34, 0x91, 0x84, 0x8e, 0x26, 0x9a, 0x9f, 0xb2,
+0xc7, 0xd4, 0x0c, 0xfc, 0x57, 0x23, 0xb7, 0x45, 0x1e, 0x5f, 0x70, 0x6c, 0xd2, 0x6b, 0x8c, 0x5d,
+0x15, 0x44, 0x0f, 0x23, 0x2e, 0xfe, 0x1b, 0xd9, 0xbd, 0xb7, 0x46, 0x9e, 0x20, 0x90, 0xa2, 0x8f,
+0xc2, 0x9d, 0x33, 0xb9, 0x65, 0xde, 0xea, 0x07, 0x7f, 0x2f, 0xd3, 0x4f, 0xee, 0x64, 0x7c, 0x6c,
+0x54, 0x66, 0x69, 0x54, 0xb3, 0x39, 0x90, 0x19, 0x08, 0xf7, 0xe5, 0xd4, 0xa1, 0xb6, 0x9a, 0x9f,
+0x88, 0x93, 0x4a, 0x95, 0xc8, 0xa5, 0x5b, 0xc3, 0xe4, 0xe9, 0xfa, 0x12, 0xd1, 0x37, 0x83, 0x53,
+0xd8, 0x62, 0x38, 0x65, 0xa8, 0x5b, 0x93, 0x48, 0x13, 0x2f, 0xa0, 0x11, 0x70, 0xf2, 0xaf, 0xd3,
+0x99, 0xb8, 0xa4, 0xa4, 0xa6, 0x9b, 0xee, 0x9f, 0x59, 0xb2, 0xcd, 0xd0, 0xda, 0xf5, 0x10, 0x1b,
+0x3b, 0x3a, 0x87, 0x4f, 0x16, 0x59, 0x7a, 0x57, 0x77, 0x4c, 0xa1, 0x3a, 0xf3, 0x23, 0x66, 0x0a,
+0xc0, 0xef, 0xc9, 0xd5, 0x67, 0xbf, 0xdb, 0xaf, 0x46, 0xaa, 0xd3, 0xb0, 0x7d, 0xc3, 0x33, 0xdf,
+0x10, 0xff, 0x27, 0x1d, 0xdf, 0x34, 0x9f, 0x43, 0xdd, 0x48, 0x77, 0x45, 0x4f, 0x3b, 0xff, 0x2b,
+0x7c, 0x19, 0x20, 0x05, 0xfc, 0xef, 0xe7, 0xdb, 0x17, 0xcb, 0x37, 0xc0, 0x8d, 0xbd, 0x6b, 0xc4,
+0xff, 0xd3, 0x04, 0xea, 0x02, 0x02, 0xe2, 0x17, 0x83, 0x28, 0x5f, 0x32, 0x39, 0x35, 0xe1, 0x31,
+0x8d, 0x29, 0xdf, 0x1d, 0x32, 0x10, 0x72, 0x01, 0xec, 0xf2, 0xcc, 0xe5, 0x65, 0xdb, 0x01, 0xd5,
+0xdd, 0xd3, 0x75, 0xd8, 0x8d, 0xe2, 0x44, 0xf0, 0x66, 0xff, 0x50, 0x0d, 0xde, 0x17, 0xd1, 0x1d,
+0x45, 0x1f, 0xd3, 0x1c, 0x5e, 0x17, 0x62, 0x10, 0xf8, 0x08, 0x3c, 0x02, 0x30, 0xfc, 0xee, 0xf6,
+0x40, 0xf2, 0x42, 0xee, 0x52, 0xeb, 0x40, 0xea, 0x0a, 0xec, 0x78, 0xf0, 0xf0, 0xf6, 0x84, 0xfd,
+0x0c, 0x03, 0x92, 0x06, 0xfe, 0x07, 0x9a, 0x07, 0x9a, 0x06, 0x2e, 0x06, 0xf0, 0x06, 0xec, 0x08,
+0x2c, 0x0b, 0x50, 0x0c, 0xd6, 0x0a, 0x22, 0x06, 0x0c, 0xff, 0x48, 0xf7, 0xc4, 0xf0, 0xe4, 0xec,
+0xca, 0xeb, 0x88, 0xec, 0x14, 0xee, 0xcc, 0xef, 0xa6, 0xf1, 0xaa, 0xf4, 0x98, 0xf9, 0x0e, 0x01,
+0xc4, 0x0a, 0x74, 0x15, 0x8d, 0x1e, 0x8d, 0x23, 0x77, 0x22, 0x38, 0x1b, 0x0c, 0x0f, 0x52, 0x00,
+0x1c, 0xf2, 0x92, 0xe6, 0x7b, 0xde, 0x97, 0xd9, 0x99, 0xd7, 0x5d, 0xd8, 0xc5, 0xdc, 0x4a, 0xe5,
+0x4c, 0xf2, 0x14, 0x03, 0xb6, 0x15, 0x29, 0x27, 0x5f, 0x34, 0x6d, 0x3a, 0xd7, 0x37, 0xb3, 0x2c,
+0xee, 0x1a, 0xd4, 0x05, 0x96, 0xf0, 0xb9, 0xdd, 0xe3, 0xce, 0x1f, 0xc5, 0xd1, 0xc0, 0xfb, 0xc2,
+0x0b, 0xcc, 0x27, 0xdc, 0xec, 0xf1, 0xd6, 0x0a, 0x9f, 0x23, 0xf5, 0x38, 0x6f, 0x47, 0xa7, 0x4c,
+0x8d, 0x47, 0xb3, 0x38, 0x37, 0x22, 0x3e, 0x07, 0x42, 0xeb, 0xdd, 0xd1, 0xd3, 0xbd, 0x2f, 0xb1,
+0x8f, 0xad, 0x75, 0xb3, 0xdf, 0xc2, 0x2b, 0xda, 0xd0, 0xf6, 0x06, 0x15, 0x4b, 0x31, 0x25, 0x48,
+0xf4, 0x56, 0x92, 0x5b, 0x89, 0x54, 0x61, 0x42, 0xed, 0x26, 0xb4, 0x05, 0xc9, 0xe2, 0x0b, 0xc3,
+0x04, 0xab, 0x0e, 0x9e, 0x86, 0x9d, 0x1c, 0xa9, 0x55, 0xbf, 0x33, 0xdd, 0xcc, 0xfe, 0xeb, 0x1f,
+0x5b, 0x3d, 0x6d, 0x54, 0xae, 0x62, 0xa8, 0x65, 0xf8, 0x5b, 0xb1, 0x45, 0xf1, 0x24, 0x7a, 0xfd,
+0x25, 0xd5, 0x6b, 0xb2, 0xc8, 0x9a, 0x4a, 0x91, 0x60, 0x96, 0x5c, 0xa8, 0x0f, 0xc4, 0x82, 0xe5,
+0x8a, 0x08, 0xcb, 0x29, 0x81, 0x46, 0x74, 0x5c, 0x40, 0x69, 0x30, 0x6a, 0x58, 0x5d, 0xe9, 0x42,
+0x87, 0x1d, 0x3e, 0xf2, 0x11, 0xc8, 0x0e, 0xa6, 0xaa, 0x91, 0x20, 0x8d, 0x48, 0x97, 0x09, 0xad,
+0xd3, 0xca, 0xc6, 0xec, 0x4a, 0x0f, 0x89, 0x2f, 0x51, 0x4b, 0x54, 0x60, 0x58, 0x6b, 0x70, 0x69,
+0xfe, 0x58, 0xd7, 0x3a, 0x8c, 0x12, 0x3a, 0xe6, 0x73, 0xbd, 0x32, 0x9f, 0xa8, 0x8f, 0x84, 0x8f,
+0xee, 0x9c, 0xad, 0xb4, 0x21, 0xd3, 0xae, 0xf4, 0x3e, 0x16, 0x55, 0x35, 0x77, 0x4f, 0xa6, 0x61,
+0xea, 0x68, 0xc4, 0x62, 0x75, 0x4e, 0xeb, 0x2d, 0xa4, 0x05, 0x3f, 0xdc, 0x8b, 0xb8, 0x26, 0xa0,
+0xce, 0x95, 0x60, 0x99, 0x88, 0xa8, 0x31, 0xc0, 0x49, 0xdd, 0xd4, 0xfc, 0xe8, 0x1b, 0xc7, 0x37,
+0xc9, 0x4d, 0x0e, 0x5b, 0x5e, 0x5d, 0x79, 0x53, 0x23, 0x3e, 0xe7, 0x1f, 0xe8, 0xfc, 0x57, 0xda,
+0xa1, 0xbd, 0xce, 0xaa, 0xb4, 0xa3, 0x0c, 0xa8, 0x53, 0xb6, 0x69, 0xcc, 0x50, 0xe7, 0xf2, 0x03,
+0x6f, 0x1f, 0xdd, 0x36, 0xaf, 0x47, 0xf3, 0x4f, 0x3b, 0x4e, 0xc9, 0x42, 0x27, 0x2f, 0x80, 0x15,
+0x2c, 0xf9, 0xeb, 0xdd, 0x91, 0xc7, 0x21, 0xb9, 0x59, 0xb4, 0x39, 0xb9, 0xa1, 0xc6, 0x51, 0xda,
+0x7c, 0xf1, 0x18, 0x09, 0x3f, 0x1e, 0xa7, 0x2e, 0xe1, 0x38, 0x53, 0x3c, 0x0b, 0x39, 0xff, 0x2f,
+0xd5, 0x21, 0xc8, 0x0f, 0x6e, 0xfb, 0x72, 0xe7, 0x8f, 0xd6, 0x99, 0xcb, 0x21, 0xc8, 0x7f, 0xcc,
+0xb3, 0xd7, 0x9a, 0xe7, 0x3c, 0xf9, 0xe2, 0x09, 0x7a, 0x17, 0xa1, 0x20, 0x63, 0x25, 0x39, 0x26,
+0x33, 0x24, 0x89, 0x1f, 0x34, 0x18, 0xf8, 0x0d, 0x78, 0x01, 0x30, 0xf4, 0x6e, 0xe8, 0xa3, 0xe0,
+0x3f, 0xde, 0x99, 0xe1, 0x34, 0xe9, 0x20, 0xf3, 0xd8, 0xfc, 0xcc, 0x04, 0xbc, 0x09, 0x40, 0x0c,
+0x44, 0x0d, 0x42, 0x0e, 0xbc, 0x0f, 0x50, 0x11, 0xc8, 0x11, 0x14, 0x10, 0xa0, 0x0b, 0x16, 0x05,
+0x34, 0xfe, 0xd2, 0xf8, 0x28, 0xf6, 0x0e, 0xf6, 0x7c, 0xf7, 0xde, 0xf8, 0x3e, 0xf9, 0x22, 0xf8,
+0x34, 0xf6, 0xc6, 0xf4, 0x60, 0xf5, 0xe8, 0xf8, 0x60, 0xff, 0x88, 0x07, 0x9e, 0x0f, 0xc4, 0x15,
+0xa2, 0x18, 0x36, 0x18, 0x56, 0x15, 0x2e, 0x11, 0x58, 0x0c, 0xba, 0x06, 0xfc, 0xff, 0x34, 0xf8,
+0xc8, 0xef, 0x96, 0xe7, 0x01, 0xe1, 0xd7, 0xdd, 0x59, 0xdf, 0x2e, 0xe6, 0xb6, 0xf1, 0x84, 0x00,
+0x50, 0x10, 0x71, 0x1e, 0x85, 0x28, 0x6b, 0x2d, 0xf9, 0x2c, 0xb7, 0x27, 0x27, 0x1e, 0x34, 0x11,
+0xf6, 0x01, 0xca, 0xf1, 0x3d, 0xe2, 0xfb, 0xd4, 0xf9, 0xcb, 0x9f, 0xc8, 0x3f, 0xcc, 0xdf, 0xd6,
+0x22, 0xe8, 0xfa, 0xfd, 0xc6, 0x15, 0x65, 0x2b, 0xcd, 0x3b, 0x47, 0x44, 0xe1, 0x43, 0xe9, 0x3a,
+0xe7, 0x2a, 0x34, 0x16, 0x2c, 0xff, 0x86, 0xe8, 0x2f, 0xd4, 0x57, 0xc4, 0x53, 0xba, 0xc5, 0xb7,
+0x6f, 0xbd, 0x15, 0xcc, 0xf5, 0xe2, 0xf2, 0xff, 0xef, 0x1e, 0x23, 0x3b, 0xaf, 0x4f, 0xfe, 0x58,
+0xf4, 0x55, 0xb3, 0x47, 0x23, 0x31, 0xc8, 0x15, 0x30, 0xf9, 0xf1, 0xdd, 0xab, 0xc6, 0x19, 0xb5,
+0xfa, 0xaa, 0x6e, 0xa9, 0x0d, 0xb2, 0x83, 0xc5, 0x03, 0xe3, 0x28, 0x07, 0x5d, 0x2c, 0x8d, 0x4c,
+0xe8, 0x61, 0x58, 0x69, 0xd0, 0x61, 0x25, 0x4e, 0x31, 0x32, 0x94, 0x12, 0x42, 0xf2, 0x59, 0xd4,
+0x29, 0xbb, 0xc8, 0xa8, 0xfc, 0x9e, 0x98, 0x9f, 0x73, 0xac, 0xe3, 0xc5, 0xde, 0xe9, 0x38, 0x13,
+0x79, 0x3b, 0xd4, 0x5b, 0x0a, 0x6f, 0x4e, 0x72, 0x5c, 0x66, 0x8b, 0x4e, 0x5d, 0x2f, 0xda, 0x0c,
+0x5a, 0xea, 0x85, 0xca, 0x37, 0xb0, 0x14, 0x9e, 0x76, 0x96, 0x4a, 0x9b, 0xbd, 0xad, 0x13, 0xcd,
+0x4a, 0xf5, 0x6f, 0x20, 0xa1, 0x47, 0x16, 0x65, 0x82, 0x74, 0x28, 0x74, 0x28, 0x65, 0x0f, 0x4b,
+0x49, 0x2a, 0x44, 0x06, 0x4b, 0xe2, 0x9b, 0xc1, 0xf0, 0xa7, 0x30, 0x98, 0xca, 0x94, 0x1e, 0x9f,
+0xc3, 0xb6, 0x43, 0xd9, 0xa8, 0x01, 0x49, 0x2a, 0x61, 0x4d, 0x6e, 0x66, 0x14, 0x72, 0x1c, 0x6f,
+0xd8, 0x5e, 0x31, 0x44, 0xe3, 0x22, 0x60, 0xfe, 0x8b, 0xda, 0x2f, 0xbb, 0x6a, 0xa4, 0x46, 0x99,
+0x56, 0x9b, 0x5a, 0xaa, 0x77, 0xc4, 0x38, 0xe6, 0x12, 0x0b, 0x77, 0x2e, 0x49, 0x4c, 0xe2, 0x60,
+0xa8, 0x69, 0x50, 0x65, 0x89, 0x54, 0xc9, 0x39, 0x98, 0x18, 0x14, 0xf5, 0x5d, 0xd3, 0x37, 0xb8,
+0x16, 0xa7, 0x16, 0xa2, 0xdc, 0xa8, 0x13, 0xba, 0xff, 0xd2, 0x80, 0xf0, 0x6c, 0x0f, 0x9b, 0x2c,
+0x33, 0x45, 0x12, 0x56, 0xd0, 0x5c, 0x92, 0x57, 0x07, 0x47, 0x3f, 0x2d, 0x06, 0x0e, 0xc4, 0xed,
+0x59, 0xd1, 0x91, 0xbc, 0xcd, 0xb1, 0x81, 0xb1, 0x71, 0xba, 0x5f, 0xca, 0x13, 0xdf, 0x8c, 0xf6,
+0xe6, 0x0e, 0x33, 0x26, 0x0b, 0x3a, 0xb1, 0x47, 0x51, 0x4c, 0x97, 0x46, 0xa3, 0x36, 0x3f, 0x1f,
+0x58, 0x04, 0xb4, 0xea, 0xe9, 0xd5, 0xc3, 0xc8, 0xef, 0xc3, 0x77, 0xc6, 0xa7, 0xce, 0xd9, 0xda,
+0x8c, 0xe9, 0xc8, 0xf9, 0xf6, 0x0a, 0xe8, 0x1b, 0xb3, 0x2a, 0xd9, 0x34, 0xeb, 0x37, 0x8b, 0x32,
+0x73, 0x25, 0x4c, 0x13, 0xc4, 0xff, 0x7e, 0xee, 0x11, 0xe2, 0x51, 0xdb, 0xdf, 0xd9, 0x6f, 0xdc,
+0x9f, 0xe1, 0x22, 0xe8, 0xc6, 0xef, 0xa8, 0xf8, 0xbc, 0x02, 0x76, 0x0d, 0x94, 0x17, 0x15, 0x1f,
+0xf1, 0x21, 0x49, 0x1f, 0xac, 0x17, 0x4a, 0x0d, 0xb8, 0x02, 0x0c, 0xfa, 0x3e, 0xf4, 0x94, 0xf1,
+0x26, 0xf1, 0xcc, 0xf1, 0x88, 0xf2, 0x22, 0xf3, 0xaa, 0xf3, 0x00, 0xf5, 0xa4, 0xf7, 0xec, 0xfb,
+0x46, 0x01, 0xc0, 0x06, 0xf6, 0x0a, 0x08, 0x0d, 0x1a, 0x0d, 0xda, 0x0b, 0x58, 0x0a, 0x30, 0x09,
+0xcc, 0x08, 0x94, 0x08, 0xe4, 0x07, 0xfa, 0x05, 0x1e, 0x02, 0x3a, 0xfc, 0x08, 0xf5, 0xb8, 0xed,
+0xf4, 0xe7, 0x82, 0xe5, 0x6c, 0xe7, 0x3e, 0xed, 0xca, 0xf5, 0x74, 0xff, 0xd2, 0x08, 0x08, 0x11,
+0xaa, 0x17, 0x6d, 0x1c, 0x1b, 0x1f, 0xa9, 0x1f, 0x3f, 0x1d, 0x58, 0x17, 0x88, 0x0d, 0x4c, 0x00,
+0x8e, 0xf0, 0xad, 0xe0, 0xf1, 0xd3, 0x53, 0xcd, 0x95, 0xce, 0xa3, 0xd7, 0x98, 0xe6, 0x68, 0xf8,
+0x4e, 0x0a, 0x3a, 0x1a, 0xa3, 0x26, 0x51, 0x2f, 0xf9, 0x33, 0x4b, 0x34, 0x8f, 0x2f, 0x0d, 0x25,
+0xa2, 0x14, 0xf0, 0xfe, 0x96, 0xe6, 0x39, 0xcf, 0xa9, 0xbd, 0xa9, 0xb5, 0x49, 0xb9, 0x57, 0xc7,
+0x21, 0xdd, 0x5a, 0xf6, 0xf2, 0x0e, 0x51, 0x24, 0xef, 0x34, 0x3f, 0x40, 0xab, 0x45, 0xcf, 0x44,
+0xdb, 0x3c, 0xc7, 0x2c, 0x0a, 0x15, 0xaa, 0xf7, 0x4b, 0xd8, 0x63, 0xbc, 0x40, 0xa9, 0xc4, 0xa2,
+0xc6, 0xa9, 0xe7, 0xbc, 0x37, 0xd8, 0x24, 0xf7, 0x2e, 0x15, 0x77, 0x2f, 0x03, 0x44, 0xd5, 0x51,
+0xbe, 0x57, 0x29, 0x54, 0x7b, 0x46, 0xdb, 0x2e, 0x64, 0x0f, 0x6c, 0xeb, 0x57, 0xc8, 0xb7, 0xab,
+0x56, 0x9a, 0x1c, 0x97, 0x2e, 0xa2, 0x91, 0xb9, 0xff, 0xd8, 0xf2, 0xfb, 0x9f, 0x1d, 0x01, 0x3b,
+0xbd, 0x51, 0xbe, 0x5f, 0x3a, 0x63, 0xf6, 0x5a, 0x1f, 0x47, 0x4f, 0x29, 0x04, 0x05, 0xab, 0xde,
+0x61, 0xbb, 0x42, 0xa0, 0x5e, 0x91, 0xa8, 0x90, 0x36, 0x9e, 0x37, 0xb8, 0xdd, 0xda, 0x4a, 0x01,
+0xb3, 0x26, 0xf3, 0x46, 0x9a, 0x5e, 0xd8, 0x6a, 0x04, 0x6a, 0xba, 0x5b, 0xe1, 0x41, 0xdb, 0x1f,
+0xaa, 0xf9, 0xed, 0xd3, 0xff, 0xb2, 0x0e, 0x9b, 0xd6, 0x8e, 0x74, 0x90, 0x40, 0xa0, 0x83, 0xbc,
+0xc5, 0xe1, 0xbc, 0x0a, 0xe1, 0x31, 0xe7, 0x51, 0xfe, 0x66, 0x40, 0x6e, 0x36, 0x67, 0x7d, 0x53,
+0x69, 0x36, 0xcc, 0x13, 0x86, 0xef, 0x3b, 0xcd, 0xff, 0xaf, 0x4c, 0x9b, 0xa8, 0x91, 0x42, 0x95,
+0xbc, 0xa6, 0xf7, 0xc4, 0xc4, 0xeb, 0x64, 0x15, 0x79, 0x3b, 0x70, 0x58, 0x70, 0x68, 0x16, 0x6a,
+0x60, 0x5e, 0x15, 0x48, 0x1b, 0x2b, 0xc2, 0x0a, 0x1c, 0xea, 0x9d, 0xcb, 0x47, 0xb2, 0x94, 0xa0,
+0x60, 0x99, 0xcc, 0x9e, 0xed, 0xb1, 0xb3, 0xd0, 0xd2, 0xf6, 0xef, 0x1d, 0x83, 0x3f, 0x92, 0x56,
+0x90, 0x60, 0xa6, 0x5d, 0xab, 0x4f, 0x03, 0x3a, 0xef, 0x1f, 0x02, 0x04, 0x46, 0xe8, 0xd1, 0xce,
+0x9b, 0xb9, 0x65, 0xab, 0xbe, 0xa6, 0xb9, 0xad, 0xeb, 0xc0, 0x1b, 0xde, 0x78, 0x00, 0x9f, 0x21,
+0x45, 0x3c, 0x91, 0x4c, 0xa3, 0x51, 0x6d, 0x4c, 0x59, 0x3f, 0xc9, 0x2c, 0x5c, 0x17, 0xb4, 0x00,
+0x2a, 0xea, 0x75, 0xd5, 0x95, 0xc4, 0xdd, 0xb9, 0x85, 0xb7, 0x67, 0xbf, 0xe7, 0xd0, 0xdc, 0xe9,
+0x76, 0x05, 0xe9, 0x1e, 0xe9, 0x31, 0xbd, 0x3c, 0xff, 0x3e, 0xc3, 0x39, 0xbd, 0x2e, 0x09, 0x20,
+0x42, 0x0f, 0xf8, 0xfd, 0x58, 0xed, 0xb9, 0xde, 0x85, 0xd3, 0x33, 0xcd, 0x05, 0xcd, 0x7d, 0xd3,
+0x43, 0xe0, 0x56, 0xf1, 0xe2, 0x03, 0x82, 0x14, 0x07, 0x21, 0xe1, 0x27, 0x0f, 0x29, 0x3f, 0x25,
+0xc3, 0x1d, 0x00, 0x14, 0x6e, 0x09, 0x24, 0xff, 0xe0, 0xf5, 0x48, 0xee, 0xb0, 0xe8, 0x56, 0xe5,
+0x56, 0xe4, 0x30, 0xe6, 0x18, 0xeb, 0x98, 0xf2, 0xb6, 0xfb, 0xc6, 0x04, 0x32, 0x0c, 0xd0, 0x10,
+0x52, 0x12, 0x22, 0x11, 0x1a, 0x0e, 0x8c, 0x0a, 0x6c, 0x07, 0x62, 0x05, 0x24, 0x04, 0x12, 0x03,
+0x14, 0x01, 0xa4, 0xfd, 0xca, 0xf8, 0x88, 0xf3, 0x9a, 0xef, 0x00, 0xee, 0x1a, 0xef, 0x0e, 0xf2,
+0xc0, 0xf5, 0x24, 0xf9, 0xd2, 0xfb, 0x2e, 0xfe, 0xec, 0x00, 0xf8, 0x04, 0x96, 0x0a, 0x38, 0x11,
+0x32, 0x17, 0x86, 0x1a, 0x76, 0x19, 0x50, 0x13, 0xd8, 0x08, 0x26, 0xfc, 0xfe, 0xef, 0x84, 0xe6,
+0xef, 0xe0, 0xef, 0xde, 0xbd, 0xdf, 0xb1, 0xe2, 0x76, 0xe7, 0x70, 0xee, 0x30, 0xf8, 0xdc, 0x04,
+0x64, 0x13, 0xb9, 0x21, 0xf9, 0x2c, 0x27, 0x32, 0x9b, 0x2f, 0x1b, 0x25, 0x64, 0x14, 0x70, 0x00,
+0xc0, 0xec, 0x55, 0xdc, 0xc5, 0xd0, 0x99, 0xca, 0x97, 0xc9, 0x7d, 0xcd, 0x41, 0xd6, 0x1c, 0xe4,
+0x88, 0xf6, 0x08, 0x0c, 0x09, 0x22, 0x2b, 0x35, 0x15, 0x42, 0x37, 0x46, 0x99, 0x40, 0x87, 0x31,
+0x48, 0x1b, 0x38, 0x01, 0x16, 0xe7, 0x55, 0xd0, 0x77, 0xbf, 0xf3, 0xb5, 0x81, 0xb4, 0x5f, 0xbb,
+0x41, 0xca, 0x15, 0xe0, 0xb4, 0xfa, 0x1a, 0x17, 0x91, 0x31, 0x91, 0x46, 0x45, 0x53, 0xb8, 0x55,
+0x1f, 0x4d, 0x3b, 0x3a, 0x3d, 0x1f, 0x96, 0xff, 0x57, 0xdf, 0xe7, 0xc2, 0xcf, 0xad, 0xda, 0xa2,
+0x72, 0xa3, 0x85, 0xaf, 0x7f, 0xc5, 0xc5, 0xe2, 0x8e, 0x03, 0xbd, 0x23, 0xaf, 0x3f, 0x81, 0x54,
+0xda, 0x5f, 0x30, 0x60, 0xb9, 0x54, 0x2b, 0x3e, 0x8b, 0x1e, 0x94, 0xf9, 0x1f, 0xd4, 0x77, 0xb3,
+0xd2, 0x9c, 0x7e, 0x93, 0xba, 0x98, 0x26, 0xab, 0xd5, 0xc7, 0x62, 0xea, 0x44, 0x0e, 0x55, 0x2f,
+0xad, 0x4a, 0xf8, 0x5d, 0x6c, 0x67, 0x62, 0x65, 0xee, 0x56, 0xc1, 0x3c, 0x18, 0x19, 0x02, 0xf0,
+0x41, 0xc7, 0xae, 0xa5, 0xd0, 0x90, 0xec, 0x8b, 0xd0, 0x96, 0xc9, 0xae, 0x75, 0xcf, 0xee, 0xf3,
+0x9a, 0x17, 0x43, 0x37, 0xaf, 0x50, 0x1a, 0x62, 0xb6, 0x69, 0x6a, 0x65, 0x77, 0x54, 0x27, 0x37,
+0x60, 0x10, 0xea, 0xe4, 0xdd, 0xbb, 0x48, 0x9c, 0xca, 0x8b, 0x14, 0x8c, 0x88, 0x9b, 0x65, 0xb6,
+0x0d, 0xd8, 0xc4, 0xfb, 0xad, 0x1d, 0x81, 0x3b, 0x17, 0x53, 0xae, 0x62, 0xf2, 0x67, 0xf6, 0x60,
+0xbd, 0x4c, 0xbd, 0x2c, 0x72, 0x04, 0xdd, 0xd9, 0x1d, 0xb4, 0xfa, 0x99, 0x28, 0x8f, 0xf8, 0x93,
+0xf4, 0xa5, 0x43, 0xc1, 0xcf, 0xe1, 0x66, 0x03, 0xe9, 0x22, 0xed, 0x3d, 0x8f, 0x52, 0x86, 0x5e,
+0xe2, 0x5f, 0x34, 0x55, 0xcf, 0x3e, 0xd1, 0x1e, 0x4c, 0xf9, 0xeb, 0xd3, 0xef, 0xb4, 0x42, 0xa1,
+0x0a, 0x9b, 0x00, 0xa2, 0xa9, 0xb3, 0xf5, 0xcc, 0x2a, 0xea, 0x0c, 0x08, 0x9b, 0x23, 0x8d, 0x3a,
+0xf5, 0x4a, 0xeb, 0x52, 0xf5, 0x50, 0xcd, 0x44, 0x6b, 0x2f, 0x3c, 0x13, 0xe6, 0xf3, 0xbb, 0xd5,
+0x75, 0xbd, 0x63, 0xae, 0x64, 0xaa, 0x75, 0xb1, 0xe9, 0xc1, 0xa9, 0xd8, 0xa0, 0xf2, 0x60, 0x0c,
+0x33, 0x23, 0xe3, 0x34, 0xe9, 0x3f, 0x1f, 0x43, 0x6b, 0x3e, 0x7b, 0x32, 0xd7, 0x20, 0x52, 0x0b,
+0x30, 0xf4, 0x59, 0xde, 0xcd, 0xcc, 0x11, 0xc2, 0x99, 0xbf, 0x83, 0xc5, 0x9f, 0xd2, 0xc0, 0xe4,
+0x02, 0xf9, 0x8c, 0x0c, 0xb9, 0x1c, 0x0d, 0x28, 0xa7, 0x2d, 0xcb, 0x2d, 0x4b, 0x29, 0x3b, 0x21,
+0x66, 0x16, 0x60, 0x09, 0xdc, 0xfa, 0x48, 0xec, 0xab, 0xdf, 0x55, 0xd7, 0xf5, 0xd4, 0x07, 0xd9,
+0xa3, 0xe2, 0xb4, 0xef, 0x68, 0xfd, 0x50, 0x09, 0xc2, 0x11, 0x42, 0x16, 0x5c, 0x17, 0x8a, 0x16,
+0xe8, 0x14, 0xfa, 0x12, 0x50, 0x10, 0x08, 0x0c, 0x70, 0x05, 0x2c, 0xfd, 0xa0, 0xf4, 0x1c, 0xee,
+0x40, 0xeb, 0x82, 0xec, 0xe2, 0xf0, 0x7c, 0xf6, 0x6e, 0xfb, 0x64, 0xfe, 0x38, 0xff, 0xca, 0xfe,
+0xa8, 0xfe, 0x26, 0x00, 0x02, 0x04, 0x8e, 0x09, 0x3c, 0x0f, 0x20, 0x13, 0xd8, 0x13, 0x08, 0x11,
+0xfe, 0x0b, 0x48, 0x06, 0x5e, 0x01, 0x76, 0xfd, 0x1a, 0xfa, 0x7a, 0xf6, 0x18, 0xf2, 0x3a, 0xed,
+0xd8, 0xe8, 0x98, 0xe6, 0xd2, 0xe7, 0x7c, 0xed, 0x3c, 0xf7, 0xda, 0x03, 0x0e, 0x11, 0x6b, 0x1c,
+0xc3, 0x23, 0x1f, 0x26, 0xd5, 0x23, 0xc3, 0x1d, 0xf0, 0x14, 0x10, 0x0a, 0xc4, 0xfd, 0xd6, 0xf0,
+0x66, 0xe4, 0xc7, 0xd9, 0xbf, 0xd2, 0x89, 0xd0, 0x61, 0xd4, 0x3d, 0xde, 0xaa, 0xed, 0xf2, 0x00,
+0xa8, 0x15, 0x3b, 0x28, 0xdf, 0x35, 0x6b, 0x3c, 0x07, 0x3b, 0x55, 0x32, 0x45, 0x23, 0xfc, 0x0f,
+0xaa, 0xfa, 0xce, 0xe5, 0x7d, 0xd3, 0xd9, 0xc5, 0x29, 0xbe, 0xa3, 0xbd, 0xa7, 0xc4, 0x29, 0xd3,
+0x8a, 0xe8, 0xda, 0x02, 0xc7, 0x1e, 0x2d, 0x38, 0xa1, 0x4a, 0x01, 0x53, 0xd1, 0x4f, 0x8f, 0x41,
+0xf9, 0x2a, 0x9e, 0x0f, 0x5a, 0xf3, 0x3b, 0xd9, 0xed, 0xc3, 0xfd, 0xb4, 0xeb, 0xad, 0x3b, 0xaf,
+0x69, 0xb9, 0xa7, 0xcc, 0x0a, 0xe8, 0x12, 0x09, 0x1b, 0x2b, 0x29, 0x49, 0x76, 0x5d, 0x94, 0x64,
+0x0a, 0x5d, 0xcd, 0x48, 0xed, 0x2b, 0x4a, 0x0b, 0xe8, 0xea, 0x0f, 0xce, 0x37, 0xb7, 0x0e, 0xa8,
+0xfe, 0xa1, 0x78, 0xa5, 0x73, 0xb3, 0xff, 0xcb, 0x72, 0xed, 0xf4, 0x13, 0x25, 0x3a, 0x76, 0x59,
+0xa2, 0x6c, 0xec, 0x6f, 0x50, 0x63, 0xf5, 0x49, 0xef, 0x28, 0x2c, 0x05, 0xb5, 0xe2, 0x77, 0xc4,
+0x15, 0xad, 0x8c, 0x9e, 0xf8, 0x99, 0xc4, 0xa0, 0x57, 0xb3, 0x49, 0xd1, 0x96, 0xf7, 0x3d, 0x21,
+0xef, 0x47, 0x84, 0x65, 0xea, 0x74, 0xc8, 0x73, 0x36, 0x63, 0xe1, 0x46, 0xf1, 0x23, 0xce, 0xfe,
+0x5b, 0xdb, 0xa5, 0xbc, 0xae, 0xa5, 0xa4, 0x98, 0x18, 0x97, 0x0a, 0xa2, 0x77, 0xb9, 0x7f, 0xdb,
+0xda, 0x03, 0x01, 0x2d, 0xdb, 0x50, 0x48, 0x6a, 0x48, 0x75, 0xb4, 0x70, 0xf4, 0x5d, 0xb7, 0x40,
+0x5d, 0x1d, 0x16, 0xf8, 0xab, 0xd4, 0xdd, 0xb6, 0xdc, 0xa1, 0x12, 0x98, 0xe2, 0x9a, 0x62, 0xaa,
+0x87, 0xc5, 0xc2, 0xe8, 0x64, 0x0f, 0x63, 0x34, 0x23, 0x53, 0x86, 0x67, 0xec, 0x6e, 0x32, 0x68,
+0xde, 0x54, 0xff, 0x37, 0x3a, 0x15, 0xe2, 0xf0, 0x25, 0xcf, 0x21, 0xb4, 0x52, 0xa3, 0x64, 0x9e,
+0xd6, 0xa5, 0xcd, 0xb8, 0x6f, 0xd4, 0xfa, 0xf4, 0x54, 0x16, 0xef, 0x34, 0xa3, 0x4d, 0x98, 0x5d,
+0x7c, 0x62, 0x56, 0x5b, 0xdd, 0x48, 0x47, 0x2d, 0x7c, 0x0c, 0x9c, 0xea, 0xa9, 0xcc, 0xad, 0xb6,
+0x5f, 0xab, 0xa3, 0xab, 0x73, 0xb6, 0xe1, 0xc9, 0x65, 0xe2, 0x32, 0xfd, 0x66, 0x17, 0x35, 0x2f,
+0x75, 0x42, 0xf7, 0x4e, 0x75, 0x52, 0x93, 0x4b, 0x81, 0x3a, 0x59, 0x21, 0x2c, 0x04, 0x74, 0xe7,
+0xcb, 0xcf, 0x89, 0xc0, 0xef, 0xba, 0xab, 0xbe, 0xc3, 0xc9, 0xd1, 0xd9, 0x8c, 0xec, 0xb6, 0xff,
+0x9a, 0x12, 0x29, 0x24, 0xeb, 0x32, 0xaf, 0x3c, 0x75, 0x3f, 0x53, 0x39, 0xe5, 0x2a, 0x58, 0x16,
+0x48, 0xff, 0x4c, 0xea, 0x5b, 0xda, 0xaf, 0xd1, 0x27, 0xd0, 0x81, 0xd4, 0xbf, 0xdc, 0x34, 0xe7,
+0x70, 0xf2, 0x20, 0xfe, 0x24, 0x0a, 0xe8, 0x15, 0x8d, 0x20, 0xed, 0x27, 0x45, 0x2a, 0x55, 0x26,
+0x5d, 0x1c, 0x9a, 0x0e, 0xf2, 0xff, 0x50, 0xf3, 0xb2, 0xea, 0x96, 0xe6, 0x6a, 0xe6, 0xfc, 0xe8,
+0xec, 0xec, 0x1a, 0xf1, 0x80, 0xf5, 0x18, 0xfa, 0x4c, 0xff, 0x2c, 0x05, 0x6c, 0x0b, 0xda, 0x10,
+0x0c, 0x14, 0x38, 0x14, 0x30, 0x11, 0x42, 0x0c, 0xc4, 0x06, 0x38, 0x02, 0x4c, 0xff, 0xda, 0xfd,
+0x42, 0xfd, 0xba, 0xfc, 0x50, 0xfb, 0xd6, 0xf8, 0x9a, 0xf5, 0x3c, 0xf2, 0xf8, 0xef, 0xd8, 0xef,
+0x6a, 0xf2, 0xb6, 0xf7, 0x84, 0xfe, 0x8e, 0x05, 0xf2, 0x0b, 0xc8, 0x10, 0x52, 0x14, 0x5e, 0x16,
+0xce, 0x16, 0xba, 0x15, 0xf0, 0x12, 0xde, 0x0d, 0x92, 0x06, 0xe6, 0xfc, 0x98, 0xf1, 0x24, 0xe6,
+0xa1, 0xdc, 0xb5, 0xd7, 0x07, 0xd9, 0xe3, 0xe0, 0xec, 0xed, 0xc0, 0xfd, 0x5c, 0x0d, 0xe0, 0x1a,
+0x8b, 0x24, 0x57, 0x2a, 0x43, 0x2c, 0x5d, 0x2a, 0xab, 0x24, 0x26, 0x1b, 0x7c, 0x0d, 0x38, 0xfc,
+0xbe, 0xe8, 0xa1, 0xd5, 0xcf, 0xc6, 0xa5, 0xbf, 0x6f, 0xc2, 0x25, 0xcf, 0x83, 0xe3, 0x7e, 0xfb,
+0x1e, 0x13, 0xed, 0x26, 0x5b, 0x35, 0xb3, 0x3d, 0x3d, 0x40, 0xf5, 0x3c, 0xc9, 0x33, 0xbd, 0x24,
+0xe4, 0x0f, 0xb4, 0xf6, 0xbd, 0xdb, 0x2d, 0xc3, 0xcb, 0xb1, 0xb7, 0xab, 0x63, 0xb2, 0xc5, 0xc4,
+0x71, 0xdf, 0xde, 0xfd, 0xd0, 0x1a, 0xd5, 0x32, 0x53, 0x44, 0x7f, 0x4e, 0x2d, 0x51, 0xe7, 0x4b,
+0x61, 0x3e, 0x93, 0x28, 0x30, 0x0c, 0x4e, 0xeb, 0x9f, 0xca, 0x3f, 0xaf, 0x28, 0x9e, 0x30, 0x9b,
+0xb8, 0xa6, 0xc9, 0xbe, 0x57, 0xdf, 0xb8, 0x02, 0xc9, 0x23, 0x47, 0x3f, 0xcb, 0x52, 0x6c, 0x5d,
+0x36, 0x5e, 0x79, 0x54, 0xa9, 0x40, 0x05, 0x24, 0x2e, 0x01, 0x5d, 0xdc, 0x51, 0xba, 0x90, 0xa0,
+0x1e, 0x93, 0x12, 0x94, 0x70, 0xa3, 0xf3, 0xbe, 0x71, 0xe2, 0x7a, 0x08, 0x5b, 0x2c, 0xef, 0x49,
+0xc8, 0x5e, 0x90, 0x68, 0x4c, 0x66, 0x94, 0x57, 0xd5, 0x3d, 0x04, 0x1c, 0xc0, 0xf5, 0x1b, 0xd0,
+0xb1, 0xaf, 0x20, 0x99, 0x10, 0x8f, 0xce, 0x92, 0x28, 0xa4, 0x43, 0xc1, 0x60, 0xe6, 0x6c, 0x0e,
+0x39, 0x34, 0x05, 0x53, 0x54, 0x67, 0x42, 0x6e, 0xfa, 0x66, 0xdf, 0x52, 0x83, 0x34, 0x46, 0x10,
+0x78, 0xea, 0x3f, 0xc7, 0xde, 0xaa, 0x06, 0x98, 0xc8, 0x90, 0x8a, 0x96, 0x48, 0xa9, 0xd1, 0xc7,
+0x76, 0xee, 0xa0, 0x17, 0x89, 0x3d, 0xce, 0x5a, 0x1a, 0x6b, 0xc2, 0x6c, 0x00, 0x60, 0xc3, 0x47,
+0x09, 0x28, 0x16, 0x05, 0xa5, 0xe2, 0x2b, 0xc4, 0x13, 0xac, 0x92, 0x9c, 0xae, 0x97, 0x98, 0x9e,
+0x77, 0xb2, 0x93, 0xd1, 0x24, 0xf8, 0x2f, 0x20, 0x4d, 0x43, 0xf8, 0x5b, 0xba, 0x66, 0x0c, 0x63,
+0xcf, 0x52, 0xd5, 0x39, 0x20, 0x1c, 0x48, 0xfd, 0xff, 0xdf, 0x89, 0xc6, 0x83, 0xb2, 0x08, 0xa6,
+0x16, 0xa3, 0x5d, 0xab, 0xaf, 0xbf, 0xfd, 0xdd, 0x0c, 0x02, 0xe5, 0x25, 0x33, 0x43, 0x7c, 0x55,
+0xc6, 0x5a, 0x77, 0x53, 0xc7, 0x42, 0x07, 0x2c, 0xa8, 0x12, 0x48, 0xf9, 0x9d, 0xe1, 0x29, 0xcd,
+0x7d, 0xbd, 0x3b, 0xb4, 0x3d, 0xb3, 0x4f, 0xbc, 0x11, 0xcf, 0xd6, 0xe9, 0x2a, 0x08, 0xb1, 0x24,
+0x95, 0x3a, 0xc5, 0x46, 0x21, 0x48, 0xad, 0x40, 0x4f, 0x32, 0x3f, 0x20, 0xa8, 0x0c, 0x14, 0xf9,
+0x36, 0xe7, 0xf3, 0xd7, 0xd1, 0xcc, 0xe7, 0xc6, 0xb3, 0xc7, 0x97, 0xcf, 0x85, 0xde, 0x5e, 0xf2,
+0x2a, 0x08, 0x06, 0x1c, 0xcd, 0x2a, 0x65, 0x32, 0xdb, 0x32, 0xff, 0x2c, 0xb5, 0x22, 0xea, 0x15,
+0x1c, 0x08, 0xf2, 0xfa, 0x44, 0xef, 0x18, 0xe6, 0xdd, 0xdf, 0xf3, 0xdc, 0x91, 0xdd, 0xdd, 0xe1,
+0xc2, 0xe9, 0x9a, 0xf4, 0xe2, 0x00, 0xec, 0x0c, 0x3c, 0x16, 0xda, 0x1b, 0xf7, 0x1c, 0x1a, 0x1a,
+0x72, 0x14, 0x44, 0x0d, 0x6a, 0x06, 0xb0, 0x00, 0xaa, 0xfc, 0xe6, 0xf9, 0xe6, 0xf7, 0xbe, 0xf5,
+0x3a, 0xf3, 0xc4, 0xf0, 0x82, 0xef, 0xa0, 0xf0, 0x32, 0xf4, 0x80, 0xf9, 0x1c, 0xff, 0xa2, 0x03,
+0x56, 0x06, 0x48, 0x07, 0x3a, 0x07, 0x76, 0x07, 0xd0, 0x08, 0x6e, 0x0b, 0x9e, 0x0e, 0xbc, 0x10,
+0x30, 0x10, 0xf4, 0x0b, 0xd4, 0x03, 0x96, 0xf9, 0x74, 0xef, 0x1a, 0xe8, 0xb4, 0xe4, 0xfe, 0xe4,
+0xfa, 0xe7, 0x76, 0xec, 0xa8, 0xf1, 0x7e, 0xf7, 0x80, 0xfe, 0x26, 0x07, 0x66, 0x11, 0xb2, 0x1b,
+0x35, 0x24, 0x8b, 0x28, 0xb5, 0x26, 0x19, 0x1e, 0x72, 0x0f, 0x80, 0xfd, 0x94, 0xeb, 0x05, 0xdd,
+0x95, 0xd3, 0xe7, 0xcf, 0x45, 0xd1, 0x9f, 0xd6, 0x99, 0xdf, 0x8e, 0xeb, 0xbe, 0xfa, 0x5e, 0x0c,
+0x83, 0x1e, 0xed, 0x2e, 0x4f, 0x3a, 0x55, 0x3e, 0x69, 0x39, 0x71, 0x2b, 0x88, 0x16, 0xb0, 0xfd,
+0x3a, 0xe5, 0x7d, 0xd0, 0x67, 0xc2, 0xd3, 0xbb, 0xd7, 0xbc, 0xe3, 0xc4, 0x05, 0xd3, 0x96, 0xe6,
+0x28, 0xfe, 0x66, 0x17, 0x35, 0x2f, 0x2d, 0x42, 0x67, 0x4d, 0x0b, 0x4f, 0x03, 0x46, 0x6f, 0x33,
+0x36, 0x19, 0x10, 0xfb, 0xbb, 0xdc, 0xd5, 0xc2, 0xbb, 0xb0, 0x9c, 0xa8, 0x18, 0xab, 0x8f, 0xb7,
+0xc5, 0xcc, 0x52, 0xe8, 0x12, 0x07, 0x53, 0x25, 0x7f, 0x3f, 0x57, 0x52, 0xf2, 0x5b, 0xa6, 0x5a,
+0x5d, 0x4e, 0xd3, 0x37, 0x50, 0x19, 0x26, 0xf6, 0xe9, 0xd2, 0x9d, 0xb4, 0x04, 0xa0, 0x1a, 0x98,
+0xc4, 0x9d, 0x43, 0xb0, 0xb7, 0xcc, 0x3c, 0xef, 0xf0, 0x12, 0x99, 0x33, 0xa3, 0x4d, 0xe2, 0x5e,
+0xaa, 0x65, 0x5c, 0x61, 0xb5, 0x51, 0x8f, 0x37, 0x02, 0x15, 0x92, 0xed, 0x89, 0xc6, 0x02, 0xa6,
+0x9a, 0x91, 0xc0, 0x8c, 0x04, 0x98, 0xeb, 0xb0, 0x6f, 0xd3, 0xac, 0xf9, 0xad, 0x1e, 0x6f, 0x3e,
+0x5c, 0x56, 0x14, 0x65, 0x38, 0x69, 0x2e, 0x62, 0xc7, 0x4f, 0xa9, 0x32, 0xe6, 0x0c, 0xd1, 0xe2,
+0x8b, 0xba, 0x24, 0x9b, 0x5a, 0x8a, 0xaa, 0x8a, 0x40, 0x9b, 0x7f, 0xb8, 0xb9, 0xdc, 0xb2, 0x02,
+0xb3, 0x25, 0xad, 0x42, 0x36, 0x58, 0x96, 0x64, 0xb6, 0x66, 0x96, 0x5d, 0xc5, 0x48, 0x59, 0x29,
+0x0c, 0x02, 0xe5, 0xd7, 0xc5, 0xb1, 0xc2, 0x96, 0x48, 0x8b, 0xb2, 0x90, 0xe2, 0xa4, 0x2b, 0xc3,
+0xa4, 0xe6, 0x2c, 0x0a, 0xfb, 0x29, 0x33, 0x44, 0xca, 0x56, 0x7a, 0x60, 0x0e, 0x60, 0x4d, 0x54,
+0x97, 0x3d, 0x39, 0x1d, 0xbc, 0xf6, 0xb9, 0xcf, 0xd3, 0xae, 0x96, 0x99, 0x80, 0x93, 0x8a, 0x9c,
+0xa3, 0xb1, 0xf1, 0xce, 0x80, 0xef, 0x44, 0x0f, 0x75, 0x2b, 0xb9, 0x41, 0xc9, 0x50, 0x44, 0x57,
+0xb5, 0x53, 0x25, 0x46, 0x25, 0x2f, 0xce, 0x10, 0x04, 0xef, 0xbb, 0xce, 0x0b, 0xb5, 0x00, 0xa6,
+0x72, 0xa3, 0xdb, 0xac, 0x37, 0xc0, 0xad, 0xd9, 0xc2, 0xf5, 0x16, 0x11, 0xe1, 0x28, 0x19, 0x3b,
+0x41, 0x46, 0xf9, 0x48, 0xfb, 0x42, 0xc9, 0x34, 0x27, 0x20, 0x6c, 0x07, 0x74, 0xed, 0x65, 0xd5,
+0xb1, 0xc2, 0x0b, 0xb8, 0xb5, 0xb6, 0xf9, 0xbe, 0xe9, 0xce, 0x18, 0xe4, 0x20, 0xfb, 0x2c, 0x11,
+0x73, 0x23, 0x3b, 0x30, 0x3d, 0x36, 0x87, 0x35, 0xcf, 0x2e, 0x61, 0x23, 0xa2, 0x14, 0x12, 0x04,
+0xb4, 0xf2, 0x47, 0xe2, 0xdb, 0xd4, 0x85, 0xcc, 0x35, 0xcb, 0x07, 0xd1, 0x3f, 0xdd, 0x3a, 0xed,
+0x5a, 0xfe, 0x9e, 0x0d, 0x12, 0x19, 0x8d, 0x1f, 0x11, 0x21, 0xc1, 0x1e, 0x0a, 0x1a, 0xe4, 0x13,
+0x26, 0x0d, 0x86, 0x05, 0xfe, 0xfc, 0xd6, 0xf3, 0x04, 0xeb, 0x7e, 0xe4, 0xed, 0xe1, 0x34, 0xe4,
+0x88, 0xea, 0x56, 0xf3, 0x38, 0xfc, 0x68, 0x03, 0xfa, 0x07, 0x94, 0x09, 0x8a, 0x09, 0x22, 0x09,
+0x5c, 0x09, 0xce, 0x0a, 0x96, 0x0c, 0x7a, 0x0d, 0x46, 0x0c, 0x44, 0x08, 0x64, 0x02, 0x60, 0xfc,
+0xc8, 0xf7, 0x60, 0xf5, 0xe4, 0xf4, 0x20, 0xf5, 0x0e, 0xf5, 0x24, 0xf4, 0x5a, 0xf2, 0x16, 0xf1,
+0x9c, 0xf1, 0x08, 0xf5, 0xce, 0xfb, 0xfa, 0x04, 0xde, 0x0e, 0x70, 0x17, 0x85, 0x1c, 0x53, 0x1d,
+0x20, 0x1a, 0xd4, 0x13, 0xe8, 0x0b, 0x2e, 0x03, 0xf4, 0xf9, 0xa0, 0xf0, 0xb8, 0xe7, 0x05, 0xe0,
+0xe5, 0xda, 0x63, 0xd9, 0xb9, 0xdc, 0x52, 0xe5, 0x94, 0xf2, 0x0a, 0x03, 0x8c, 0x14, 0x2d, 0x24,
+0x3f, 0x2f, 0x07, 0x34, 0x97, 0x31, 0xfb, 0x28, 0x44, 0x1b, 0x52, 0x0a, 0xf8, 0xf7, 0x2a, 0xe6,
+0x9d, 0xd6, 0x45, 0xcb, 0x1f, 0xc5, 0x69, 0xc5, 0x7b, 0xcc, 0x47, 0xda, 0xc2, 0xed, 0x10, 0x05,
+0x73, 0x1d, 0x45, 0x33, 0x3d, 0x43, 0x27, 0x4a, 0x03, 0x47, 0xed, 0x39, 0x27, 0x25, 0x9e, 0x0b,
+0xfe, 0xf0, 0x53, 0xd8, 0xbd, 0xc4, 0xbf, 0xb7, 0xa9, 0xb2, 0xa3, 0xb5, 0xe3, 0xc0, 0xc9, 0xd3,
+0x12, 0xed, 0xae, 0x0a, 0x05, 0x29, 0x1f, 0x44, 0x06, 0x57, 0x1c, 0x5e, 0x6a, 0x57, 0x2b, 0x44,
+0x93, 0x27, 0xb0, 0x06, 0x10, 0xe6, 0xfd, 0xc9, 0x07, 0xb5, 0xba, 0xa8, 0x4e, 0xa5, 0xfe, 0xaa,
+0xe1, 0xb9, 0x75, 0xd1, 0x98, 0xf0, 0xee, 0x13, 0x71, 0x37, 0x72, 0x55, 0x68, 0x68, 0x58, 0x6c,
+0x44, 0x60, 0x73, 0x46, 0x15, 0x24, 0xae, 0xfe, 0x61, 0xdb, 0x33, 0xbe, 0x90, 0xa9, 0x70, 0x9e,
+0x30, 0x9d, 0xea, 0xa5, 0xa3, 0xb8, 0x27, 0xd5, 0xe2, 0xf8, 0x5d, 0x20, 0x13, 0x46, 0xb6, 0x63,
+0xe0, 0x73, 0x10, 0x73, 0x96, 0x61, 0x65, 0x43, 0xfd, 0x1d, 0x02, 0xf7, 0x5f, 0xd3, 0x6b, 0xb6,
+0x96, 0xa2, 0xfc, 0x98, 0x00, 0x9a, 0x20, 0xa6, 0x67, 0xbd, 0x49, 0xde, 0x7c, 0x05, 0x23, 0x2e,
+0x37, 0x52, 0x22, 0x6c, 0x28, 0x77, 0x84, 0x71, 0xbc, 0x5c, 0xc5, 0x3c, 0x04, 0x17, 0x7a, 0xf0,
+0x75, 0xcd, 0x63, 0xb1, 0xf0, 0x9e, 0x5a, 0x97, 0xb2, 0x9b, 0x03, 0xac, 0x81, 0xc7, 0x34, 0xeb,
+0x8a, 0x12, 0x29, 0x38, 0x30, 0x57, 0x54, 0x6b, 0x9c, 0x71, 0x48, 0x69, 0xdd, 0x53, 0xe9, 0x34,
+0xae, 0x10, 0x96, 0xeb, 0xed, 0xc9, 0xc9, 0xaf, 0xcc, 0x9f, 0xf2, 0x9b, 0x86, 0xa4, 0xd5, 0xb8,
+0x73, 0xd6, 0x44, 0xf9, 0x7f, 0x1c, 0xfb, 0x3b, 0x8f, 0x54, 0x5e, 0x63, 0xa6, 0x66, 0x84, 0x5d,
+0x03, 0x49, 0xc3, 0x2b, 0x92, 0x09, 0xaa, 0xe6, 0xdf, 0xc7, 0x3f, 0xb1, 0xbc, 0xa5, 0x50, 0xa6,
+0x5b, 0xb2, 0x2b, 0xc8, 0x46, 0xe4, 0xb8, 0x02, 0x83, 0x1f, 0x53, 0x38, 0x17, 0x4b, 0x1c, 0x56,
+0xc6, 0x57, 0x07, 0x4f, 0x67, 0x3c, 0xdb, 0x21, 0xc4, 0x02, 0xaf, 0xe3, 0xb1, 0xc9, 0x93, 0xb8,
+0x81, 0xb2, 0x23, 0xb7, 0xbb, 0xc4, 0x6b, 0xd8, 0x58, 0xef, 0x40, 0x06, 0x60, 0x1b, 0x8f, 0x2d,
+0xc9, 0x3b, 0x77, 0x44, 0xb5, 0x45, 0x49, 0x3e, 0x4d, 0x2e, 0xac, 0x17, 0xcc, 0xfd, 0x54, 0xe5,
+0x59, 0xd2, 0xdd, 0xc7, 0x4f, 0xc6, 0x7b, 0xcc, 0x19, 0xd8, 0xd0, 0xe6, 0x76, 0xf6, 0x7e, 0x05,
+0x1e, 0x13, 0x25, 0x1f, 0x31, 0x29, 0xa9, 0x2f, 0xe7, 0x30, 0xc1, 0x2b, 0x35, 0x20, 0xda, 0x0f,
+0xd4, 0xfd, 0x90, 0xed, 0x3d, 0xe2, 0x2f, 0xdd, 0xdd, 0xdd, 0xbf, 0xe2, 0xda, 0xe9, 0xa6, 0xf1,
+0x36, 0xf9, 0xfe, 0xff, 0x4e, 0x06, 0xba, 0x0c, 0xec, 0x12, 0x06, 0x18, 0xa8, 0x1a, 0xa6, 0x19,
+0xbc, 0x14, 0xe4, 0x0c, 0xc4, 0x03, 0xba, 0xfb, 0x8e, 0xf6, 0x5a, 0xf4, 0xaa, 0xf4, 0xf6, 0xf5,
+0x20, 0xf7, 0xac, 0xf7, 0x7c, 0xf7, 0xfe, 0xf6, 0x2a, 0xf7, 0xca, 0xf8, 0x24, 0xfc, 0xf4, 0x00,
+0x3e, 0x06, 0x14, 0x0b, 0x98, 0x0e, 0x5e, 0x10, 0x72, 0x10, 0xa6, 0x0f, 0x46, 0x0e, 0x8e, 0x0c,
+0x1c, 0x0a, 0x62, 0x06, 0x32, 0x01, 0x7a, 0xfa, 0xa4, 0xf2, 0xc2, 0xea, 0x84, 0xe4, 0x7b, 0xe1,
+0x2f, 0xe3, 0xc6, 0xe9, 0x9e, 0xf4, 0xb8, 0x01, 0xc8, 0x0e, 0x90, 0x19, 0xfd, 0x20, 0x83, 0x24,
+0x59, 0x24, 0xf1, 0x20, 0x6a, 0x1a, 0x3a, 0x11, 0xf2, 0x05, 0xd6, 0xf9, 0xba, 0xee, 0xaa, 0xe6,
+0xe5, 0xe2, 0x04, 0xe4, 0x2e, 0xe9, 0xfa, 0xf0, 0x86, 0xf9, 0xfe, 0x00, 0x66, 0x06, 0x74, 0x09,
+0x60, 0x0a, 0xde, 0x09, 0x8e, 0x08, 0xe6, 0x06, 0x16, 0x05, 0x4c, 0x03, 0x76, 0x01, 0xb2, 0xff,
+0x20, 0xfe, 0x12, 0xfd, 0xa6, 0xfc, 0xd8, 0xfc, 0x8e, 0xfd, 0x9e, 0xfe, 0xc2, 0xff, 0xbe, 0x00,
+0x82, 0x01, 0xf6, 0x01, 0x38, 0x02, 0x26, 0x02, 0xbe, 0x01, 0x2c, 0x01, 0xdc, 0x00, 0x9a, 0x00,
+0x6c, 0x00, 0x26, 0x00, 0xfe, 0xff, 0xe0, 0xff, 0xe8, 0xff, 0xfa, 0xff, 0x1c, 0x00, 0x48, 0x00,
+0x80, 0x00, 0xb0, 0x00, 0xd2, 0x00, 0x04, 0x01, 0x1a, 0x01, 0x08, 0x01, 0xae, 0x00, 0x38, 0x00,
+0xc4, 0xff, 0x8e, 0xff, 0x6e, 0xff, 0x6c, 0xff, 0x82, 0xff, 0xb4, 0xff, 0xec, 0xff, 0x14, 0x00,
+0x20, 0x00, 0x2c, 0x00, 0x28, 0x00, 0x26, 0x00, 0x38, 0x00, 0x56, 0x00, 0x9a, 0x00, 0xb6, 0x00,
+0xa8, 0x00, 0x74, 0x00, 0x3a, 0x00, 0xf2, 0xff, 0xa4, 0xff, 0x34, 0xff, 0xce, 0xfe, 0x94, 0xfe,
+0x9a, 0xfe, 0xc8, 0xfe, 0x10, 0xff, 0x7a, 0xff, 0xcc, 0xff, 0xf6, 0xff, 0x1a, 0x00, 0x46, 0x00,
+0x6a, 0x00, 0x74, 0x00, 0x54, 0x00, 0x20, 0x00, 0xf2, 0xff, 0xc2, 0xff, 0x8a, 0xff, 0x46, 0xff,
+0x0c, 0xff, 0xe8, 0xfe, 0xea, 0xfe, 0x10, 0xff, 0x4e, 0xff, 0x96, 0xff, 0xca, 0xff, 0xf0, 0xff,
+0x0c, 0x00, 0x40, 0x00, 0x62, 0x00, 0x5c, 0x00, 0x0c, 0x00, 0xb2, 0xff, 0x64, 0xff, 0x46, 0xff,
+0x16, 0xff, 0xdc, 0xfe, 0x8e, 0xfe, 0x42, 0xfe, 0x2a, 0xfe, 0x56, 0xfe, 0xd0, 0xfe, 0x4a, 0xff,
+0xaa, 0xff, 0xca, 0xff, 0xe8, 0xff, 0x1a, 0x00, 0x78, 0x00, 0xae, 0x00, 0xa0, 0x00, 0x3a, 0x00,
+0xc6, 0xff, 0x48, 0xff, 0xf8, 0xfe, 0xd2, 0xfe, 0xc8, 0xfe, 0xb8, 0xfe, 0xa2, 0xfe, 0xa6, 0xfe,
+0xbe, 0xfe, 0x12, 0xff, 0x64, 0xff, 0xc8, 0xff, 0x0e, 0x00, 0x42, 0x00, 0x40, 0x00, 0x14, 0x00,
+0xd0, 0xff, 0x76, 0xff, 0x18, 0xff, 0xd0, 0xfe, 0xa6, 0xfe, 0x8e, 0xfe, 0xa2, 0xfe, 0xca, 0xfe,
+0x06, 0xff, 0x46, 0xff, 0x74, 0xff, 0x8e, 0xff, 0x8a, 0xff, 0x8e, 0xff, 0x98, 0xff, 0xb6, 0xff,
+0xdc, 0xff, 0x06, 0x00, 0x12, 0x00, 0xfa, 0xff, 0xcc, 0xff, 0x8c, 0xff, 0x3c, 0xff, 0xf4, 0xfe,
+0xb2, 0xfe, 0x98, 0xfe, 0xa2, 0xfe, 0xbe, 0xfe, 0xfa, 0xfe, 0x1c, 0xff, 0x52, 0xff, 0x7c, 0xff,
+0xa2, 0xff, 0xa6, 0xff, 0xac, 0xff, 0xaa, 0xff, 0x9c, 0xff, 0x88, 0xff, 0x6e, 0xff, 0x54, 0xff,
+0x2a, 0xff, 0x0e, 0xff, 0xec, 0xfe, 0xee, 0xfe, 0xfe, 0xfe, 0x20, 0xff, 0x1e, 0xff, 0x22, 0xff,
+0x1e, 0xff, 0x40, 0xff, 0x6a, 0xff, 0x9e, 0xff, 0xbc, 0xff, 0xb6, 0xff, 0xa2, 0xff, 0x70, 0xff,
+0x56, 0xff, 0x4c, 0xff, 0x5a, 0xff, 0x4e, 0xff, 0x3c, 0xff, 0x26, 0xff, 0x32, 0xff, 0x46, 0xff,
+0x68, 0xff, 0x82, 0xff, 0x8c, 0xff, 0x8a, 0xff, 0x74, 0xff, 0x64, 0xff, 0x70, 0xff, 0x8a, 0xff,
+0xa6, 0xff, 0xae, 0xff, 0xa8, 0xff, 0x96, 0xff, 0x72, 0xff, 0x4c, 0xff, 0x22, 0xff, 0x1e, 0xff,
+0x36, 0xff, 0x58, 0xff, 0x78, 0xff, 0x80, 0xff, 0x8c, 0xff, 0x86, 0xff, 0x6a, 0xff, 0x4c, 0xff,
+0x4c, 0xff, 0x62, 0xff, 0x70, 0xff, 0x90, 0xff, 0x9c, 0xff, 0xa8, 0xff, 0x98, 0xff, 0x8a, 0xff,
+0x78, 0xff, 0x88, 0xff, 0x92, 0xff, 0x8a, 0xff, 0x66, 0xff, 0x3c, 0xff, 0x34, 0xff, 0x40, 0xff,
+0x62, 0xff, 0x5e, 0xff, 0x5c, 0xff, 0x4c, 0xff, 0x48, 0xff, 0x56, 0xff, 0x86, 0xff, 0xb2, 0xff,
+0xc8, 0xff, 0xbc, 0xff, 0xae, 0xff, 0x9c, 0xff, 0x9e, 0xff, 0x90, 0xff, 0x6e, 0xff, 0x4c, 0xff,
+0x34, 0xff, 0x28, 0xff, 0x22, 0xff, 0x30, 0xff, 0x3e, 0xff, 0x56, 0xff, 0x6c, 0xff, 0x94, 0xff,
+0xae, 0xff, 0xc6, 0xff, 0xd0, 0xff, 0xcc, 0xff, 0xb6, 0xff, 0xc0, 0xff, 0xae, 0xff, 0xae, 0xff,
+0x92, 0xff, 0x6e, 0xff, 0x5c, 0xff, 0x34, 0xff, 0x22, 0xff, 0x20, 0xff, 0x28, 0xff, 0x48, 0xff,
+0x88, 0xff, 0xde, 0xff, 0x20, 0x00, 0x5a, 0x00, 0x60, 0x00, 0x4a, 0x00, 0x20, 0x00, 0xea, 0xff,
+0xac, 0xff, 0x64, 0xff, 0x2a, 0xff, 0x04, 0xff, 0xea, 0xfe, 0xee, 0xfe, 0x22, 0xff, 0x3c, 0xff,
+0x72, 0xff, 0x96, 0xff, 0xc8, 0xff, 0xf2, 0xff, 0x16, 0x00, 0x22, 0x00, 0x32, 0x00, 0x38, 0x00,
+0x1a, 0x00, 0xec, 0xff, 0xa8, 0xff, 0x5e, 0xff, 0x28, 0xff, 0x0c, 0xff, 0x02, 0xff, 0x12, 0xff,
+0x18, 0xff, 0x38, 0xff, 0x58, 0xff, 0x92, 0xff, 0xca, 0xff, 0x14, 0x00, 0x46, 0x00, 0x5c, 0x00,
+0x40, 0x00, 0x2e, 0x00, 0x0c, 0x00, 0xd0, 0xff, 0xae, 0xff, 0x6a, 0xff, 0x28, 0xff, 0xdc, 0xfe,
+0xb4, 0xfe, 0xb8, 0xfe, 0xf6, 0xfe, 0x26, 0xff, 0x80, 0xff, 0xb6, 0xff, 0x04, 0x00, 0x50, 0x00,
+0x7c, 0x00, 0x9e, 0x00, 0x92, 0x00, 0x68, 0x00, 0x1e, 0x00, 0xdc, 0xff, 0x9e, 0xff, 0x68, 0xff,
+0x14, 0xff, 0xdc, 0xfe, 0xba, 0xfe, 0xcc, 0xfe, 0xf6, 0xfe, 0x34, 0xff, 0x82, 0xff, 0xc4, 0xff,
+0x0e, 0x00, 0x4c, 0x00, 0x6e, 0x00, 0x7a, 0x00, 0x60, 0x00, 0x32, 0x00, 0xf2, 0xff, 0xb6, 0xff,
+0x78, 0xff, 0x50, 0xff, 0x20, 0xff, 0x00, 0xff, 0xf4, 0xfe, 0x04, 0xff, 0x2c, 0xff, 0x60, 0xff,
+0xa4, 0xff, 0xd8, 0xff, 0x0e, 0x00, 0x42, 0x00, 0x6c, 0x00, 0x7c, 0x00, 0x66, 0x00, 0x42, 0x00,
+0x08, 0x00, 0xbe, 0xff, 0x86, 0xff, 0x50, 0xff, 0x24, 0xff, 0xfc, 0xfe, 0x08, 0xff, 0x20, 0xff,
+0x4c, 0xff, 0x78, 0xff, 0xac, 0xff, 0xf0, 0xff, 0x14, 0x00, 0x32, 0x00, 0x4e, 0x00, 0x50, 0x00,
+0x34, 0x00, 0x20, 0x00, 0xf4, 0xff, 0xb4, 0xff, 0x86, 0xff, 0x54, 0xff, 0x3e, 0xff, 0x2c, 0xff,
+0x24, 0xff, 0x3c, 0xff, 0x56, 0xff, 0x8a, 0xff, 0xb6, 0xff, 0xe4, 0xff, 0x10, 0x00, 0x1a, 0x00,
+0x32, 0x00, 0x2c, 0x00, 0x1c, 0x00, 0x04, 0x00, 0xde, 0xff, 0xc0, 0xff, 0xa0, 0xff, 0x7e, 0xff,
+0x74, 0xff, 0x76, 0xff, 0x76, 0xff, 0x8a, 0xff, 0x96, 0xff, 0xb2, 0xff, 0xe2, 0xff, 0xee, 0xff,
+0x02, 0x00, 0x04, 0x00, 0x06, 0x00, 0x12, 0x00, 0x00, 0x00, 0xea, 0xff, 0xda, 0xff, 0xc2, 0xff,
+0xb8, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xa2, 0xff, 0x96, 0xff, 0xaa, 0xff, 0xa8, 0xff, 0xc0, 0xff,
+0xcc, 0xff, 0xd6, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0xff,
+0xec, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xe0, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd8, 0xff,
+0xce, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xdc, 0xff, 0xe8, 0xff, 0xea, 0xff,
+0xf8, 0xff, 0xfc, 0xff, 0x0c, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x0e, 0x00,
+0xfc, 0xff, 0xec, 0xff, 0xd4, 0xff, 0xc6, 0xff, 0xb6, 0xff, 0xac, 0xff, 0xa8, 0xff, 0xba, 0xff,
+0xbe, 0xff, 0xd0, 0xff, 0xe0, 0xff, 0xf8, 0xff, 0x14, 0x00, 0x18, 0x00, 0x38, 0x00, 0x36, 0x00,
+0x2c, 0x00, 0x1c, 0x00, 0x08, 0x00, 0xfc, 0xff, 0xde, 0xff, 0xca, 0xff, 0xa2, 0xff, 0x9c, 0xff,
+0xa2, 0xff, 0xac, 0xff, 0xbe, 0xff, 0xca, 0xff, 0xe6, 0xff, 0x08, 0x00, 0x2c, 0x00, 0x4c, 0x00,
+0x54, 0x00, 0x58, 0x00, 0x50, 0x00, 0x46, 0x00, 0x22, 0x00, 0xfa, 0xff, 0xda, 0xff, 0xb8, 0xff,
+0x9e, 0xff, 0x80, 0xff, 0x7a, 0xff, 0x86, 0xff, 0x9a, 0xff, 0xae, 0xff, 0xe6, 0xff, 0x08, 0x00,
+0x32, 0x00, 0x4e, 0x00, 0x66, 0x00, 0x6a, 0x00, 0x62, 0x00, 0x42, 0x00, 0x28, 0x00, 0xf4, 0xff,
+0xce, 0xff, 0x9a, 0xff, 0x6c, 0xff, 0x5e, 0xff, 0x54, 0xff, 0x66, 0xff, 0x88, 0xff, 0xb0, 0xff,
+0xda, 0xff, 0x14, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x92, 0x00, 0x9c, 0x00, 0x82, 0x00, 0x60, 0x00,
+0x2a, 0x00, 0x02, 0x00, 0xc6, 0xff, 0x90, 0xff, 0x66, 0xff, 0x50, 0xff, 0x4e, 0xff, 0x64, 0xff,
+0x8a, 0xff, 0xb4, 0xff, 0xf4, 0xff, 0x2e, 0x00, 0x6c, 0x00, 0x9e, 0x00, 0xae, 0x00, 0xa8, 0x00,
+0x8c, 0x00, 0x56, 0x00, 0x22, 0x00, 0xe8, 0xff, 0xa8, 0xff, 0x72, 0xff, 0x48, 0xff, 0x3a, 0xff,
+0x38, 0xff, 0x5a, 0xff, 0x88, 0xff, 0xd0, 0xff, 0x0e, 0x00, 0x42, 0x00, 0x88, 0x00, 0xac, 0x00,
+0xb8, 0x00, 0xae, 0x00, 0x8a, 0x00, 0x4c, 0x00, 0x16, 0x00, 0xea, 0xff, 0xa0, 0xff, 0x70, 0xff,
+0x44, 0xff, 0x40, 0xff, 0x54, 0xff, 0x84, 0xff, 0xb8, 0xff, 0xfe, 0xff, 0x30, 0x00, 0x6c, 0x00,
+0xa2, 0x00, 0xc0, 0x00, 0xc8, 0x00, 0xb8, 0x00, 0x8e, 0x00, 0x48, 0x00, 0x10, 0x00, 0xda, 0xff,
+0xa4, 0xff, 0x74, 0xff, 0x5e, 0xff, 0x52, 0xff, 0x64, 0xff, 0x8e, 0xff, 0xca, 0xff, 0x06, 0x00,
+0x36, 0x00, 0x7a, 0x00, 0xa0, 0x00, 0xb8, 0x00, 0xbe, 0x00, 0x9c, 0x00, 0x6c, 0x00, 0x3a, 0x00,
+0x00, 0x00, 0xcc, 0xff, 0xaa, 0xff, 0x76, 0xff, 0x6c, 0xff, 0x6a, 0xff, 0x72, 0xff, 0xa2, 0xff,
+0xd4, 0xff, 0x0e, 0x00, 0x42, 0x00, 0x7a, 0x00, 0x9c, 0x00, 0xae, 0x00, 0xa6, 0x00, 0x88, 0x00,
+0x6c, 0x00, 0x36, 0x00, 0x06, 0x00, 0xde, 0xff, 0xa6, 0xff, 0x96, 0xff, 0x86, 0xff, 0x7c, 0xff,
+0x98, 0xff, 0xba, 0xff, 0xf2, 0xff, 0x18, 0x00, 0x44, 0x00, 0x64, 0x00, 0x80, 0x00, 0x8a, 0x00,
+0x84, 0x00, 0x72, 0x00, 0x58, 0x00, 0x20, 0x00, 0xfc, 0xff, 0xd2, 0xff, 0xb6, 0xff, 0xa0, 0xff,
+0x9c, 0xff, 0x9e, 0xff, 0xa0, 0xff, 0xc2, 0xff, 0xe6, 0xff, 0x0e, 0x00, 0x2a, 0x00, 0x46, 0x00,
+0x5a, 0x00, 0x5c, 0x00, 0x50, 0x00, 0x48, 0x00, 0x36, 0x00, 0x12, 0x00, 0x02, 0x00, 0xea, 0xff,
+0xd0, 0xff, 0xce, 0xff, 0xc2, 0xff, 0xbc, 0xff, 0xca, 0xff, 0xd8, 0xff, 0x00, 0x00, 0x0e, 0x00,
+0x1c, 0x00, 0x36, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x38, 0x00, 0x28, 0x00, 0x10, 0x00,
+0x16, 0x00, 0x06, 0x00, 0xfc, 0xff, 0xf6, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xdc, 0xff, 0xea, 0xff,
+0xf4, 0xff, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x26, 0x00,
+0x16, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x10, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0c, 0x00, 0x04, 0x00,
+0xfc, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xde, 0xff, 0xea, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xfe, 0xff,
+0x00, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x30, 0x00, 0x46, 0x00, 0x50, 0x00, 0x48, 0x00, 0x40, 0x00,
+0x38, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x04, 0x00, 0xee, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xd4, 0xff,
+0xd8, 0xff, 0xd6, 0xff, 0xee, 0xff, 0x18, 0x00, 0x2c, 0x00, 0x58, 0x00, 0x6c, 0x00, 0x70, 0x00,
+0x6e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3a, 0x00, 0x14, 0x00, 0xf6, 0xff, 0xcc, 0xff, 0xb4, 0xff,
+0xa8, 0xff, 0xa0, 0xff, 0xb2, 0xff, 0xb4, 0xff, 0xe4, 0xff, 0x08, 0x00, 0x32, 0x00, 0x62, 0x00,
+0x80, 0x00, 0x8e, 0x00, 0x90, 0x00, 0x7c, 0x00, 0x64, 0x00, 0x40, 0x00, 0x12, 0x00, 0xde, 0xff,
+0xac, 0xff, 0x9a, 0xff, 0x8c, 0xff, 0x8e, 0xff, 0xb0, 0xff, 0xca, 0xff, 0xf8, 0xff, 0x26, 0x00,
+0x4a, 0x00, 0x84, 0x00, 0x9e, 0x00, 0xb2, 0x00, 0xaa, 0x00, 0x8a, 0x00, 0x6a, 0x00, 0x3a, 0x00,
+0xfe, 0xff, 0xd6, 0xff, 0x9a, 0xff, 0x7c, 0xff, 0x64, 0xff, 0x66, 0xff, 0x7a, 0xff, 0xb2, 0xff,
+0xec, 0xff, 0x18, 0x00, 0x5a, 0x00, 0x84, 0x00, 0xae, 0x00, 0xbc, 0x00, 0xa6, 0x00, 0x90, 0x00,
+0x64, 0x00, 0x1e, 0x00, 0xee, 0xff, 0xb0, 0xff, 0x80, 0xff, 0x56, 0xff, 0x40, 0xff, 0x54, 0xff,
+0x74, 0xff, 0xb0, 0xff, 0xf2, 0xff, 0x2e, 0x00, 0x6e, 0x00, 0x9c, 0x00, 0xc2, 0x00, 0xd8, 0x00,
+0xc0, 0x00, 0x9c, 0x00, 0x64, 0x00, 0x1e, 0x00, 0xe4, 0xff, 0xa4, 0xff, 0x70, 0xff, 0x4c, 0xff,
+0x44, 0xff, 0x62, 0xff, 0x86, 0xff, 0xc2, 0xff, 0x0c, 0x00, 0x40, 0x00, 0x88, 0x00, 0xbc, 0x00,
+0xda, 0x00, 0xb8, 0x00, 0x4a, 0x00, 0x08, 0x00, 0xc0, 0xff, 0x80, 0xff, 0x5a, 0xff, 0x3a, 0xff,
+0x4c, 0xff, 0x64, 0xff, 0x98, 0xff, 0xe4, 0xff, 0x16, 0x00, 0x56, 0x00, 0x92, 0x00, 0xb8, 0x00,
+0xce, 0x00, 0xba, 0x00, 0xa8, 0x00, 0x7c, 0x00, 0x34, 0x00, 0x06, 0x00, 0xc4, 0xff, 0x86, 0xff,
+0x62, 0xff, 0x50, 0xff, 0x58, 0xff, 0x90, 0xff, 0xba, 0xff, 0xfa, 0xff, 0x40, 0x00, 0x62, 0x00,
+0xa4, 0x00, 0xc6, 0x00, 0xc2, 0x00, 0xb8, 0x00, 0x96, 0x00, 0x5e, 0x00, 0x22, 0x00, 0xe6, 0xff,
+0xb8, 0xff, 0x86, 0xff, 0x6a, 0xff, 0x70, 0xff, 0x80, 0xff, 0xa0, 0xff, 0xd4, 0xff, 0x08, 0x00,
+0x42, 0x00, 0x72, 0x00, 0x8e, 0x00, 0xa6, 0x00, 0x9e, 0x00, 0x80, 0x00, 0x70, 0x00, 0x34, 0x00,
+0x02, 0x00, 0xd6, 0xff, 0xa2, 0xff, 0x9c, 0xff, 0x88, 0xff, 0x8e, 0xff, 0xac, 0xff, 0xb8, 0xff,
+0xe4, 0xff, 0x16, 0x00, 0x3c, 0x00, 0x68, 0x00, 0x76, 0x00, 0x7c, 0x00, 0x78, 0x00, 0x6c, 0x00,
+0x56, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0xe2, 0xff, 0xc0, 0xff, 0xbc, 0xff, 0xb8, 0xff, 0xc0, 0xff,
+0xc6, 0xff, 0xd8, 0xff, 0x04, 0x00, 0x26, 0x00, 0x34, 0x00, 0x4c, 0x00, 0x5a, 0x00, 0x50, 0x00,
+0x50, 0x00, 0x58, 0x00, 0x30, 0x00, 0x18, 0x00, 0x02, 0x00, 0xea, 0xff, 0xde, 0xff, 0xd2, 0xff,
+0xd6, 0xff, 0xd8, 0xff, 0xdc, 0xff, 0xe0, 0xff, 0xfe, 0xff, 0x14, 0x00, 0x14, 0x00, 0x28, 0x00,
+0x28, 0x00, 0x2c, 0x00, 0x26, 0x00, 0x24, 0x00, 0x1e, 0x00, 0x12, 0x00, 0x00, 0x00, 0x06, 0x00,
+0x0a, 0x00, 0xfa, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0x04, 0x00, 0xfa, 0xff, 0xf0, 0xff,
+0xfe, 0xff, 0xf8, 0xff, 0x08, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x1c, 0x00,
+0x2c, 0x00, 0x34, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x24, 0x00, 0x0e, 0x00, 0x02, 0x00, 0xfa, 0xff,
+0xee, 0xff, 0xe6, 0xff, 0xd4, 0xff, 0xd2, 0xff, 0xda, 0xff, 0xe2, 0xff, 0xec, 0xff, 0x04, 0x00,
+0x0c, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x4c, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x2c, 0x00,
+0x10, 0x00, 0xf8, 0xff, 0xdc, 0xff, 0xc6, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xb2, 0xff, 0xc0, 0xff,
+0xd8, 0xff, 0xf6, 0xff, 0x16, 0x00, 0x42, 0x00, 0x5e, 0x00, 0x70, 0x00, 0x7a, 0x00, 0x76, 0x00,
+0x5e, 0x00, 0x48, 0x00, 0x22, 0x00, 0xfa, 0xff, 0xd8, 0xff, 0xb0, 0xff, 0x9e, 0xff, 0x94, 0xff,
+0x94, 0xff, 0xac, 0xff, 0xbe, 0xff, 0xf2, 0xff, 0x22, 0x00, 0x54, 0x00, 0x7c, 0x00, 0x92, 0x00,
+0x9c, 0x00, 0x8a, 0x00, 0x72, 0x00, 0x4a, 0x00, 0x16, 0x00, 0xe2, 0xff, 0xb2, 0xff, 0x92, 0xff,
+0x70, 0xff, 0x6a, 0xff, 0x76, 0xff, 0xa4, 0xff, 0xca, 0xff, 0xf6, 0xff, 0x34, 0x00, 0x6e, 0x00,
+0x94, 0x00, 0xb2, 0x00, 0xb4, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x46, 0x00, 0x1a, 0x00, 0xe2, 0xff,
+0xa8, 0xff, 0x70, 0xff, 0x62, 0xff, 0x58, 0xff, 0x70, 0xff, 0xa2, 0xff, 0xdc, 0xff, 0x08, 0x00,
+0x48, 0x00, 0x82, 0x00, 0xb0, 0x00, 0xc6, 0x00, 0xbc, 0x00, 0xa2, 0x00, 0x6e, 0x00, 0x34, 0x00,
+0x02, 0x00, 0xb8, 0xff, 0x82, 0xff, 0x54, 0xff, 0x4c, 0xff, 0x3c, 0xff, 0x64, 0xff, 0x9c, 0xff,
+0xd6, 0xff, 0x16, 0x00, 0x4c, 0x00, 0x94, 0x00, 0xae, 0x00, 0xc6, 0x00, 0xac, 0x00, 0x90, 0x00,
+0x58, 0x00, 0x16, 0x00, 0xd8, 0xff, 0xa2, 0xff, 0x6e, 0xff, 0x46, 0xff, 0x3e, 0xff, 0x4a, 0xff,
+0x6c, 0xff, 0xac, 0xff, 0xf6, 0xff, 0x24, 0x00, 0x64, 0x00, 0x9a, 0x00, 0xbc, 0x00, 0xc4, 0x00,
+0xa2, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x08, 0x00, 0xca, 0xff, 0x8a, 0xff, 0x5a, 0xff, 0x3c, 0xff,
+0x36, 0xff, 0x3c, 0xff, 0x78, 0xff, 0xc6, 0xff, 0xfe, 0xff, 0x30, 0x00, 0x5e, 0x00, 0x90, 0x00,
+0xae, 0x00, 0xac, 0x00, 0x90, 0x00, 0x60, 0x00, 0x34, 0x00, 0xe6, 0xff, 0xaa, 0xff, 0x84, 0xff,
+0x52, 0xff, 0x3e, 0xff, 0x3c, 0xff, 0x5a, 0xff, 0x8a, 0xff, 0xc0, 0xff, 0x08, 0x00, 0x38, 0x00,
+0x6c, 0x00, 0x88, 0x00, 0x9e, 0x00, 0x9e, 0x00, 0x78, 0x00, 0x68, 0x00, 0x26, 0x00, 0xea, 0xff,
+0xb2, 0xff, 0x92, 0xff, 0x74, 0xff, 0x66, 0xff, 0x66, 0xff, 0x7a, 0xff, 0xa6, 0xff, 0xda, 0xff,
+0x14, 0x00, 0x3c, 0x00, 0x60, 0x00, 0x74, 0x00, 0x8c, 0x00, 0x78, 0x00, 0x68, 0x00, 0x3a, 0x00,
+0x14, 0x00, 0xec, 0xff, 0xb0, 0xff, 0x9c, 0xff, 0x8a, 0xff, 0x7c, 0xff, 0x82, 0xff, 0x9e, 0xff,
+0xc2, 0xff, 0xf6, 0xff, 0x12, 0x00, 0x26, 0x00, 0x48, 0x00, 0x50, 0x00, 0x50, 0x00, 0x4e, 0x00,
+0x40, 0x00, 0x18, 0x00, 0x00, 0x00, 0xe8, 0xff, 0xc8, 0xff, 0xba, 0xff, 0xb8, 0xff, 0xb6, 0xff,
+0xbe, 0xff, 0xe2, 0xff, 0xec, 0xff, 0x06, 0x00, 0x12, 0x00, 0x22, 0x00, 0x30, 0x00, 0x2c, 0x00,
+0x2a, 0x00, 0x20, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x04, 0x00, 0xf4, 0xff, 0xe6, 0xff, 0xe0, 0xff,
+0xec, 0xff, 0xee, 0xff, 0xe8, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf8, 0xff,
+0xf4, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0x04, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0x0e, 0x00,
+0x04, 0x00, 0xf8, 0xff, 0x06, 0x00, 0x0a, 0x00, 0xf2, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xe4, 0xff,
+0xda, 0xff, 0xce, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd8, 0xff, 0xe6, 0xff, 0xf6, 0xff, 0x00, 0x00,
+0x10, 0x00, 0x26, 0x00, 0x3a, 0x00, 0x34, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x20, 0x00, 0x0c, 0x00,
+0xfe, 0xff, 0xdc, 0xff, 0xb4, 0xff, 0xb0, 0xff, 0xaa, 0xff, 0xb8, 0xff, 0xb6, 0xff, 0xc4, 0xff,
+0xf0, 0xff, 0xfa, 0xff, 0x20, 0x00, 0x34, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x44, 0x00,
+0x2c, 0x00, 0x02, 0x00, 0xe0, 0xff, 0xbc, 0xff, 0x96, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x94, 0xff,
+0xa0, 0xff, 0xc6, 0xff, 0xec, 0xff, 0x0e, 0x00, 0x3c, 0x00, 0x62, 0x00, 0x78, 0x00, 0x72, 0x00,
+0x68, 0x00, 0x56, 0x00, 0x2a, 0x00, 0x04, 0x00, 0xd4, 0xff, 0xa8, 0xff, 0x8e, 0xff, 0x76, 0xff,
+0x76, 0xff, 0x8a, 0xff, 0xa4, 0xff, 0xd2, 0xff, 0xfa, 0xff, 0x24, 0x00, 0x5e, 0x00, 0x7e, 0x00,
+0x92, 0x00, 0x88, 0x00, 0x70, 0x00, 0x50, 0x00, 0x22, 0x00, 0xf2, 0xff, 0xb6, 0xff, 0x84, 0xff,
+0x64, 0xff, 0x50, 0xff, 0x4a, 0xff, 0x6e, 0xff, 0xa0, 0xff, 0xcc, 0xff, 0x02, 0x00, 0x3a, 0x00,
+0x66, 0x00, 0x92, 0x00, 0xa4, 0x00, 0x9e, 0x00, 0x84, 0x00, 0x48, 0x00, 0x08, 0x00, 0xd8, 0xff,
+0x9e, 0xff, 0x68, 0xff, 0x4a, 0xff, 0x36, 0xff, 0x42, 0xff, 0x72, 0xff, 0xa6, 0xff, 0xea, 0xff,
+0x12, 0x00, 0x5a, 0x00, 0x8c, 0x00, 0xac, 0x00, 0xc2, 0x00, 0xae, 0x00, 0x7a, 0x00, 0x36, 0x00,
+0xfa, 0xff, 0xc2, 0xff, 0x82, 0xff, 0x54, 0xff, 0x3c, 0xff, 0x2a, 0xff, 0x42, 0xff, 0x70, 0xff,
+0xb4, 0xff, 0xfa, 0xff, 0x22, 0x00, 0x62, 0x00, 0x98, 0x00, 0xb0, 0x00, 0xac, 0x00, 0x8e, 0x00,
+0x5e, 0x00, 0x20, 0x00, 0xe4, 0xff, 0xa8, 0xff, 0x64, 0xff, 0x38, 0xff, 0x32, 0xff, 0x2c, 0xff,
+0x52, 0xff, 0x7e, 0xff, 0xc8, 0xff, 0x04, 0x00, 0x30, 0x00, 0x76, 0x00, 0x9c, 0x00, 0xb0, 0x00,
+0xac, 0x00, 0x88, 0x00, 0x4e, 0x00, 0x16, 0x00, 0xdc, 0xff, 0xae, 0xff, 0x70, 0xff, 0x4a, 0xff,
+0x44, 0xff, 0x4e, 0xff, 0x6e, 0xff, 0x9e, 0xff, 0xda, 0xff, 0x14, 0x00, 0x44, 0x00, 0x7a, 0x00,
+0x9c, 0x00, 0x9e, 0x00, 0x90, 0x00, 0x6a, 0x00, 0x46, 0x00, 0x0a, 0x00, 0xce, 0xff, 0x98, 0xff,
+0x70, 0xff, 0x5e, 0xff, 0x5c, 0xff, 0x60, 0xff, 0x7c, 0xff, 0xa6, 0xff, 0xdc, 0xff, 0x14, 0x00,
+0x44, 0x00, 0x6a, 0x00, 0x78, 0x00, 0x7a, 0x00, 0x62, 0x00, 0x56, 0x00, 0x28, 0x00, 0xf8, 0xff,
+0xda, 0xff, 0x9a, 0xff, 0x90, 0xff, 0x80, 0xff, 0x80, 0xff, 0x88, 0xff, 0x9a, 0xff, 0xc6, 0xff,
+0xee, 0xff, 0x1a, 0x00, 0x3a, 0x00, 0x54, 0x00, 0x64, 0x00, 0x5a, 0x00, 0x54, 0x00, 0x3a, 0x00,
+0x1c, 0x00, 0x00, 0x00, 0xda, 0xff, 0xbc, 0xff, 0xaa, 0xff, 0xa4, 0xff, 0x9e, 0xff, 0xa2, 0xff,
+0xb8, 0xff, 0xda, 0xff, 0xf6, 0xff, 0x0a, 0x00, 0x20, 0x00, 0x30, 0x00, 0x2e, 0x00, 0x2c, 0x00,
+0x32, 0x00, 0x12, 0x00, 0x02, 0x00, 0xf0, 0xff, 0xe2, 0xff, 0xd0, 0xff, 0xbe, 0xff, 0xc4, 0xff,
+0xc6, 0xff, 0xc8, 0xff, 0xca, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0x14, 0x00, 0x14, 0x00,
+0x0c, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x06, 0x00, 0xfc, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xee, 0xff,
+0xec, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xea, 0xff, 0xf2, 0xff, 0xf0, 0xff,
+0xf0, 0xff, 0xee, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xfa, 0xff, 0x04, 0x00,
+0x02, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x12, 0x00, 0x0a, 0x00, 0xf6, 0xff, 0xf8, 0xff, 0xe2, 0xff,
+0xd4, 0xff, 0xc4, 0xff, 0xb4, 0xff, 0xae, 0xff, 0xbc, 0xff, 0xc2, 0xff, 0xce, 0xff, 0xea, 0xff,
+0xf6, 0xff, 0x12, 0x00, 0x28, 0x00, 0x3c, 0x00, 0x36, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x0e, 0x00,
+0xfa, 0xff, 0xe8, 0xff, 0xbc, 0xff, 0xa6, 0xff, 0x9e, 0xff, 0x9a, 0xff, 0xa6, 0xff, 0xa2, 0xff,
+0xcc, 0xff, 0xea, 0xff, 0x10, 0x00, 0x3a, 0x00, 0x4c, 0x00, 0x5a, 0x00, 0x54, 0x00, 0x4e, 0x00,
+0x3c, 0x00, 0x20, 0x00, 0xf8, 0xff, 0xc8, 0xff, 0xa2, 0xff, 0x84, 0xff, 0x6e, 0xff, 0x76, 0xff,
+0x8a, 0xff, 0x9a, 0xff, 0xcc, 0xff, 0xf8, 0xff, 0x26, 0x00, 0x4c, 0x00, 0x60, 0x00, 0x78, 0x00,
+0x6c, 0x00, 0x58, 0x00, 0x3a, 0x00, 0x08, 0x00, 0xdc, 0xff, 0xac, 0xff, 0x7a, 0xff, 0x62, 0xff,
+0x5a, 0xff, 0x62, 0xff, 0x88, 0xff, 0xac, 0xff, 0xe0, 0xff, 0x18, 0x00, 0x4c, 0x00, 0x7c, 0x00,
+0x94, 0x00, 0x9e, 0x00, 0x8a, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x08, 0x00, 0xd2, 0xff, 0x8e, 0xff,
+0x60, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x52, 0xff, 0x7e, 0xff, 0xb8, 0xff, 0xf2, 0xff, 0x28, 0x00,
+0x5e, 0x00, 0x90, 0x00, 0xac, 0x00, 0xb0, 0x00, 0x94, 0x00, 0x6a, 0x00, 0x24, 0x00, 0xee, 0xff,
+0xb6, 0xff, 0x70, 0xff, 0x44, 0xff, 0x28, 0xff, 0x28, 0xff, 0x56, 0xff, 0x78, 0xff, 0xc4, 0xff,
+0x06, 0x00, 0x32, 0x00, 0x78, 0x00, 0xa6, 0x00, 0xc0, 0x00, 0xb0, 0x00, 0x94, 0x00, 0x62, 0x00,
+0x18, 0x00, 0xee, 0xff, 0xa2, 0xff, 0x5e, 0xff, 0x36, 0xff, 0x22, 0xff, 0x3e, 0xff, 0x5a, 0xff,
+0x92, 0xff, 0xd6, 0xff, 0x02, 0x00, 0x44, 0x00, 0x80, 0x00, 0xa6, 0x00, 0xb4, 0x00, 0xa2, 0x00,
+0x80, 0x00, 0x48, 0x00, 0x02, 0x00, 0xca, 0xff, 0x94, 0xff, 0x58, 0xff, 0x36, 0xff, 0x30, 0xff,
+0x34, 0xff, 0x5a, 0xff, 0x98, 0xff, 0xd0, 0xff, 0x14, 0x00, 0x42, 0x00, 0x70, 0x00, 0x92, 0x00,
+0x94, 0x00, 0x92, 0x00, 0x72, 0x00, 0x38, 0x00, 0xfa, 0xff, 0xba, 0xff, 0x82, 0xff, 0x56, 0xff,
+0x40, 0xff, 0x40, 0xff, 0x4e, 0xff, 0x7a, 0xff, 0xb2, 0xff, 0xe2, 0xff, 0x28, 0x00, 0x54, 0x00,
+0x76, 0x00, 0x96, 0x00, 0x96, 0x00, 0x7c, 0x00, 0x54, 0x00, 0x1e, 0x00, 0xe8, 0xff, 0xb8, 0xff,
+0x8e, 0xff, 0x6a, 0xff, 0x54, 0xff, 0x52, 0xff, 0x68, 0xff, 0x94, 0xff, 0xbe, 0xff, 0xee, 0xff,
+0x26, 0x00, 0x46, 0x00, 0x56, 0x00, 0x70, 0x00, 0x66, 0x00, 0x60, 0x00, 0x3a, 0x00, 0x0a, 0x00,
+0xe8, 0xff, 0xaa, 0xff, 0x94, 0xff, 0x86, 0xff, 0x82, 0xff, 0x7c, 0xff, 0x88, 0xff, 0xa6, 0xff,
+0xd0, 0xff, 0xf8, 0xff, 0x14, 0x00, 0x30, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x42, 0x00, 0x48, 0x00,
+0x2a, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xde, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xae, 0xff,
+0xca, 0xff, 0xd0, 0xff, 0xda, 0xff, 0xfe, 0xff, 0x08, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x20, 0x00,
+0x20, 0x00, 0x1e, 0x00, 0x10, 0x00, 0x02, 0x00, 0xfc, 0xff, 0xea, 0xff, 0xde, 0xff, 0xe0, 0xff,
+0xde, 0xff, 0xdc, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xde, 0xff, 0xe4, 0xff, 0xee, 0xff, 0xf0, 0xff,
+0xf4, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf8, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xd8, 0xff, 0xd4, 0xff,
+0xcc, 0xff, 0xd0, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xe8, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0x0a, 0x00,
+0x22, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x12, 0x00, 0x22, 0x00, 0x08, 0x00, 0xea, 0xff, 0xd8, 0xff,
+0xc0, 0xff, 0xae, 0xff, 0x92, 0xff, 0xa2, 0xff, 0xa4, 0xff, 0xa6, 0xff, 0xbe, 0xff, 0xe2, 0xff,
+0xf8, 0xff, 0x14, 0x00, 0x38, 0x00, 0x38, 0x00, 0x4c, 0x00, 0x3a, 0x00, 0x26, 0x00, 0x16, 0x00,
+0xe4, 0xff, 0xc0, 0xff, 0xa2, 0xff, 0x8a, 0xff, 0x72, 0xff, 0x70, 0xff, 0x7e, 0xff, 0x9e, 0xff,
+0xb8, 0xff, 0xe8, 0xff, 0x0a, 0x00, 0x38, 0x00, 0x64, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x60, 0x00,
+0x44, 0x00, 0x18, 0x00, 0xee, 0xff, 0xbe, 0xff, 0x8a, 0xff, 0x6e, 0xff, 0x54, 0xff, 0x58, 0xff,
+0x6e, 0xff, 0x8e, 0xff, 0xb4, 0xff, 0xea, 0xff, 0x28, 0x00, 0x58, 0x00, 0x7c, 0x00, 0x90, 0x00,
+0x8a, 0x00, 0x6e, 0x00, 0x42, 0x00, 0x14, 0x00, 0xd8, 0xff, 0xa0, 0xff, 0x6a, 0xff, 0x48, 0xff,
+0x40, 0xff, 0x42, 0xff, 0x5a, 0xff, 0x8c, 0xff, 0xc8, 0xff, 0x0c, 0x00, 0x46, 0x00, 0x80, 0x00,
+0xa4, 0x00, 0xb2, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x50, 0x00, 0x1c, 0x00, 0xd0, 0xff, 0x9a, 0xff,
+0x66, 0xff, 0x42, 0xff, 0x2e, 0xff, 0x38, 0xff, 0x70, 0xff, 0x9c, 0xff, 0xea, 0xff, 0x1c, 0x00,
+0x5c, 0x00, 0x9e, 0x00, 0xba, 0x00, 0xce, 0x00, 0xb8, 0x00, 0x86, 0x00, 0x44, 0x00, 0x00, 0x00,
+0xd2, 0xff, 0x8e, 0xff, 0x50, 0xff, 0x2c, 0xff, 0x14, 0xff, 0x2c, 0xff, 0x62, 0xff, 0xaa, 0xff,
+0xf4, 0xff, 0x24, 0x00, 0x66, 0x00, 0x96, 0x00, 0xb8, 0x00, 0xc2, 0x00, 0xa4, 0x00, 0x6c, 0x00,
+0x2c, 0x00, 0xe6, 0xff, 0xba, 0xff, 0x7a, 0xff, 0x4e, 0xff, 0x2e, 0xff, 0x28, 0xff, 0x42, 0xff,
+0x7a, 0xff, 0xc6, 0xff, 0x02, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xaa, 0x00, 0xba, 0x00, 0xb6, 0x00,
+0x98, 0x00, 0x62, 0x00, 0x20, 0x00, 0xdc, 0xff, 0xa2, 0xff, 0x78, 0xff, 0x3e, 0xff, 0x34, 0xff,
+0x3a, 0xff, 0x4e, 0xff, 0x88, 0xff, 0xcc, 0xff, 0x0e, 0x00, 0x3a, 0x00, 0x70, 0x00, 0x8e, 0x00,
+0xa0, 0x00, 0x98, 0x00, 0x76, 0x00, 0x46, 0x00, 0x02, 0x00, 0xc2, 0xff, 0x88, 0xff, 0x6c, 0xff,
+0x46, 0xff, 0x38, 0xff, 0x4a, 0xff, 0x64, 0xff, 0x96, 0xff, 0xce, 0xff, 0x00, 0x00, 0x3a, 0x00,
+0x5a, 0x00, 0x72, 0x00, 0x72, 0x00, 0x72, 0x00, 0x5c, 0x00, 0x3a, 0x00, 0x04, 0x00, 0xd2, 0xff,
+0x96, 0xff, 0x80, 0xff, 0x6e, 0xff, 0x66, 0xff, 0x78, 0xff, 0x84, 0xff, 0xb8, 0xff, 0xe4, 0xff,
+0x0a, 0x00, 0x38, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x54, 0x00, 0x4e, 0x00, 0x3a, 0x00, 0x04, 0x00,
+0xf2, 0xff, 0xce, 0xff, 0xb2, 0xff, 0x9e, 0xff, 0x8e, 0xff, 0x8c, 0xff, 0x8e, 0xff, 0xb0, 0xff,
+0xd0, 0xff, 0xfa, 0xff, 0x00, 0x00, 0x12, 0x00, 0x26, 0x00, 0x26, 0x00, 0x22, 0x00, 0x1e, 0x00,
+0x12, 0x00, 0xfc, 0xff, 0xec, 0xff, 0xdc, 0xff, 0xce, 0xff, 0xc8, 0xff, 0xd0, 0xff, 0xc0, 0xff,
+0xcc, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0xfe, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfa, 0xff,
+0xfc, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xee, 0xff, 0xde, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xce, 0xff,
+0xd2, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xe4, 0xff, 0xee, 0xff, 0xfa, 0xff, 0x04, 0x00, 0x06, 0x00,
+0x1a, 0x00, 0x14, 0x00, 0x16, 0x00, 0x12, 0x00, 0x06, 0x00, 0xf6, 0xff, 0xe4, 0xff, 0xc4, 0xff,
+0xba, 0xff, 0xa6, 0xff, 0xb2, 0xff, 0xb6, 0xff, 0xbc, 0xff, 0xe0, 0xff, 0xf4, 0xff, 0x0c, 0x00,
+0x12, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x34, 0x00, 0x36, 0x00, 0x1e, 0x00, 0x00, 0x00,
+0xdc, 0xff, 0xb8, 0xff, 0xa4, 0xff, 0x90, 0xff, 0x92, 0xff, 0x98, 0xff, 0x9c, 0xff, 0xc2, 0xff,
+0xf0, 0xff, 0x10, 0x00, 0x34, 0x00, 0x54, 0x00, 0x58, 0x00, 0x5a, 0x00, 0x4e, 0x00, 0x36, 0x00,
+0x16, 0x00, 0xf2, 0xff, 0xc8, 0xff, 0x96, 0xff, 0x7a, 0xff, 0x68, 0xff, 0x60, 0xff, 0x7c, 0xff,
+0x92, 0xff, 0xc0, 0xff, 0xee, 0xff, 0x18, 0x00, 0x4a, 0x00, 0x70, 0x00, 0x8c, 0x00, 0x86, 0x00,
+0x6a, 0x00, 0x3e, 0x00, 0x14, 0x00, 0xe6, 0xff, 0xac, 0xff, 0x80, 0xff, 0x54, 0xff, 0x48, 0xff,
+0x4c, 0xff, 0x66, 0xff, 0xa0, 0xff, 0xc6, 0xff, 0x08, 0x00, 0x38, 0x00, 0x68, 0x00, 0x8a, 0x00,
+0xa0, 0x00, 0x9e, 0x00, 0x7a, 0x00, 0x42, 0x00, 0xfe, 0xff, 0xc4, 0xff, 0x8a, 0xff, 0x56, 0xff,
+0x3c, 0xff, 0x2e, 0xff, 0x38, 0xff, 0x64, 0xff, 0x9c, 0xff, 0xdc, 0xff, 0x0e, 0x00, 0x48, 0x00,
+0x7c, 0x00, 0xa8, 0x00, 0xae, 0x00, 0x90, 0x00, 0x6c, 0x00, 0x28, 0x00, 0xfc, 0xff, 0xbe, 0xff,
+0x76, 0xff, 0x40, 0xff, 0x22, 0xff, 0x1a, 0xff, 0x4c, 0xff, 0x74, 0xff, 0xb8, 0xff, 0xf4, 0xff,
+0x22, 0x00, 0x6e, 0x00, 0xa2, 0x00, 0xc0, 0x00, 0xb6, 0x00, 0x94, 0x00, 0x66, 0x00, 0x18, 0x00,
+0xe2, 0xff, 0xa8, 0xff, 0x6a, 0xff, 0x40, 0xff, 0x22, 0xff, 0x30, 0xff, 0x4e, 0xff, 0x82, 0xff,
+0xc6, 0xff, 0x08, 0x00, 0x3a, 0x00, 0x86, 0x00, 0xaa, 0x00, 0xba, 0x00, 0xb8, 0x00, 0x7c, 0x00,
+0x4c, 0x00, 0x06, 0x00, 0xd0, 0xff, 0x98, 0xff, 0x60, 0xff, 0x44, 0xff, 0x30, 0xff, 0x44, 0xff,
+0x60, 0xff, 0x9a, 0xff, 0xdc, 0xff, 0x12, 0x00, 0x50, 0x00, 0x7e, 0x00, 0xa4, 0x00, 0xb2, 0x00,
+0x9e, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x06, 0x00, 0xc4, 0xff, 0x96, 0xff, 0x68, 0xff, 0x56, 0xff,
+0x4e, 0xff, 0x62, 0xff, 0x7e, 0xff, 0xae, 0xff, 0xe8, 0xff, 0x1c, 0x00, 0x50, 0x00, 0x6a, 0x00,
+0x8a, 0x00, 0x86, 0x00, 0x78, 0x00, 0x5a, 0x00, 0x24, 0x00, 0xf2, 0xff, 0xbc, 0xff, 0x90, 0xff,
+0x7a, 0xff, 0x68, 0xff, 0x66, 0xff, 0x7a, 0xff, 0x96, 0xff, 0xca, 0xff, 0xfa, 0xff, 0x10, 0x00,
+0x3e, 0x00, 0x4c, 0x00, 0x54, 0x00, 0x5e, 0x00, 0x50, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0xf0, 0xff,
+0xc8, 0xff, 0xa4, 0xff, 0x90, 0xff, 0x88, 0xff, 0x8c, 0xff, 0x90, 0xff, 0xaa, 0xff, 0xd0, 0xff,
+0xee, 0xff, 0x02, 0x00, 0x24, 0x00, 0x32, 0x00, 0x34, 0x00, 0x3e, 0x00, 0x32, 0x00, 0x1a, 0x00,
+0x0a, 0x00, 0xf0, 0xff, 0xdc, 0xff, 0xbe, 0xff, 0xb8, 0xff, 0xb0, 0xff, 0xa4, 0xff, 0xac, 0xff,
+0xbc, 0xff, 0xd0, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0x0e, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x14, 0x00,
+0x08, 0x00, 0x06, 0x00, 0xfa, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xde, 0xff, 0xde, 0xff, 0xea, 0xff,
+0xcc, 0xff, 0xcc, 0xff, 0xd2, 0xff, 0xc8, 0xff, 0xde, 0xff, 0xe6, 0xff, 0xe8, 0xff, 0xec, 0xff,
+0xf2, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0x06, 0x00, 0x0a, 0x00, 0x08, 0x00,
+0x08, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0xe2, 0xff, 0xd6, 0xff, 0xd8, 0xff, 0xcc, 0xff,
+0xc4, 0xff, 0xca, 0xff, 0xc0, 0xff, 0xc4, 0xff, 0xdc, 0xff, 0xf8, 0xff, 0x0c, 0x00, 0x1c, 0x00,
+0x2c, 0x00, 0x34, 0x00, 0x2e, 0x00, 0x2c, 0x00, 0x1a, 0x00, 0x02, 0x00, 0xf6, 0xff, 0xd4, 0xff,
+0xb8, 0xff, 0xa2, 0xff, 0xa0, 0xff, 0x9e, 0xff, 0xa6, 0xff, 0xbc, 0xff, 0xe2, 0xff, 0x00, 0x00,
+0x18, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4e, 0x00, 0x50, 0x00, 0x36, 0x00, 0x32, 0x00, 0x04, 0x00,
+0xe0, 0xff, 0xc0, 0xff, 0x9a, 0xff, 0x88, 0xff, 0x7c, 0xff, 0x80, 0xff, 0x8e, 0xff, 0xb0, 0xff,
+0xe0, 0xff, 0x0e, 0x00, 0x3e, 0x00, 0x52, 0x00, 0x6c, 0x00, 0x70, 0x00, 0x56, 0x00, 0x50, 0x00,
+0x38, 0x00, 0xfa, 0xff, 0xce, 0xff, 0xa4, 0xff, 0x76, 0xff, 0x5a, 0xff, 0x4a, 0xff, 0x64, 0xff,
+0x86, 0xff, 0xb8, 0xff, 0xe6, 0xff, 0x1e, 0x00, 0x4a, 0x00, 0x6a, 0x00, 0x80, 0x00, 0x88, 0x00,
+0x82, 0x00, 0x54, 0x00, 0x1e, 0x00, 0xea, 0xff, 0xbc, 0xff, 0x80, 0xff, 0x50, 0xff, 0x44, 0xff,
+0x3c, 0xff, 0x4c, 0xff, 0x7c, 0xff, 0xbc, 0xff, 0xf0, 0xff, 0x1e, 0x00, 0x64, 0x00, 0x8e, 0x00,
+0xa4, 0x00, 0x96, 0x00, 0x84, 0x00, 0x56, 0x00, 0x14, 0x00, 0xde, 0xff, 0xa6, 0xff, 0x6a, 0xff,
+0x44, 0xff, 0x2c, 0xff, 0x2a, 0xff, 0x54, 0xff, 0x84, 0xff, 0xd0, 0xff, 0x00, 0x00, 0x2c, 0x00,
+0x70, 0x00, 0xa0, 0x00, 0xb2, 0x00, 0xa0, 0x00, 0x86, 0x00, 0x3e, 0x00, 0xf8, 0xff, 0xc8, 0xff,
+0x8e, 0xff, 0x56, 0xff, 0x2a, 0xff, 0x1e, 0xff, 0x3c, 0xff, 0x60, 0xff, 0x94, 0xff, 0xe4, 0xff,
+0x10, 0x00, 0x46, 0x00, 0x8e, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x9c, 0x00, 0x6c, 0x00, 0x36, 0x00,
+0xe8, 0xff, 0xc8, 0xff, 0x8a, 0xff, 0x4c, 0xff, 0x28, 0xff, 0x32, 0xff, 0x4c, 0xff, 0x74, 0xff,
+0xbe, 0xff, 0xf8, 0xff, 0x26, 0x00, 0x60, 0x00, 0x8a, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0x92, 0x00,
+0x64, 0x00, 0x26, 0x00, 0xea, 0xff, 0xb2, 0xff, 0x7e, 0xff, 0x46, 0xff, 0x40, 0xff, 0x44, 0xff,
+0x5a, 0xff, 0x96, 0xff, 0xca, 0xff, 0x02, 0x00, 0x32, 0x00, 0x5c, 0x00, 0x76, 0x00, 0x84, 0x00,
+0x84, 0x00, 0x6a, 0x00, 0x4c, 0x00, 0x0a, 0x00, 0xda, 0xff, 0xae, 0xff, 0x7c, 0xff, 0x64, 0xff,
+0x5c, 0xff, 0x68, 0xff, 0x82, 0xff, 0xaa, 0xff, 0xd0, 0xff, 0xfe, 0xff, 0x36, 0x00, 0x52, 0x00,
+0x66, 0x00, 0x62, 0x00, 0x5e, 0x00, 0x46, 0x00, 0x26, 0x00, 0x02, 0x00, 0xe4, 0xff, 0xa8, 0xff,
+0x90, 0xff, 0x88, 0xff, 0x80, 0xff, 0x92, 0xff, 0x9e, 0xff, 0xc4, 0xff, 0xee, 0xff, 0x02, 0x00,
+0x1e, 0x00, 0x34, 0x00, 0x4e, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x3a, 0x00, 0x18, 0x00, 0xf6, 0xff,
+0xdc, 0xff, 0xb8, 0xff, 0xa2, 0xff, 0xa6, 0xff, 0xa8, 0xff, 0xa6, 0xff, 0xa4, 0xff, 0xc2, 0xff,
+0xe4, 0xff, 0xee, 0xff, 0x0e, 0x00, 0x20, 0x00, 0x2e, 0x00, 0x24, 0x00, 0x22, 0x00, 0x1c, 0x00,
+0xf6, 0xff, 0xf6, 0xff, 0xe2, 0xff, 0xc6, 0xff, 0xcc, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xbc, 0xff,
+0xc8, 0xff, 0xcc, 0xff, 0xe0, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x0e, 0x00,
+0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0xf2, 0xff, 0xe4, 0xff, 0xfa, 0xff, 0xf2, 0xff,
+0xf2, 0xff, 0xe6, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd0, 0xff, 0xda, 0xff, 0xd4, 0xff, 0xd2, 0xff,
+0xe0, 0xff, 0xd4, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xee, 0xff, 0x0a, 0x00, 0x0e, 0x00, 0x1a, 0x00,
+0x16, 0x00, 0x12, 0x00, 0x10, 0x00, 0x02, 0x00, 0xfc, 0xff, 0xe2, 0xff, 0xcc, 0xff, 0xac, 0xff,
+0xa8, 0xff, 0xb2, 0xff, 0xb4, 0xff, 0xbc, 0xff, 0xd4, 0xff, 0xea, 0xff, 0x02, 0x00, 0x1c, 0x00,
+0x24, 0x00, 0x48, 0x00, 0x40, 0x00, 0x34, 0x00, 0x36, 0x00, 0x18, 0x00, 0x04, 0x00, 0xda, 0xff,
+0xbc, 0xff, 0xa0, 0xff, 0x96, 0xff, 0x96, 0xff, 0xaa, 0xff, 0xa6, 0xff, 0xbe, 0xff, 0xee, 0xff,
+0x02, 0x00, 0x2e, 0x00, 0x50, 0x00, 0x60, 0x00, 0x5a, 0x00, 0x4c, 0x00, 0x42, 0x00, 0x14, 0x00,
+0xf0, 0xff, 0xcc, 0xff, 0x9c, 0xff, 0x7a, 0xff, 0x64, 0xff, 0x5e, 0xff, 0x6e, 0xff, 0x94, 0xff,
+0xba, 0xff, 0xe6, 0xff, 0x1c, 0x00, 0x4a, 0x00, 0x62, 0x00, 0x78, 0x00, 0x80, 0x00, 0x6c, 0x00,
+0x4c, 0x00, 0x18, 0x00, 0xee, 0xff, 0xb4, 0xff, 0x88, 0xff, 0x66, 0xff, 0x4e, 0xff, 0x56, 0xff,
+0x62, 0xff, 0x8a, 0xff, 0xbe, 0xff, 0xf4, 0xff, 0x28, 0x00, 0x60, 0x00, 0x8a, 0x00, 0xa6, 0x00,
+0xa2, 0x00, 0x78, 0x00, 0x48, 0x00, 0x0e, 0x00, 0xdc, 0xff, 0xa4, 0xff, 0x6a, 0xff, 0x42, 0xff,
+0x2c, 0xff, 0x34, 0xff, 0x54, 0xff, 0x88, 0xff, 0xca, 0xff, 0x02, 0x00, 0x3c, 0x00, 0x76, 0x00,
+0x8e, 0x00, 0xac, 0x00, 0x92, 0x00, 0x6c, 0x00, 0x30, 0x00, 0xf6, 0xff, 0xc4, 0xff, 0x86, 0xff,
+0x58, 0xff, 0x2e, 0xff, 0x1e, 0xff, 0x34, 0xff, 0x66, 0xff, 0xaa, 0xff, 0xea, 0xff, 0x16, 0x00,
+0x58, 0x00, 0x96, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0x9e, 0x00, 0x64, 0x00, 0x20, 0x00, 0xec, 0xff,
+0xbc, 0xff, 0x72, 0xff, 0x46, 0xff, 0x26, 0xff, 0x24, 0xff, 0x4c, 0xff, 0x7c, 0xff, 0xc0, 0xff,
+0xfe, 0xff, 0x2a, 0x00, 0x78, 0x00, 0x9a, 0x00, 0xb0, 0x00, 0xac, 0x00, 0x82, 0x00, 0x4c, 0x00,
+0x1c, 0x00, 0xe2, 0xff, 0xa6, 0xff, 0x76, 0xff, 0x34, 0xff, 0x2e, 0xff, 0x38, 0xff, 0x56, 0xff,
+0x88, 0xff, 0xc4, 0xff, 0x06, 0x00, 0x40, 0x00, 0x7a, 0x00, 0x98, 0x00, 0xa6, 0x00, 0x94, 0x00,
+0x7c, 0x00, 0x52, 0x00, 0x12, 0x00, 0xe0, 0xff, 0xb0, 0xff, 0x74, 0xff, 0x56, 0xff, 0x50, 0xff,
+0x58, 0xff, 0x7a, 0xff, 0xa4, 0xff, 0xda, 0xff, 0x14, 0x00, 0x4a, 0x00, 0x60, 0x00, 0x84, 0x00,
+0x86, 0x00, 0x76, 0x00, 0x64, 0x00, 0x38, 0x00, 0x14, 0x00, 0xdc, 0xff, 0xac, 0xff, 0x8e, 0xff,
+0x76, 0xff, 0x5e, 0xff, 0x6c, 0xff, 0x88, 0xff, 0xa4, 0xff, 0xdc, 0xff, 0x04, 0x00, 0x28, 0x00,
+0x42, 0x00, 0x5a, 0x00, 0x5e, 0x00, 0x62, 0x00, 0x4c, 0x00, 0x26, 0x00, 0x08, 0x00, 0xda, 0xff,
+0xbe, 0xff, 0x9e, 0xff, 0x92, 0xff, 0x98, 0xff, 0x92, 0xff, 0xa8, 0xff, 0xc8, 0xff, 0xe4, 0xff,
+0xfc, 0xff, 0x22, 0x00, 0x30, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x2c, 0x00, 0x0e, 0x00,
+0xfc, 0xff, 0xec, 0xff, 0xd0, 0xff, 0xbe, 0xff, 0xba, 0xff, 0xac, 0xff, 0xa4, 0xff, 0xc0, 0xff,
+0xd2, 0xff, 0xea, 0xff, 0xfc, 0xff, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x0c, 0x00,
+0x0a, 0x00, 0xfc, 0xff, 0xe8, 0xff, 0xdc, 0xff, 0xd8, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xce, 0xff,
+0xd8, 0xff, 0xe2, 0xff, 0xd8, 0xff, 0xe6, 0xff, 0xda, 0xff, 0xda, 0xff, 0xea, 0xff, 0xf2, 0xff,
+0xf0, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xf0, 0xff, 0x04, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x08, 0x00,
+0x02, 0x00, 0xf8, 0xff, 0xee, 0xff, 0xea, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xc4, 0xff, 0xc2, 0xff,
+0xc2, 0xff, 0xca, 0xff, 0xcc, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0x00, 0x00, 0x16, 0x00, 0x22, 0x00,
+0x2a, 0x00, 0x20, 0x00, 0x22, 0x00, 0x14, 0x00, 0x06, 0x00, 0xe4, 0xff, 0xd4, 0xff, 0xae, 0xff,
+0x98, 0xff, 0x9a, 0xff, 0x9e, 0xff, 0xae, 0xff, 0xbe, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0x14, 0x00,
+0x38, 0x00, 0x48, 0x00, 0x54, 0x00, 0x4c, 0x00, 0x3a, 0x00, 0x24, 0x00, 0x0a, 0x00, 0xee, 0xff,
+0xc0, 0xff, 0xa4, 0xff, 0x96, 0xff, 0x88, 0xff, 0x96, 0xff, 0x9e, 0xff, 0xba, 0xff, 0xee, 0xff,
+0x06, 0x00, 0x2c, 0x00, 0x58, 0x00, 0x66, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x56, 0x00, 0x3c, 0x00,
+0x04, 0x00, 0xda, 0xff, 0xaa, 0xff, 0x78, 0xff, 0x6c, 0xff, 0x60, 0xff, 0x6a, 0xff, 0x7e, 0xff,
+0xac, 0xff, 0xec, 0xff, 0x0a, 0x00, 0x42, 0x00, 0x6a, 0x00, 0x78, 0x00, 0x90, 0x00, 0x7e, 0x00,
+0x58, 0x00, 0x2a, 0x00, 0xfc, 0xff, 0xc0, 0xff, 0x8e, 0xff, 0x6a, 0xff, 0x42, 0xff, 0x40, 0xff,
+0x54, 0xff, 0x80, 0xff, 0xb8, 0xff, 0xee, 0xff, 0x26, 0x00, 0x5e, 0x00, 0x88, 0x00, 0xa6, 0x00,
+0xae, 0x00, 0x98, 0x00, 0x68, 0x00, 0x2a, 0x00, 0xee, 0xff, 0xae, 0xff, 0x72, 0xff, 0x46, 0xff,
+0x2c, 0xff, 0x30, 0xff, 0x4c, 0xff, 0x7e, 0xff, 0xc2, 0xff, 0xf2, 0xff, 0x26, 0x00, 0x68, 0x00,
+0x8a, 0x00, 0xb0, 0x00, 0xa4, 0x00, 0x7c, 0x00, 0x4e, 0x00, 0x02, 0x00, 0xd2, 0xff, 0x94, 0xff,
+0x5a, 0xff, 0x30, 0xff, 0x20, 0xff, 0x24, 0xff, 0x4a, 0xff, 0x80, 0xff, 0xc0, 0xff, 0x00, 0x00,
+0x38, 0x00, 0x70, 0x00, 0x9a, 0x00, 0xae, 0x00, 0x9e, 0x00, 0x78, 0x00, 0x40, 0x00, 0x00, 0x00,
+0xd2, 0xff, 0x8a, 0xff, 0x54, 0xff, 0x3a, 0xff, 0x2a, 0xff, 0x3c, 0xff, 0x6c, 0xff, 0xa6, 0xff,
+0xe6, 0xff, 0x14, 0x00, 0x46, 0x00, 0x82, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x86, 0x00, 0x5e, 0x00,
+0x28, 0x00, 0xf0, 0xff, 0xba, 0xff, 0x88, 0xff, 0x52, 0xff, 0x40, 0xff, 0x44, 0xff, 0x56, 0xff,
+0x7c, 0xff, 0xaa, 0xff, 0xee, 0xff, 0x18, 0x00, 0x42, 0x00, 0x7e, 0x00, 0x90, 0x00, 0x8a, 0x00,
+0x76, 0x00, 0x46, 0x00, 0x1e, 0x00, 0xe4, 0xff, 0xb0, 0xff, 0x86, 0xff, 0x68, 0xff, 0x62, 0xff,
+0x5c, 0xff, 0x76, 0xff, 0x94, 0xff, 0xca, 0xff, 0x00, 0x00, 0x38, 0x00, 0x58, 0x00, 0x70, 0x00,
+0x7e, 0x00, 0x78, 0x00, 0x6a, 0x00, 0x44, 0x00, 0x18, 0x00, 0xf0, 0xff, 0xb8, 0xff, 0x9c, 0xff,
+0x94, 0xff, 0x7c, 0xff, 0x7a, 0xff, 0x90, 0xff, 0xb0, 0xff, 0xda, 0xff, 0xf0, 0xff, 0x1e, 0x00,
+0x40, 0x00, 0x48, 0x00, 0x52, 0x00, 0x52, 0x00, 0x48, 0x00, 0x24, 0x00, 0x02, 0x00, 0xea, 0xff,
+0xcc, 0xff, 0xb6, 0xff, 0xb4, 0xff, 0xa8, 0xff, 0xa2, 0xff, 0xae, 0xff, 0xc2, 0xff, 0xde, 0xff,
+0xf4, 0xff, 0x02, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x2a, 0x00, 0x26, 0x00, 0x12, 0x00,
+0x02, 0x00, 0xf8, 0xff, 0xf6, 0xff, 0xda, 0xff, 0xde, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xd4, 0xff,
+0xd4, 0xff, 0xee, 0xff, 0xea, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0x00, 0x00, 0x04, 0x00,
+0xfe, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf2, 0xff,
+0xe8, 0xff, 0xd8, 0xff, 0xdc, 0xff, 0xde, 0xff, 0xd6, 0xff, 0xd2, 0xff, 0xd8, 0xff, 0xd4, 0xff,
+0xcc, 0xff, 0xd6, 0xff, 0xe8, 0xff, 0xee, 0xff, 0x02, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x20, 0x00,
+0x0e, 0x00, 0x12, 0x00, 0x06, 0x00, 0xf8, 0xff, 0xe6, 0xff, 0xd2, 0xff, 0xc6, 0xff, 0xb0, 0xff,
+0xa8, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xbc, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0x0e, 0x00, 0x32, 0x00,
+0x3c, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x30, 0x00, 0x1e, 0x00, 0x08, 0x00, 0xe8, 0xff, 0xc2, 0xff,
+0x9e, 0xff, 0x8a, 0xff, 0x80, 0xff, 0x8a, 0xff, 0x9e, 0xff, 0xb0, 0xff, 0xe0, 0xff, 0xfc, 0xff,
+0x1e, 0x00, 0x46, 0x00, 0x5a, 0x00, 0x68, 0x00, 0x58, 0x00, 0x4e, 0x00, 0x26, 0x00, 0x00, 0x00,
+0xd0, 0xff, 0xa4, 0xff, 0x8e, 0xff, 0x6e, 0xff, 0x6c, 0xff, 0x7c, 0xff, 0x98, 0xff, 0xc4, 0xff,
+0xea, 0xff, 0x20, 0x00, 0x5c, 0x00, 0x6e, 0x00, 0x8e, 0x00, 0x8c, 0x00, 0x74, 0x00, 0x5a, 0x00,
+0x22, 0x00, 0xf0, 0xff, 0xc2, 0xff, 0x96, 0xff, 0x70, 0xff, 0x54, 0xff, 0x58, 0xff, 0x6a, 0xff,
+0x90, 0xff, 0xc2, 0xff, 0xf6, 0xff, 0x2c, 0x00, 0x72, 0x00, 0x8e, 0x00, 0x98, 0x00, 0x9e, 0x00,
+0x84, 0x00, 0x54, 0x00, 0x1e, 0x00, 0xea, 0xff, 0xb2, 0xff, 0x76, 0xff, 0x4e, 0xff, 0x3a, 0xff,
+0x34, 0xff, 0x5a, 0xff, 0x9a, 0xff, 0xd0, 0xff, 0x08, 0x00, 0x3e, 0x00, 0x76, 0x00, 0xa0, 0x00,
+0xaa, 0x00, 0xa6, 0x00, 0x8a, 0x00, 0x4c, 0x00, 0x12, 0x00, 0xda, 0xff, 0xa0, 0xff, 0x6a, 0xff,
+0x3e, 0xff, 0x28, 0xff, 0x3a, 0xff, 0x66, 0xff, 0x9e, 0xff, 0xe4, 0xff, 0x14, 0x00, 0x5a, 0x00,
+0x82, 0x00, 0xaa, 0x00, 0xb8, 0x00, 0xa2, 0x00, 0x74, 0x00, 0x32, 0x00, 0xfc, 0xff, 0xc6, 0xff,
+0x7a, 0xff, 0x4a, 0xff, 0x28, 0xff, 0x26, 0xff, 0x4c, 0xff, 0x5e, 0xff, 0xae, 0xff, 0xe8, 0xff,
+0x1c, 0x00, 0x54, 0x00, 0x88, 0x00, 0xa6, 0x00, 0xa0, 0x00, 0x86, 0x00, 0x5a, 0x00, 0x22, 0x00,
+0xea, 0xff, 0xb2, 0xff, 0x76, 0xff, 0x4c, 0xff, 0x32, 0xff, 0x3e, 0xff, 0x5a, 0xff, 0x86, 0xff,
+0xb8, 0xff, 0xf6, 0xff, 0x28, 0x00, 0x62, 0x00, 0x80, 0x00, 0x90, 0x00, 0x9e, 0x00, 0x78, 0x00,
+0x42, 0x00, 0x12, 0x00, 0xd4, 0xff, 0xa4, 0xff, 0x82, 0xff, 0x5c, 0xff, 0x52, 0xff, 0x4e, 0xff,
+0x70, 0xff, 0x94, 0xff, 0xce, 0xff, 0x08, 0x00, 0x30, 0x00, 0x58, 0x00, 0x74, 0x00, 0x78, 0x00,
+0x74, 0x00, 0x56, 0x00, 0x26, 0x00, 0xfe, 0xff, 0xd2, 0xff, 0xa0, 0xff, 0x86, 0xff, 0x6e, 0xff,
+0x62, 0xff, 0x7c, 0xff, 0x90, 0xff, 0xb8, 0xff, 0xe6, 0xff, 0x02, 0x00, 0x36, 0x00, 0x50, 0x00,
+0x56, 0x00, 0x64, 0x00, 0x58, 0x00, 0x48, 0x00, 0x1a, 0x00, 0xf4, 0xff, 0xe2, 0xff, 0xac, 0xff,
+0xa2, 0xff, 0x98, 0xff, 0x98, 0xff, 0xa6, 0xff, 0xb4, 0xff, 0xdc, 0xff, 0xf4, 0xff, 0x08, 0x00,
+0x1e, 0x00, 0x32, 0x00, 0x36, 0x00, 0x44, 0x00, 0x40, 0x00, 0x24, 0x00, 0x08, 0x00, 0xf0, 0xff,
+0xd6, 0xff, 0xc2, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xbe, 0xff, 0xbc, 0xff, 0xd8, 0xff, 0xd8, 0xff,
+0xec, 0xff, 0xf2, 0xff, 0x04, 0x00, 0x18, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x0a, 0x00,
+0xfc, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe6, 0xff, 0xe8, 0xff, 0xe6, 0xff, 0xdc, 0xff, 0xe2, 0xff,
+0xde, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf8, 0xff,
+0xf0, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0x04, 0x00, 0x02, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00,
+0xfe, 0xff, 0xee, 0xff, 0xf2, 0xff, 0xe8, 0xff, 0xd2, 0xff, 0xc8, 0xff, 0xb8, 0xff, 0xc8, 0xff,
+0xcc, 0xff, 0xc8, 0xff, 0xe4, 0xff, 0xee, 0xff, 0xfa, 0xff, 0x16, 0x00, 0x22, 0x00, 0x28, 0x00,
+0x2c, 0x00, 0x22, 0x00, 0x16, 0x00, 0x02, 0x00, 0xf2, 0xff, 0xda, 0xff, 0xbc, 0xff, 0xa2, 0xff,
+0x96, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xae, 0xff, 0xd4, 0xff, 0xf2, 0xff, 0x06, 0x00, 0x36, 0x00,
+0x4a, 0x00, 0x54, 0x00, 0x5a, 0x00, 0x46, 0x00, 0x36, 0x00, 0x0e, 0x00, 0xe6, 0xff, 0xce, 0xff,
+0xa2, 0xff, 0x8e, 0xff, 0x78, 0xff, 0x76, 0xff, 0x8e, 0xff, 0xa4, 0xff, 0xd6, 0xff, 0xf6, 0xff,
+0x18, 0x00, 0x48, 0x00, 0x66, 0x00, 0x70, 0x00, 0x76, 0x00, 0x66, 0x00, 0x3e, 0x00, 0x04, 0x00,
+0xe0, 0xff, 0xac, 0xff, 0x7e, 0xff, 0x68, 0xff, 0x5e, 0xff, 0x5c, 0xff, 0x78, 0xff, 0xa2, 0xff,
+0xc4, 0xff, 0xfa, 0xff, 0x38, 0x00, 0x6e, 0x00, 0x9a, 0x00, 0xa0, 0x00, 0x92, 0x00, 0x66, 0x00,
+0x30, 0x00, 0x0c, 0x00, 0xd4, 0xff, 0x98, 0xff, 0x66, 0xff, 0x4e, 0xff, 0x46, 0xff, 0x48, 0xff,
+0x6c, 0xff, 0xb0, 0xff, 0xe4, 0xff, 0x14, 0x00, 0x54, 0x00, 0x8a, 0x00, 0xa4, 0x00, 0xb2, 0x00,
+0x9c, 0x00, 0x70, 0x00, 0x32, 0x00, 0xfa, 0xff, 0xc2, 0xff, 0x7e, 0xff, 0x50, 0xff, 0x32, 0xff,
+0x30, 0xff, 0x44, 0xff, 0x76, 0xff, 0xb6, 0xff, 0xf0, 0xff, 0x1e, 0x00, 0x64, 0x00, 0x9c, 0x00,
+0xba, 0x00, 0xb2, 0x00, 0x96, 0x00, 0x6e, 0x00, 0x1c, 0x00, 0xf8, 0xff, 0xaa, 0xff, 0x68, 0xff,
+0x3e, 0xff, 0x30, 0xff, 0x36, 0xff, 0x56, 0xff, 0x84, 0xff, 0xc2, 0xff, 0x00, 0x00, 0x38, 0x00,
+0x7a, 0x00, 0xa6, 0x00, 0xc2, 0x00, 0xac, 0x00, 0x92, 0x00, 0x56, 0x00, 0x18, 0x00, 0xe8, 0xff,
+0xac, 0xff, 0x6e, 0xff, 0x3c, 0xff, 0x2c, 0xff, 0x34, 0xff, 0x5c, 0xff, 0x90, 0xff, 0xde, 0xff,
+0x10, 0x00, 0x3c, 0x00, 0x7a, 0x00, 0x9c, 0x00, 0xae, 0x00, 0xa8, 0x00, 0x74, 0x00, 0x3e, 0x00,
+0x04, 0x00, 0xca, 0xff, 0x96, 0xff, 0x62, 0xff, 0x44, 0xff, 0x3a, 0xff, 0x48, 0xff, 0x68, 0xff,
+0xa6, 0xff, 0xea, 0xff, 0x1e, 0x00, 0x44, 0x00, 0x74, 0x00, 0x90, 0x00, 0x92, 0x00, 0x80, 0x00,
+0x5a, 0x00, 0x28, 0x00, 0xf2, 0xff, 0xc4, 0xff, 0xa0, 0xff, 0x7a, 0xff, 0x58, 0xff, 0x5a, 0xff,
+0x64, 0xff, 0x8e, 0xff, 0xc4, 0xff, 0xea, 0xff, 0x24, 0x00, 0x44, 0x00, 0x5e, 0x00, 0x72, 0x00,
+0x6a, 0x00, 0x5e, 0x00, 0x44, 0x00, 0x16, 0x00, 0xe6, 0xff, 0xc6, 0xff, 0xa0, 0xff, 0x92, 0xff,
+0x7c, 0xff, 0x7a, 0xff, 0x7c, 0xff, 0x9e, 0xff, 0xc8, 0xff, 0xea, 0xff, 0x10, 0x00, 0x2a, 0x00,
+0x3c, 0x00, 0x42, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x26, 0x00, 0x02, 0x00, 0xea, 0xff, 0xd4, 0xff,
+0xb6, 0xff, 0xa8, 0xff, 0xa6, 0xff, 0xa4, 0xff, 0xb0, 0xff, 0xc8, 0xff, 0xe2, 0xff, 0xf6, 0xff,
+0x08, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x28, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x16, 0x00, 0xfe, 0xff,
+0xf2, 0xff, 0xe4, 0xff, 0xd4, 0xff, 0xe2, 0xff, 0xde, 0xff, 0xd0, 0xff, 0xd8, 0xff, 0xdc, 0xff,
+0xf6, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0x04, 0x00,
+0x02, 0x00, 0xfa, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xfe, 0xff,
+0xf6, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xd6, 0xff, 0xd0, 0xff, 0xd4, 0xff, 0xd6, 0xff, 0xd8, 0xff,
+0xea, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0x04, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x16, 0x00,
+0x16, 0x00, 0x0c, 0x00, 0xfa, 0xff, 0xf6, 0xff, 0xe6, 0xff, 0xc2, 0xff, 0xb6, 0xff, 0xb0, 0xff,
+0xb0, 0xff, 0xc8, 0xff, 0xce, 0xff, 0xec, 0xff, 0xfc, 0xff, 0x0c, 0x00, 0x2e, 0x00, 0x3a, 0x00,
+0x3c, 0x00, 0x32, 0x00, 0x2c, 0x00, 0x14, 0x00, 0xfc, 0xff, 0xe4, 0xff, 0xc2, 0xff, 0xa2, 0xff,
+0x92, 0xff, 0x86, 0xff, 0x90, 0xff, 0xa4, 0xff, 0xba, 0xff, 0xea, 0xff, 0xfe, 0xff, 0x2e, 0x00,
+0x46, 0x00, 0x54, 0x00, 0x54, 0x00, 0x56, 0x00, 0x46, 0x00, 0x28, 0x00, 0x04, 0x00, 0xd8, 0xff,
+0xa4, 0xff, 0x88, 0xff, 0x7e, 0xff, 0x6c, 0xff, 0x7a, 0xff, 0x92, 0xff, 0xaa, 0xff, 0xe0, 0xff,
+0x0c, 0x00, 0x3c, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x70, 0x00, 0x58, 0x00, 0x2e, 0x00,
+0xfe, 0xff, 0xca, 0xff, 0x9c, 0xff, 0x74, 0xff, 0x54, 0xff, 0x4c, 0xff, 0x5c, 0xff, 0x88, 0xff,
+0xba, 0xff, 0xee, 0xff, 0x1c, 0x00, 0x52, 0x00, 0x78, 0x00, 0x96, 0x00, 0x96, 0x00, 0x86, 0x00,
+0x5e, 0x00, 0x20, 0x00, 0xee, 0xff, 0xb0, 0xff, 0x78, 0xff, 0x58, 0xff, 0x3e, 0xff, 0x3e, 0xff,
+0x5e, 0xff, 0x86, 0xff, 0xca, 0xff, 0xfe, 0xff, 0x30, 0x00, 0x74, 0x00, 0x9c, 0x00, 0xac, 0x00,
+0xa6, 0x00, 0x88, 0x00, 0x56, 0x00, 0x0c, 0x00, 0xd4, 0xff, 0xa2, 0xff, 0x68, 0xff, 0x44, 0xff,
+0x2c, 0xff, 0x3a, 0xff, 0x60, 0xff, 0x9e, 0xff, 0xe2, 0xff, 0x12, 0x00, 0x4e, 0x00, 0x82, 0x00,
+0xa6, 0x00, 0xc4, 0x00, 0xaa, 0x00, 0x8c, 0x00, 0x3a, 0x00, 0xfc, 0xff, 0xd6, 0xff, 0x7a, 0xff,
+0x58, 0xff, 0x34, 0xff, 0x2a, 0xff, 0x48, 0xff, 0x6a, 0xff, 0xa6, 0xff, 0xe4, 0xff, 0x18, 0x00,
+0x50, 0x00, 0x92, 0x00, 0xb0, 0x00, 0xbc, 0x00, 0xaa, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0xec, 0xff,
+0xbc, 0xff, 0x82, 0xff, 0x58, 0xff, 0x3e, 0xff, 0x30, 0xff, 0x58, 0xff, 0x7c, 0xff, 0xc2, 0xff,
+0xfe, 0xff, 0x2a, 0x00, 0x62, 0x00, 0x86, 0x00, 0x9a, 0x00, 0x9e, 0x00, 0x88, 0x00, 0x58, 0x00,
+0x1e, 0x00, 0xe6, 0xff, 0xb0, 0xff, 0x82, 0xff, 0x60, 0xff, 0x4a, 0xff, 0x52, 0xff, 0x68, 0xff,
+0x94, 0xff, 0xd6, 0xff, 0x00, 0x00, 0x2e, 0x00, 0x50, 0x00, 0x68, 0x00, 0x82, 0x00, 0x7a, 0x00,
+0x66, 0x00, 0x36, 0x00, 0x04, 0x00, 0xe2, 0xff, 0xa6, 0xff, 0x90, 0xff, 0x72, 0xff, 0x66, 0xff,
+0x70, 0xff, 0x82, 0xff, 0xa8, 0xff, 0xd2, 0xff, 0xfc, 0xff, 0x34, 0x00, 0x44, 0x00, 0x54, 0x00,
+0x6a, 0x00, 0x52, 0x00, 0x48, 0x00, 0x28, 0x00, 0xfa, 0xff, 0xea, 0xff, 0xc4, 0xff, 0xb0, 0xff,
+0xa0, 0xff, 0x92, 0xff, 0x96, 0xff, 0xa4, 0xff, 0xc4, 0xff, 0xe6, 0xff, 0xfe, 0xff, 0x1c, 0x00,
+0x34, 0x00, 0x38, 0x00, 0x32, 0x00, 0x34, 0x00, 0x26, 0x00, 0x0a, 0x00, 0xfc, 0xff, 0xe4, 0xff,
+0xce, 0xff, 0xbe, 0xff, 0xc2, 0xff, 0xbe, 0xff, 0xba, 0xff, 0xcc, 0xff, 0xd0, 0xff, 0xe8, 0xff,
+0xf8, 0xff, 0x06, 0x00, 0x18, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x0e, 0x00,
+0xf6, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xee, 0xff, 0xe4, 0xff, 0xf2, 0xff, 0xdc, 0xff,
+0xda, 0xff, 0xe6, 0xff, 0xea, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0x00, 0x00,
+0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x06, 0x00,
+0xf0, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xde, 0xff, 0xd0, 0xff, 0xc0, 0xff, 0xbc, 0xff, 0xc6, 0xff,
+0xc8, 0xff, 0xd2, 0xff, 0xec, 0xff, 0xfa, 0xff, 0x12, 0x00, 0x2c, 0x00, 0x2e, 0x00, 0x2a, 0x00,
+0x26, 0x00, 0x28, 0x00, 0x0e, 0x00, 0xfc, 0xff, 0xf6, 0xff, 0xc8, 0xff, 0xaa, 0xff, 0xa6, 0xff,
+0x94, 0xff, 0xa4, 0xff, 0xa6, 0xff, 0xbe, 0xff, 0xec, 0xff, 0x02, 0x00, 0x2c, 0x00, 0x48, 0x00,
+0x50, 0x00, 0x5a, 0x00, 0x50, 0x00, 0x38, 0x00, 0x1a, 0x00, 0x02, 0x00, 0xcc, 0xff, 0x9e, 0xff,
+0x8c, 0xff, 0x72, 0xff, 0x6e, 0xff, 0x84, 0xff, 0x8e, 0xff, 0xb2, 0xff, 0xde, 0xff, 0x08, 0x00,
+0x3c, 0x00, 0x4e, 0x00, 0x6a, 0x00, 0x6e, 0x00, 0x4e, 0x00, 0x38, 0x00, 0x02, 0x00, 0xd8, 0xff,
+0xb2, 0xff, 0x88, 0xff, 0x66, 0xff, 0x4a, 0xff, 0x58, 0xff, 0x6e, 0xff, 0x96, 0xff, 0xc8, 0xff,
+0xfc, 0xff, 0x28, 0x00, 0x56, 0x00, 0x7c, 0x00, 0x8a, 0x00, 0x84, 0x00, 0x6c, 0x00, 0x38, 0x00,
+0x0a, 0x00, 0xd8, 0xff, 0xa0, 0xff, 0x76, 0xff, 0x46, 0xff, 0x3a, 0xff, 0x46, 0xff, 0x64, 0xff,
+0xb2, 0xff, 0xd8, 0xff, 0x0c, 0x00, 0x3e, 0x00, 0x70, 0x00, 0xa2, 0x00, 0xa4, 0x00, 0x8e, 0x00,
+0x6a, 0x00, 0x2e, 0x00, 0xf4, 0xff, 0xc8, 0xff, 0x8e, 0xff, 0x52, 0xff, 0x36, 0xff, 0x26, 0xff,
+0x3e, 0xff, 0x62, 0xff, 0xae, 0xff, 0xf4, 0xff, 0x1e, 0x00, 0x5c, 0x00, 0x94, 0x00, 0xb2, 0x00,
+0xaa, 0x00, 0x9a, 0x00, 0x74, 0x00, 0x28, 0x00, 0xf6, 0xff, 0xc6, 0xff, 0x8a, 0xff, 0x5c, 0xff,
+0x32, 0xff, 0x2e, 0xff, 0x4e, 0xff, 0x7e, 0xff, 0xc8, 0xff, 0x02, 0x00, 0x3a, 0x00, 0x78, 0x00,
+0xa2, 0x00, 0xc0, 0x00, 0xb4, 0x00, 0x9a, 0x00, 0x70, 0x00, 0x26, 0x00, 0xe6, 0xff, 0xbc, 0xff,
+0x7e, 0xff, 0x44, 0xff, 0x30, 0xff, 0x3a, 0xff, 0x5c, 0xff, 0x86, 0xff, 0xcc, 0xff, 0x0a, 0x00,
+0x2c, 0x00, 0x6c, 0x00, 0x96, 0x00, 0x9e, 0x00, 0xa0, 0x00, 0x80, 0x00, 0x4a, 0x00, 0x12, 0x00,
+0xd6, 0xff, 0x9e, 0xff, 0x72, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0x5c, 0xff, 0x70, 0xff, 0xa4, 0xff,
+0xd8, 0xff, 0x0e, 0x00, 0x3a, 0x00, 0x64, 0x00, 0x86, 0x00, 0x8a, 0x00, 0x84, 0x00, 0x66, 0x00,
+0x38, 0x00, 0x02, 0x00, 0xce, 0xff, 0xa6, 0xff, 0x7e, 0xff, 0x66, 0xff, 0x62, 0xff, 0x6e, 0xff,
+0x84, 0xff, 0xb4, 0xff, 0xf0, 0xff, 0x0c, 0x00, 0x38, 0x00, 0x50, 0x00, 0x5e, 0x00, 0x6a, 0x00,
+0x5c, 0x00, 0x42, 0x00, 0x16, 0x00, 0xf0, 0xff, 0xc4, 0xff, 0x98, 0xff, 0x86, 0xff, 0x70, 0xff,
+0x70, 0xff, 0x86, 0xff, 0x9c, 0xff, 0xbc, 0xff, 0xde, 0xff, 0x02, 0x00, 0x2c, 0x00, 0x32, 0x00,
+0x3a, 0x00, 0x48, 0x00, 0x32, 0x00, 0x20, 0x00, 0x02, 0x00, 0xf0, 0xff, 0xd6, 0xff, 0xb0, 0xff,
+0xb0, 0xff, 0xa4, 0xff, 0xa0, 0xff, 0xaa, 0xff, 0xbe, 0xff, 0xdc, 0xff, 0xee, 0xff, 0xfc, 0xff,
+0x18, 0x00, 0x26, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x20, 0x00, 0x0e, 0x00, 0xfe, 0xff, 0xec, 0xff,
+0xea, 0xff, 0xd0, 0xff, 0xd8, 0xff, 0xd4, 0xff, 0xc2, 0xff, 0xc4, 0xff, 0xcc, 0xff, 0xd8, 0xff,
+0xdc, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00,
+0x06, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf0, 0xff,
+0xe6, 0xff, 0xd6, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd2, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xf0, 0xff,
+0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x14, 0x00, 0x20, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x2a, 0x00,
+0x16, 0x00, 0x04, 0x00, 0xf0, 0xff, 0xd8, 0xff, 0xc6, 0xff, 0xae, 0xff, 0xb4, 0xff, 0xbc, 0xff,
+0xba, 0xff, 0xc8, 0xff, 0xde, 0xff, 0xfa, 0xff, 0x16, 0x00, 0x30, 0x00, 0x40, 0x00, 0x4a, 0x00,
+0x42, 0x00, 0x36, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0xe8, 0xff, 0xc0, 0xff, 0xa6, 0xff, 0x90, 0xff,
+0x86, 0xff, 0x98, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xd8, 0xff, 0xfe, 0xff, 0x24, 0x00, 0x54, 0x00,
+0x68, 0x00, 0x68, 0x00, 0x68, 0x00, 0x54, 0x00, 0x36, 0x00, 0x10, 0x00, 0xd6, 0xff, 0xb4, 0xff,
+0x88, 0xff, 0x68, 0xff, 0x68, 0xff, 0x6a, 0xff, 0x84, 0xff, 0xa4, 0xff, 0xdc, 0xff, 0x0c, 0x00,
+0x34, 0x00, 0x66, 0x00, 0x86, 0x00, 0x8c, 0x00, 0x7c, 0x00, 0x5e, 0x00, 0x28, 0x00, 0xfe, 0xff,
+0xc4, 0xff, 0x8c, 0xff, 0x54, 0xff, 0x38, 0xff, 0x3e, 0xff, 0x48, 0xff, 0x6a, 0xff, 0x9a, 0xff,
+0xd6, 0xff, 0x10, 0x00, 0x4c, 0x00, 0x82, 0x00, 0x9e, 0x00, 0xa0, 0x00, 0x82, 0x00, 0x5c, 0x00,
+0x1e, 0x00, 0xf0, 0xff, 0xb4, 0xff, 0x76, 0xff, 0x48, 0xff, 0x2e, 0xff, 0x30, 0xff, 0x46, 0xff,
+0x78, 0xff, 0xb8, 0xff, 0xf8, 0xff, 0x2c, 0x00, 0x66, 0x00, 0x9e, 0x00, 0xb8, 0x00, 0xb2, 0x00,
+0x90, 0x00, 0x5e, 0x00, 0x12, 0x00, 0xe6, 0xff, 0xa0, 0xff, 0x5e, 0xff, 0x3e, 0xff, 0x22, 0xff,
+0x26, 0xff, 0x48, 0xff, 0x80, 0xff, 0xce, 0xff, 0x02, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xa8, 0x00,
+0xbc, 0x00, 0xa8, 0x00, 0x7e, 0x00, 0x3c, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x8e, 0xff, 0x5a, 0xff,
+0x2a, 0xff, 0x22, 0xff, 0x42, 0xff, 0x6a, 0xff, 0x98, 0xff, 0xe2, 0xff, 0x22, 0x00, 0x54, 0x00,
+0x8e, 0x00, 0xb2, 0x00, 0xbc, 0x00, 0x9a, 0x00, 0x72, 0x00, 0x38, 0x00, 0x02, 0x00, 0xc0, 0xff,
+0x88, 0xff, 0x56, 0xff, 0x44, 0xff, 0x4a, 0xff, 0x52, 0xff, 0x80, 0xff, 0xbc, 0xff, 0xfc, 0xff,
+0x30, 0x00, 0x6c, 0x00, 0x98, 0x00, 0xa6, 0x00, 0xa2, 0x00, 0x82, 0x00, 0x60, 0x00, 0x2e, 0x00,
+0xf8, 0xff, 0xba, 0xff, 0x82, 0xff, 0x5a, 0xff, 0x4e, 0xff, 0x5a, 0xff, 0x66, 0xff, 0x90, 0xff,
+0xcc, 0xff, 0xf6, 0xff, 0x34, 0x00, 0x62, 0x00, 0x7a, 0x00, 0x84, 0x00, 0x84, 0x00, 0x70, 0x00,
+0x44, 0x00, 0x20, 0x00, 0xee, 0xff, 0xb6, 0xff, 0x96, 0xff, 0x80, 0xff, 0x70, 0xff, 0x7a, 0xff,
+0x86, 0xff, 0xa4, 0xff, 0xde, 0xff, 0x06, 0x00, 0x2c, 0x00, 0x48, 0x00, 0x50, 0x00, 0x56, 0x00,
+0x52, 0x00, 0x4a, 0x00, 0x32, 0x00, 0x04, 0x00, 0xe0, 0xff, 0xc4, 0xff, 0xa4, 0xff, 0x9c, 0xff,
+0x94, 0xff, 0x90, 0xff, 0x9e, 0xff, 0xbc, 0xff, 0xde, 0xff, 0x00, 0x00, 0x10, 0x00, 0x26, 0x00,
+0x26, 0x00, 0x26, 0x00, 0x22, 0x00, 0x18, 0x00, 0xfe, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xc2, 0xff,
+0xb6, 0xff, 0xbe, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xc4, 0xff, 0xc2, 0xff, 0xe2, 0xff, 0xf6, 0xff,
+0xec, 0xff, 0x08, 0x00, 0x00, 0x00, 0xfa, 0xff, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0xf4, 0xff,
+0xf2, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xe6, 0xff, 0xdc, 0xff, 0xde, 0xff, 0xd8, 0xff,
+0xde, 0xff, 0xd2, 0xff, 0xd8, 0xff, 0xd6, 0xff, 0xd4, 0xff, 0xe4, 0xff, 0xec, 0xff, 0xea, 0xff,
+0xfa, 0xff, 0x02, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0x06, 0x00, 0xfc, 0xff, 0xfa, 0xff,
+0xf0, 0xff, 0xdc, 0xff, 0xd0, 0xff, 0xb8, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xc2, 0xff, 0xc6, 0xff,
+0xe0, 0xff, 0xf6, 0xff, 0x06, 0x00, 0x1e, 0x00, 0x34, 0x00, 0x4c, 0x00, 0x40, 0x00, 0x3a, 0x00,
+0x2e, 0x00, 0x1a, 0x00, 0x00, 0x00, 0xe2, 0xff, 0xca, 0xff, 0xa4, 0xff, 0x88, 0xff, 0x90, 0xff,
+0xa6, 0xff, 0xb6, 0xff, 0xca, 0xff, 0xf8, 0xff, 0x18, 0x00, 0x48, 0x00, 0x60, 0x00, 0x62, 0x00,
+0x6e, 0x00, 0x58, 0x00, 0x42, 0x00, 0x22, 0x00, 0xfa, 0xff, 0xd4, 0xff, 0xa2, 0xff, 0x78, 0xff,
+0x64, 0xff, 0x72, 0xff, 0x88, 0xff, 0xa0, 0xff, 0xca, 0xff, 0xf6, 0xff, 0x24, 0x00, 0x56, 0x00,
+0x72, 0x00, 0x84, 0x00, 0x80, 0x00, 0x6c, 0x00, 0x48, 0x00, 0x20, 0x00, 0xf0, 0xff, 0xc0, 0xff,
+0x92, 0xff, 0x72, 0xff, 0x5a, 0xff, 0x58, 0xff, 0x80, 0xff, 0x9a, 0xff, 0xd2, 0xff, 0x08, 0x00,
+0x36, 0x00, 0x68, 0x00, 0x88, 0x00, 0x94, 0x00, 0x94, 0x00, 0x7e, 0x00, 0x44, 0x00, 0x18, 0x00,
+0xe0, 0xff, 0xae, 0xff, 0x70, 0xff, 0x50, 0xff, 0x3a, 0xff, 0x4a, 0xff, 0x6e, 0xff, 0x90, 0xff,
+0xd2, 0xff, 0xfe, 0xff, 0x3e, 0x00, 0x6e, 0x00, 0x94, 0x00, 0xac, 0x00, 0x94, 0x00, 0x80, 0x00,
+0x3e, 0x00, 0xfc, 0xff, 0xd8, 0xff, 0x92, 0xff, 0x54, 0xff, 0x36, 0xff, 0x2e, 0xff, 0x44, 0xff,
+0x5c, 0xff, 0x9e, 0xff, 0xda, 0xff, 0x08, 0x00, 0x4c, 0x00, 0x86, 0x00, 0xaa, 0x00, 0xb4, 0x00,
+0xa4, 0x00, 0x7c, 0x00, 0x38, 0x00, 0xfc, 0xff, 0xce, 0xff, 0x7c, 0xff, 0x50, 0xff, 0x2a, 0xff,
+0x26, 0xff, 0x44, 0xff, 0x66, 0xff, 0xaa, 0xff, 0xee, 0xff, 0x16, 0x00, 0x52, 0x00, 0x8a, 0x00,
+0xb2, 0x00, 0xb2, 0x00, 0x96, 0x00, 0x64, 0x00, 0x1c, 0x00, 0xf0, 0xff, 0xbe, 0xff, 0x7c, 0xff,
+0x46, 0xff, 0x28, 0xff, 0x2c, 0xff, 0x4e, 0xff, 0x7c, 0xff, 0xc2, 0xff, 0xfc, 0xff, 0x24, 0x00,
+0x56, 0x00, 0x84, 0x00, 0xa4, 0x00, 0xa0, 0x00, 0x8e, 0x00, 0x56, 0x00, 0x1a, 0x00, 0xea, 0xff,
+0xb2, 0xff, 0x86, 0xff, 0x60, 0xff, 0x48, 0xff, 0x4c, 0xff, 0x6a, 0xff, 0x92, 0xff, 0xd0, 0xff,
+0x04, 0x00, 0x34, 0x00, 0x60, 0x00, 0x86, 0x00, 0x92, 0x00, 0x84, 0x00, 0x72, 0x00, 0x40, 0x00,
+0x14, 0x00, 0xe8, 0xff, 0xaa, 0xff, 0x8a, 0xff, 0x74, 0xff, 0x66, 0xff, 0x64, 0xff, 0x80, 0xff,
+0xa8, 0xff, 0xd6, 0xff, 0x08, 0x00, 0x38, 0x00, 0x4c, 0x00, 0x5a, 0x00, 0x6e, 0x00, 0x62, 0x00,
+0x4e, 0x00, 0x24, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xac, 0xff, 0x9e, 0xff, 0x90, 0xff, 0x82, 0xff,
+0x90, 0xff, 0x9a, 0xff, 0xc2, 0xff, 0xe4, 0xff, 0x06, 0x00, 0x28, 0x00, 0x34, 0x00, 0x44, 0x00,
+0x50, 0x00, 0x4a, 0x00, 0x3c, 0x00, 0x18, 0x00, 0xfe, 0xff, 0xee, 0xff, 0xcc, 0xff, 0xc0, 0xff,
+0xb6, 0xff, 0xaa, 0xff, 0xa8, 0xff, 0xbc, 0xff, 0xd2, 0xff, 0xea, 0xff, 0xfa, 0xff, 0x0e, 0x00,
+0x20, 0x00, 0x22, 0x00, 0x24, 0x00, 0x26, 0x00, 0x1e, 0x00, 0x06, 0x00, 0x00, 0x00, 0xf4, 0xff,
+0xe0, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xc2, 0xff, 0xcc, 0xff, 0xc6, 0xff, 0xd4, 0xff, 0xda, 0xff,
+0xe6, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0x0a, 0x00, 0x04, 0x00, 0x02, 0x00,
+0x0c, 0x00, 0x06, 0x00, 0x02, 0x00, 0xfc, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xee, 0xff, 0xf0, 0xff,
+0xd4, 0xff, 0xd6, 0xff, 0xd4, 0xff, 0xc6, 0xff, 0xd8, 0xff, 0xd4, 0xff, 0xd6, 0xff, 0xe4, 0xff,
+0xf8, 0xff, 0x04, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x22, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x1c, 0x00,
+0x06, 0x00, 0xf4, 0xff, 0xe0, 0xff, 0xc4, 0xff, 0xb2, 0xff, 0xaa, 0xff, 0xb0, 0xff, 0xa6, 0xff,
+0xb2, 0xff, 0xce, 0xff, 0xe8, 0xff, 0xf8, 0xff, 0x1e, 0x00, 0x48, 0x00, 0x48, 0x00, 0x46, 0x00,
+0x38, 0x00, 0x30, 0x00, 0x10, 0x00, 0x04, 0x00, 0xde, 0xff, 0xac, 0xff, 0x94, 0xff, 0x86, 0xff,
+0x88, 0xff, 0x90, 0xff, 0xa8, 0xff, 0xc8, 0xff, 0xec, 0xff, 0x10, 0x00, 0x56, 0x00, 0x68, 0x00,
+0x6e, 0x00, 0x72, 0x00, 0x56, 0x00, 0x44, 0x00, 0x24, 0x00, 0xfc, 0xff, 0xc0, 0xff, 0x8e, 0xff,
+0x78, 0xff, 0x64, 0xff, 0x62, 0xff, 0x7e, 0xff, 0xa2, 0xff, 0xd2, 0xff, 0xfc, 0xff, 0x2c, 0x00,
+0x66, 0x00, 0x82, 0x00, 0x92, 0x00, 0x8c, 0x00, 0x6c, 0x00, 0x34, 0x00, 0x0e, 0x00, 0xe0, 0xff,
+0x92, 0xff, 0x76, 0xff, 0x48, 0xff, 0x40, 0xff, 0x46, 0xff, 0x68, 0xff, 0x9c, 0xff, 0xd2, 0xff,
+0x14, 0x00, 0x46, 0x00, 0x84, 0x00, 0xa2, 0x00, 0xac, 0x00, 0x96, 0x00, 0x76, 0x00, 0x32, 0x00,
+0xfe, 0xff, 0xc6, 0xff, 0x8c, 0xff, 0x5a, 0xff, 0x34, 0xff, 0x32, 0xff, 0x3a, 0xff, 0x66, 0xff,
+0xb2, 0xff, 0xec, 0xff, 0x26, 0x00, 0x6a, 0x00, 0xa2, 0x00, 0xb4, 0x00, 0xae, 0x00, 0x9a, 0x00,
+0x6e, 0x00, 0x20, 0x00, 0xee, 0xff, 0xb6, 0xff, 0x68, 0xff, 0x3e, 0xff, 0x20, 0xff, 0x20, 0xff,
+0x3a, 0xff, 0x6e, 0xff, 0xc0, 0xff, 0xfa, 0xff, 0x2a, 0x00, 0x70, 0x00, 0xa0, 0x00, 0xba, 0x00,
+0xa8, 0x00, 0x8c, 0x00, 0x50, 0x00, 0x0a, 0x00, 0xde, 0xff, 0x9c, 0xff, 0x62, 0xff, 0x34, 0xff,
+0x26, 0xff, 0x26, 0xff, 0x50, 0xff, 0x92, 0xff, 0xca, 0xff, 0x0e, 0x00, 0x42, 0x00, 0x7a, 0x00,
+0xa8, 0x00, 0xbe, 0x00, 0x9c, 0x00, 0x78, 0x00, 0x40, 0x00, 0x06, 0x00, 0xd2, 0xff, 0x9e, 0xff,
+0x64, 0xff, 0x3e, 0xff, 0x2e, 0xff, 0x40, 0xff, 0x6c, 0xff, 0x9e, 0xff, 0xe0, 0xff, 0x1c, 0x00,
+0x4c, 0x00, 0x78, 0x00, 0x92, 0x00, 0x92, 0x00, 0x82, 0x00, 0x58, 0x00, 0x2c, 0x00, 0xf8, 0xff,
+0xc2, 0xff, 0x92, 0xff, 0x68, 0xff, 0x44, 0xff, 0x42, 0xff, 0x5e, 0xff, 0x74, 0xff, 0xb4, 0xff,
+0xea, 0xff, 0x20, 0x00, 0x4e, 0x00, 0x62, 0x00, 0x80, 0x00, 0x7c, 0x00, 0x66, 0x00, 0x56, 0x00,
+0x22, 0x00, 0xfa, 0xff, 0xc6, 0xff, 0xa0, 0xff, 0x8a, 0xff, 0x74, 0xff, 0x72, 0xff, 0x82, 0xff,
+0x96, 0xff, 0xcc, 0xff, 0xfa, 0xff, 0x20, 0x00, 0x42, 0x00, 0x4c, 0x00, 0x5c, 0x00, 0x58, 0x00,
+0x58, 0x00, 0x38, 0x00, 0x10, 0x00, 0xe8, 0xff, 0xcc, 0xff, 0xb2, 0xff, 0xa0, 0xff, 0x8a, 0xff,
+0x90, 0xff, 0xa0, 0xff, 0xc0, 0xff, 0xe4, 0xff, 0xf2, 0xff, 0x0c, 0x00, 0x26, 0x00, 0x28, 0x00,
+0x2c, 0x00, 0x2c, 0x00, 0x26, 0x00, 0x18, 0x00, 0x04, 0x00, 0xea, 0xff, 0xdc, 0xff, 0xce, 0xff,
+0xbe, 0xff, 0xbe, 0xff, 0xc2, 0xff, 0xce, 0xff, 0xda, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0xf8, 0xff,
+0x06, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x12, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xfa, 0xff,
+0xf6, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xde, 0xff,
+0xd8, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xe8, 0xff, 0xdc, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0x04, 0x00,
+0x12, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x16, 0x00, 0x08, 0x00, 0xfe, 0xff, 0xea, 0xff,
+0xde, 0xff, 0xbe, 0xff, 0xbc, 0xff, 0xb4, 0xff, 0xae, 0xff, 0xb6, 0xff, 0xb8, 0xff, 0xd8, 0xff,
+0xf4, 0xff, 0x12, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x34, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x36, 0x00,
+0x1a, 0x00, 0xf6, 0xff, 0xd6, 0xff, 0xc2, 0xff, 0x9e, 0xff, 0x9c, 0xff, 0x90, 0xff, 0x98, 0xff,
+0xae, 0xff, 0xbe, 0xff, 0xe4, 0xff, 0xfa, 0xff, 0x2e, 0x00, 0x3c, 0x00, 0x56, 0x00, 0x60, 0x00,
+0x5a, 0x00, 0x50, 0x00, 0x28, 0x00, 0xf8, 0xff, 0xca, 0xff, 0xa8, 0xff, 0x8c, 0xff, 0x70, 0xff,
+0x6e, 0xff, 0x80, 0xff, 0x90, 0xff, 0xac, 0xff, 0xdc, 0xff, 0x0e, 0x00, 0x44, 0x00, 0x68, 0x00,
+0x8c, 0x00, 0x8c, 0x00, 0x76, 0x00, 0x62, 0x00, 0x34, 0x00, 0xf8, 0xff, 0xc8, 0xff, 0x94, 0xff,
+0x78, 0xff, 0x56, 0xff, 0x54, 0xff, 0x5e, 0xff, 0x88, 0xff, 0xba, 0xff, 0xe8, 0xff, 0x32, 0x00,
+0x5e, 0x00, 0x8c, 0x00, 0xb0, 0x00, 0xa2, 0x00, 0x90, 0x00, 0x5c, 0x00, 0x22, 0x00, 0xf2, 0xff,
+0xb6, 0xff, 0x78, 0xff, 0x4a, 0xff, 0x32, 0xff, 0x3e, 0xff, 0x56, 0xff, 0x88, 0xff, 0xd2, 0xff,
+0xf8, 0xff, 0x36, 0x00, 0x76, 0x00, 0xa6, 0x00, 0xc2, 0x00, 0xae, 0x00, 0x86, 0x00, 0x46, 0x00,
+0x12, 0x00, 0xd4, 0xff, 0x96, 0xff, 0x62, 0xff, 0x38, 0xff, 0x34, 0xff, 0x3e, 0xff, 0x5e, 0xff,
+0x9c, 0xff, 0xe0, 0xff, 0x0c, 0x00, 0x54, 0x00, 0x8e, 0x00, 0xb2, 0x00, 0xc6, 0x00, 0xa6, 0x00,
+0x7e, 0x00, 0x3a, 0x00, 0xfc, 0xff, 0xcc, 0xff, 0x80, 0xff, 0x5e, 0xff, 0x30, 0xff, 0x26, 0xff,
+0x40, 0xff, 0x66, 0xff, 0xa2, 0xff, 0xea, 0xff, 0x18, 0x00, 0x5c, 0x00, 0x96, 0x00, 0xa8, 0x00,
+0xb2, 0x00, 0x98, 0x00, 0x64, 0x00, 0x20, 0x00, 0xea, 0xff, 0xb2, 0xff, 0x82, 0xff, 0x4a, 0xff,
+0x2e, 0xff, 0x2e, 0xff, 0x46, 0xff, 0x72, 0xff, 0xa8, 0xff, 0xf0, 0xff, 0x28, 0x00, 0x58, 0x00,
+0x8a, 0x00, 0xa4, 0x00, 0xa2, 0x00, 0x88, 0x00, 0x5e, 0x00, 0x20, 0x00, 0xec, 0xff, 0xb0, 0xff,
+0x82, 0xff, 0x62, 0xff, 0x42, 0xff, 0x4e, 0xff, 0x5e, 0xff, 0x86, 0xff, 0xc2, 0xff, 0xfc, 0xff,
+0x32, 0x00, 0x62, 0x00, 0x88, 0x00, 0x90, 0x00, 0x84, 0x00, 0x6a, 0x00, 0x4c, 0x00, 0x0c, 0x00,
+0xe6, 0xff, 0xb4, 0xff, 0x80, 0xff, 0x72, 0xff, 0x62, 0xff, 0x68, 0xff, 0x7a, 0xff, 0x9c, 0xff,
+0xd4, 0xff, 0x0a, 0x00, 0x34, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x5e, 0x00, 0x66, 0x00, 0x52, 0x00,
+0x30, 0x00, 0x04, 0x00, 0xe4, 0xff, 0xb8, 0xff, 0xa0, 0xff, 0x98, 0xff, 0x92, 0xff, 0x9e, 0xff,
+0xa2, 0xff, 0xc0, 0xff, 0xf0, 0xff, 0x0c, 0x00, 0x28, 0x00, 0x3a, 0x00, 0x3c, 0x00, 0x4a, 0x00,
+0x44, 0x00, 0x32, 0x00, 0x20, 0x00, 0xfe, 0xff, 0xea, 0xff, 0xd2, 0xff, 0xbe, 0xff, 0xce, 0xff,
+0xbc, 0xff, 0xb2, 0xff, 0xc8, 0xff, 0xda, 0xff, 0xee, 0xff, 0xfc, 0xff, 0x06, 0x00, 0x1c, 0x00,
+0x14, 0x00, 0x1c, 0x00, 0x22, 0x00, 0x12, 0x00, 0x0a, 0x00, 0xfc, 0xff, 0xf6, 0xff, 0xf4, 0xff,
+0xea, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xde, 0xff, 0xd8, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xec, 0xff,
+0xf2, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0x0c, 0x00, 0x0c, 0x00,
+0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0xfa, 0xff, 0xf0, 0xff, 0x02, 0x00, 0xec, 0xff, 0xda, 0xff,
+0xdc, 0xff, 0xd6, 0xff, 0xc0, 0xff, 0xca, 0xff, 0xd0, 0xff, 0xce, 0xff, 0xe8, 0xff, 0xf0, 0xff,
+0xfa, 0xff, 0x06, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x04, 0x00,
+0xf2, 0xff, 0xd2, 0xff, 0xba, 0xff, 0xaa, 0xff, 0x94, 0xff, 0xa0, 0xff, 0xb2, 0xff, 0xb2, 0xff,
+0xd0, 0xff, 0xf0, 0xff, 0x06, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x48, 0x00, 0x3c, 0x00, 0x30, 0x00,
+0x28, 0x00, 0x10, 0x00, 0xe2, 0xff, 0xcc, 0xff, 0xaa, 0xff, 0x82, 0xff, 0x74, 0xff, 0x82, 0xff,
+0x98, 0xff, 0xa4, 0xff, 0xc8, 0xff, 0xf8, 0xff, 0x1e, 0x00, 0x42, 0x00, 0x68, 0x00, 0x74, 0x00,
+0x64, 0x00, 0x50, 0x00, 0x3a, 0x00, 0x18, 0x00, 0xe8, 0xff, 0xba, 0xff, 0x8e, 0xff, 0x6c, 0xff,
+0x56, 0xff, 0x5e, 0xff, 0x82, 0xff, 0xa2, 0xff, 0xc8, 0xff, 0x00, 0x00, 0x2e, 0x00, 0x60, 0x00,
+0x80, 0x00, 0x88, 0x00, 0x8c, 0x00, 0x70, 0x00, 0x40, 0x00, 0x18, 0x00, 0xec, 0xff, 0xb2, 0xff,
+0x7e, 0xff, 0x54, 0xff, 0x4c, 0xff, 0x56, 0xff, 0x76, 0xff, 0xaa, 0xff, 0xd8, 0xff, 0x12, 0x00,
+0x46, 0x00, 0x74, 0x00, 0x9a, 0x00, 0xa4, 0x00, 0x94, 0x00, 0x7c, 0x00, 0x44, 0x00, 0x0e, 0x00,
+0xea, 0xff, 0x9e, 0xff, 0x60, 0xff, 0x52, 0xff, 0x3c, 0xff, 0x4e, 0xff, 0x72, 0xff, 0xaa, 0xff,
+0xea, 0xff, 0x14, 0x00, 0x5a, 0x00, 0x88, 0x00, 0xb0, 0x00, 0xb6, 0x00, 0x9a, 0x00, 0x7a, 0x00,
+0x38, 0x00, 0x00, 0x00, 0xce, 0xff, 0x7e, 0xff, 0x52, 0xff, 0x40, 0xff, 0x2e, 0xff, 0x46, 0xff,
+0x78, 0xff, 0xb8, 0xff, 0xf8, 0xff, 0x24, 0x00, 0x6c, 0x00, 0x98, 0x00, 0xb6, 0x00, 0xb4, 0x00,
+0x90, 0x00, 0x70, 0x00, 0x28, 0x00, 0xf6, 0xff, 0xbe, 0xff, 0x70, 0xff, 0x40, 0xff, 0x36, 0xff,
+0x2c, 0xff, 0x4e, 0xff, 0x84, 0xff, 0xbe, 0xff, 0x02, 0x00, 0x2a, 0x00, 0x70, 0x00, 0xa6, 0x00,
+0xa8, 0x00, 0x9e, 0x00, 0x94, 0x00, 0x58, 0x00, 0x12, 0x00, 0xe0, 0xff, 0xa4, 0xff, 0x6c, 0xff,
+0x3e, 0xff, 0x2c, 0xff, 0x3c, 0xff, 0x68, 0xff, 0x92, 0xff, 0xc8, 0xff, 0x00, 0x00, 0x3c, 0x00,
+0x6c, 0x00, 0x8a, 0x00, 0x88, 0x00, 0x78, 0x00, 0x64, 0x00, 0x2c, 0x00, 0xfc, 0xff, 0xce, 0xff,
+0x92, 0xff, 0x64, 0xff, 0x58, 0xff, 0x4c, 0xff, 0x6c, 0xff, 0x84, 0xff, 0xa8, 0xff, 0xe8, 0xff,
+0x06, 0x00, 0x38, 0x00, 0x5c, 0x00, 0x68, 0x00, 0x66, 0x00, 0x5a, 0x00, 0x4a, 0x00, 0x1c, 0x00,
+0xf2, 0xff, 0xca, 0xff, 0x9e, 0xff, 0x88, 0xff, 0x80, 0xff, 0x7e, 0xff, 0x88, 0xff, 0xa2, 0xff,
+0xc6, 0xff, 0xf0, 0xff, 0x0a, 0x00, 0x26, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x40, 0x00,
+0x30, 0x00, 0x04, 0x00, 0xee, 0xff, 0xcc, 0xff, 0xb4, 0xff, 0xaa, 0xff, 0xb0, 0xff, 0xa6, 0xff,
+0xac, 0xff, 0xb8, 0xff, 0xce, 0xff, 0xec, 0xff, 0xfa, 0xff, 0x1e, 0x00, 0x1e, 0x00, 0x22, 0x00,
+0x2e, 0x00, 0x26, 0x00, 0x14, 0x00, 0x02, 0x00, 0xfa, 0xff, 0xf6, 0xff, 0xe0, 0xff, 0xda, 0xff,
+0xda, 0xff, 0xc4, 0xff, 0xcc, 0xff, 0xd2, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xfa, 0xff, 0x00, 0x00,
+0x04, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00,
+0x02, 0x00, 0xf6, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xce, 0xff,
+0xda, 0xff, 0xde, 0xff, 0xe4, 0xff, 0xe2, 0xff, 0xea, 0xff, 0xfe, 0xff, 0x04, 0x00, 0x10, 0x00,
+0x1e, 0x00, 0x28, 0x00, 0x2a, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x0a, 0x00, 0xf6, 0xff, 0xf4, 0xff,
+0xd8, 0xff, 0xc6, 0xff, 0xc0, 0xff, 0xb4, 0xff, 0xc4, 0xff, 0xbe, 0xff, 0xca, 0xff, 0xea, 0xff,
+0x02, 0x00, 0x12, 0x00, 0x28, 0x00, 0x42, 0x00, 0x40, 0x00, 0x3c, 0x00, 0x32, 0x00, 0x20, 0x00,
+0x04, 0x00, 0xee, 0xff, 0xc8, 0xff, 0xa0, 0xff, 0x94, 0xff, 0x84, 0xff, 0x8c, 0xff, 0x9a, 0xff,
+0xa4, 0xff, 0xcc, 0xff, 0xee, 0xff, 0x0a, 0x00, 0x36, 0x00, 0x50, 0x00, 0x5e, 0x00, 0x54, 0x00,
+0x40, 0x00, 0x28, 0x00, 0x02, 0x00, 0xde, 0xff, 0xa8, 0xff, 0x90, 0xff, 0x6a, 0xff, 0x60, 0xff,
+0x6a, 0xff, 0x84, 0xff, 0x9e, 0xff, 0xd6, 0xff, 0x00, 0x00, 0x2c, 0x00, 0x60, 0x00, 0x70, 0x00,
+0x82, 0x00, 0x74, 0x00, 0x58, 0x00, 0x34, 0x00, 0xfa, 0xff, 0xc6, 0xff, 0x90, 0xff, 0x6a, 0xff,
+0x52, 0xff, 0x48, 0xff, 0x54, 0xff, 0x84, 0xff, 0xac, 0xff, 0xda, 0xff, 0x14, 0x00, 0x4c, 0x00,
+0x7c, 0x00, 0x94, 0x00, 0x90, 0x00, 0x86, 0x00, 0x56, 0x00, 0x1e, 0x00, 0xf2, 0xff, 0xb2, 0xff,
+0x7e, 0xff, 0x46, 0xff, 0x34, 0xff, 0x40, 0xff, 0x54, 0xff, 0x84, 0xff, 0xc0, 0xff, 0xf2, 0xff,
+0x2a, 0x00, 0x66, 0x00, 0x9c, 0x00, 0xba, 0x00, 0xb6, 0x00, 0x92, 0x00, 0x68, 0x00, 0x1a, 0x00,
+0xea, 0xff, 0xb8, 0xff, 0x6c, 0xff, 0x4e, 0xff, 0x36, 0xff, 0x38, 0xff, 0x62, 0xff, 0x8e, 0xff,
+0xd8, 0xff, 0x0a, 0x00, 0x4a, 0x00, 0x92, 0x00, 0xb2, 0x00, 0xd2, 0x00, 0xb8, 0x00, 0x90, 0x00,
+0x58, 0x00, 0x12, 0x00, 0xec, 0xff, 0xa2, 0xff, 0x5c, 0xff, 0x34, 0xff, 0x26, 0xff, 0x2e, 0xff,
+0x60, 0xff, 0x9c, 0xff, 0xe0, 0xff, 0x0e, 0x00, 0x52, 0x00, 0x8e, 0x00, 0xac, 0x00, 0xc2, 0x00,
+0xaa, 0x00, 0x88, 0x00, 0x42, 0x00, 0x00, 0x00, 0xd0, 0xff, 0x8e, 0xff, 0x5c, 0xff, 0x3e, 0xff,
+0x34, 0xff, 0x4a, 0xff, 0x6c, 0xff, 0xb4, 0xff, 0xec, 0xff, 0x28, 0x00, 0x60, 0x00, 0x8a, 0x00,
+0xae, 0x00, 0xae, 0x00, 0x9a, 0x00, 0x66, 0x00, 0x30, 0x00, 0xfc, 0xff, 0xb8, 0xff, 0x9a, 0xff,
+0x6a, 0xff, 0x46, 0xff, 0x44, 0xff, 0x5e, 0xff, 0x8a, 0xff, 0xc2, 0xff, 0xfe, 0xff, 0x2a, 0x00,
+0x56, 0x00, 0x72, 0x00, 0x80, 0x00, 0x82, 0x00, 0x68, 0x00, 0x4a, 0x00, 0x12, 0x00, 0xe0, 0xff,
+0xa8, 0xff, 0x7e, 0xff, 0x68, 0xff, 0x5a, 0xff, 0x6a, 0xff, 0x7c, 0xff, 0x9e, 0xff, 0xce, 0xff,
+0xf0, 0xff, 0x1e, 0x00, 0x50, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x56, 0x00, 0x48, 0x00, 0x28, 0x00,
+0x04, 0x00, 0xe4, 0xff, 0xb6, 0xff, 0x9e, 0xff, 0x8e, 0xff, 0x84, 0xff, 0x90, 0xff, 0xa2, 0xff,
+0xbe, 0xff, 0xe8, 0xff, 0x04, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x38, 0x00, 0x32, 0x00,
+0x32, 0x00, 0x18, 0x00, 0xf0, 0xff, 0xe0, 0xff, 0xc2, 0xff, 0xae, 0xff, 0xac, 0xff, 0xae, 0xff,
+0xb2, 0xff, 0xb6, 0xff, 0xc6, 0xff, 0xdc, 0xff, 0xf4, 0xff, 0x04, 0x00, 0x0e, 0x00, 0x10, 0x00,
+0x14, 0x00, 0x1c, 0x00, 0x08, 0x00, 0x04, 0x00, 0xf2, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xdc, 0xff,
+0xe0, 0xff, 0xd4, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xf4, 0xff,
+0xf4, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x04, 0x00, 0xfe, 0xff, 0x10, 0x00, 0x0c, 0x00,
+0x0a, 0x00, 0x14, 0x00, 0x06, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xe0, 0xff,
+0xd6, 0xff, 0xce, 0xff, 0xc4, 0xff, 0xd0, 0xff, 0xce, 0xff, 0xdc, 0xff, 0xee, 0xff, 0xfc, 0xff,
+0x08, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x26, 0x00, 0x22, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0xfe, 0xff,
+0xe6, 0xff, 0xd0, 0xff, 0xb4, 0xff, 0xa0, 0xff, 0xaa, 0xff, 0xa8, 0xff, 0xaa, 0xff, 0xda, 0xff,
+0xee, 0xff, 0x00, 0x00, 0x24, 0x00, 0x42, 0x00, 0x56, 0x00, 0x58, 0x00, 0x4e, 0x00, 0x40, 0x00,
+0x28, 0x00, 0x06, 0x00, 0xf0, 0xff, 0xc0, 0xff, 0x94, 0xff, 0x84, 0xff, 0x84, 0xff, 0x90, 0xff,
+0x9e, 0xff, 0xc4, 0xff, 0xf0, 0xff, 0x08, 0x00, 0x46, 0x00, 0x5a, 0x00, 0x64, 0x00, 0x70, 0x00,
+0x58, 0x00, 0x44, 0x00, 0x22, 0x00, 0xf4, 0xff, 0xc8, 0xff, 0x8c, 0xff, 0x6a, 0xff, 0x5a, 0xff,
+0x56, 0xff, 0x66, 0xff, 0x90, 0xff, 0xc8, 0xff, 0xe8, 0xff, 0x24, 0x00, 0x50, 0x00, 0x68, 0x00,
+0x80, 0x00, 0x80, 0x00, 0x72, 0x00, 0x42, 0x00, 0x1a, 0x00, 0xe4, 0xff, 0xae, 0xff, 0x80, 0xff,
+0x56, 0xff, 0x42, 0xff, 0x4c, 0xff, 0x62, 0xff, 0x96, 0xff, 0xce, 0xff, 0x04, 0x00, 0x38, 0x00,
+0x66, 0x00, 0x90, 0x00, 0x9c, 0x00, 0x94, 0x00, 0x80, 0x00, 0x3e, 0x00, 0x0e, 0x00, 0xce, 0xff,
+0x94, 0xff, 0x6c, 0xff, 0x3e, 0xff, 0x2e, 0xff, 0x3a, 0xff, 0x56, 0xff, 0x92, 0xff, 0xda, 0xff,
+0x10, 0x00, 0x3c, 0x00, 0x70, 0x00, 0x92, 0x00, 0xa6, 0x00, 0x8e, 0x00, 0x6c, 0x00, 0x34, 0x00,
+0xf6, 0xff, 0xca, 0xff, 0x8c, 0xff, 0x58, 0xff, 0x30, 0xff, 0x20, 0xff, 0x3a, 0xff, 0x74, 0xff,
+0xa8, 0xff, 0xec, 0xff, 0x1e, 0x00, 0x50, 0x00, 0x88, 0x00, 0xa4, 0x00, 0xb0, 0x00, 0xa8, 0x00,
+0x6a, 0x00, 0x32, 0x00, 0xfa, 0xff, 0xc4, 0xff, 0x86, 0xff, 0x58, 0xff, 0x3c, 0xff, 0x3a, 0xff,
+0x50, 0xff, 0x7a, 0xff, 0xb8, 0xff, 0xf4, 0xff, 0x30, 0x00, 0x60, 0x00, 0x94, 0x00, 0xa4, 0x00,
+0xa4, 0x00, 0x90, 0x00, 0x5e, 0x00, 0x24, 0x00, 0xf2, 0xff, 0xba, 0xff, 0x80, 0xff, 0x54, 0xff,
+0x34, 0xff, 0x3e, 0xff, 0x54, 0xff, 0x86, 0xff, 0xbc, 0xff, 0xfa, 0xff, 0x28, 0x00, 0x60, 0x00,
+0x8a, 0x00, 0x9a, 0x00, 0x98, 0x00, 0x72, 0x00, 0x54, 0x00, 0x1e, 0x00, 0xde, 0xff, 0xb0, 0xff,
+0x7c, 0xff, 0x6a, 0xff, 0x54, 0xff, 0x5c, 0xff, 0x7c, 0xff, 0x9c, 0xff, 0xda, 0xff, 0x04, 0x00,
+0x3e, 0x00, 0x5a, 0x00, 0x74, 0x00, 0x88, 0x00, 0x70, 0x00, 0x58, 0x00, 0x32, 0x00, 0x06, 0x00,
+0xde, 0xff, 0xb0, 0xff, 0x9a, 0xff, 0x8e, 0xff, 0x7e, 0xff, 0x80, 0xff, 0x92, 0xff, 0xb8, 0xff,
+0xdc, 0xff, 0xfe, 0xff, 0x26, 0x00, 0x2e, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x34, 0x00,
+0x0e, 0x00, 0xee, 0xff, 0xda, 0xff, 0xba, 0xff, 0xaa, 0xff, 0xa6, 0xff, 0xa0, 0xff, 0xa6, 0xff,
+0xba, 0xff, 0xce, 0xff, 0xee, 0xff, 0x04, 0x00, 0x16, 0x00, 0x22, 0x00, 0x26, 0x00, 0x26, 0x00,
+0x24, 0x00, 0x10, 0x00, 0xfa, 0xff, 0xf6, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xc8, 0xff, 0xd2, 0xff,
+0xd0, 0xff, 0xd2, 0xff, 0xe2, 0xff, 0xde, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xfc, 0xff,
+0xf8, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xec, 0xff,
+0xf4, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xe4, 0xff, 0xdc, 0xff, 0xdc, 0xff,
+0xe4, 0xff, 0xde, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe0, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0x0c, 0x00,
+0x16, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x04, 0x00, 0x02, 0x00, 0xf2, 0xff,
+0xd4, 0xff, 0xc8, 0xff, 0xba, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xd8, 0xff, 0xe4, 0xff, 0xf0, 0xff,
+0x08, 0x00, 0x12, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x3a, 0x00, 0x1a, 0x00, 0x10, 0x00,
+0xf8, 0xff, 0xd4, 0xff, 0xc2, 0xff, 0xa0, 0xff, 0x90, 0xff, 0xa0, 0xff, 0xa6, 0xff, 0xb4, 0xff,
+0xcc, 0xff, 0xf6, 0xff, 0x18, 0x00, 0x40, 0x00, 0x52, 0x00, 0x54, 0x00, 0x52, 0x00, 0x46, 0x00,
+0x3e, 0x00, 0x12, 0x00, 0xf4, 0xff, 0xc8, 0xff, 0x90, 0xff, 0x88, 0xff, 0x76, 0xff, 0x76, 0xff,
+0x9a, 0xff, 0xa2, 0xff, 0xd4, 0xff, 0xfe, 0xff, 0x28, 0x00, 0x52, 0x00, 0x6e, 0x00, 0x76, 0x00,
+0x7c, 0x00, 0x62, 0x00, 0x3c, 0x00, 0x10, 0x00, 0xdc, 0xff, 0xac, 0xff, 0x78, 0xff, 0x52, 0xff,
+0x44, 0xff, 0x56, 0xff, 0x74, 0xff, 0x9e, 0xff, 0xd6, 0xff, 0x06, 0x00, 0x3c, 0x00, 0x72, 0x00,
+0x86, 0x00, 0x9a, 0x00, 0x80, 0x00, 0x70, 0x00, 0x30, 0x00, 0xfc, 0xff, 0xcc, 0xff, 0x88, 0xff,
+0x56, 0xff, 0x34, 0xff, 0x2e, 0xff, 0x3a, 0xff, 0x7a, 0xff, 0xac, 0xff, 0xe4, 0xff, 0x1e, 0x00,
+0x5a, 0x00, 0x92, 0x00, 0xa2, 0x00, 0xac, 0x00, 0x90, 0x00, 0x60, 0x00, 0x2c, 0x00, 0xf0, 0xff,
+0xc2, 0xff, 0x7a, 0xff, 0x40, 0xff, 0x32, 0xff, 0x2c, 0xff, 0x4c, 0xff, 0x8a, 0xff, 0xca, 0xff,
+0xf8, 0xff, 0x2a, 0x00, 0x70, 0x00, 0x9a, 0x00, 0xb6, 0x00, 0xa6, 0x00, 0x8a, 0x00, 0x52, 0x00,
+0x08, 0x00, 0xde, 0xff, 0xaa, 0xff, 0x5c, 0xff, 0x42, 0xff, 0x28, 0xff, 0x3c, 0xff, 0x56, 0xff,
+0x8c, 0xff, 0xd8, 0xff, 0x06, 0x00, 0x3e, 0x00, 0x72, 0x00, 0x9e, 0x00, 0xac, 0x00, 0x96, 0x00,
+0x7a, 0x00, 0x40, 0x00, 0x00, 0x00, 0xd8, 0xff, 0x9c, 0xff, 0x66, 0xff, 0x3e, 0xff, 0x44, 0xff,
+0x5a, 0xff, 0x72, 0xff, 0xb2, 0xff, 0xea, 0xff, 0x1a, 0x00, 0x4a, 0x00, 0x7c, 0x00, 0x96, 0x00,
+0x9e, 0x00, 0x96, 0x00, 0x6a, 0x00, 0x32, 0x00, 0x00, 0x00, 0xca, 0xff, 0x9a, 0xff, 0x70, 0xff,
+0x54, 0xff, 0x56, 0xff, 0x62, 0xff, 0x88, 0xff, 0xbc, 0xff, 0xf0, 0xff, 0x1c, 0x00, 0x46, 0x00,
+0x64, 0x00, 0x80, 0x00, 0x88, 0x00, 0x72, 0x00, 0x4e, 0x00, 0x1c, 0x00, 0xea, 0xff, 0xb0, 0xff,
+0x96, 0xff, 0x80, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x82, 0xff, 0xa6, 0xff, 0xd0, 0xff, 0xf6, 0xff,
+0x26, 0x00, 0x4c, 0x00, 0x54, 0x00, 0x68, 0x00, 0x64, 0x00, 0x4e, 0x00, 0x30, 0x00, 0x08, 0x00,
+0xe4, 0xff, 0xb8, 0xff, 0xa0, 0xff, 0x92, 0xff, 0x86, 0xff, 0x8a, 0xff, 0xa2, 0xff, 0xc6, 0xff,
+0xe4, 0xff, 0xfe, 0xff, 0x16, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x46, 0x00, 0x36, 0x00,
+0x14, 0x00, 0xf2, 0xff, 0xe0, 0xff, 0xca, 0xff, 0xb4, 0xff, 0xb2, 0xff, 0xb0, 0xff, 0xae, 0xff,
+0xbe, 0xff, 0xd2, 0xff, 0xda, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0x10, 0x00, 0x0e, 0x00, 0x16, 0x00,
+0x20, 0x00, 0x14, 0x00, 0x0e, 0x00, 0xf4, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xdc, 0xff, 0xda, 0xff,
+0xec, 0xff, 0xdc, 0xff, 0xd2, 0xff, 0xde, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xe8, 0xff, 0xf2, 0xff,
+0xea, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00,
+0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0xf4, 0xff, 0xee, 0xff, 0xd4, 0xff, 0xcc, 0xff,
+0xb4, 0xff, 0xc4, 0xff, 0xc8, 0xff, 0xc6, 0xff, 0xd2, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0x06, 0x00,
+0x18, 0x00, 0x26, 0x00, 0x30, 0x00, 0x26, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0xf8, 0xff, 0xe2, 0xff,
+0xc8, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa8, 0xff, 0xae, 0xff, 0xbc, 0xff, 0xca, 0xff, 0xea, 0xff,
+0x02, 0x00, 0x24, 0x00, 0x44, 0x00, 0x50, 0x00, 0x60, 0x00, 0x48, 0x00, 0x3a, 0x00, 0x26, 0x00,
+0x06, 0x00, 0xe2, 0xff, 0xb4, 0xff, 0x94, 0xff, 0x8c, 0xff, 0x8a, 0xff, 0x7e, 0xff, 0xa0, 0xff,
+0xbc, 0xff, 0xe8, 0xff, 0x08, 0x00, 0x40, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x7a, 0x00, 0x64, 0x00,
+0x48, 0x00, 0x30, 0x00, 0xfa, 0xff, 0xca, 0xff, 0x94, 0xff, 0x6e, 0xff, 0x64, 0xff, 0x5c, 0xff,
+0x74, 0xff, 0x8e, 0xff, 0xc2, 0xff, 0xf2, 0xff, 0x20, 0x00, 0x64, 0x00, 0x8a, 0x00, 0x9e, 0x00,
+0x9a, 0x00, 0x7e, 0x00, 0x50, 0x00, 0x1e, 0x00, 0xf6, 0xff, 0xac, 0xff, 0x72, 0xff, 0x5c, 0xff,
+0x44, 0xff, 0x42, 0xff, 0x60, 0xff, 0x92, 0xff, 0xd2, 0xff, 0x02, 0x00, 0x38, 0x00, 0x80, 0x00,
+0x9c, 0x00, 0xb6, 0x00, 0xa4, 0x00, 0x80, 0x00, 0x52, 0x00, 0x0a, 0x00, 0xd6, 0xff, 0xa0, 0xff,
+0x62, 0xff, 0x48, 0xff, 0x2c, 0xff, 0x34, 0xff, 0x5a, 0xff, 0x82, 0xff, 0xda, 0xff, 0x04, 0x00,
+0x3e, 0x00, 0x82, 0x00, 0x9a, 0x00, 0xb2, 0x00, 0xa0, 0x00, 0x74, 0x00, 0x42, 0x00, 0x10, 0x00,
+0xe0, 0xff, 0x92, 0xff, 0x62, 0xff, 0x40, 0xff, 0x30, 0xff, 0x38, 0xff, 0x5e, 0xff, 0xa2, 0xff,
+0xe0, 0xff, 0x0c, 0x00, 0x4a, 0x00, 0x82, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0x98, 0x00, 0x7c, 0x00,
+0x32, 0x00, 0x02, 0x00, 0xd0, 0xff, 0x94, 0xff, 0x5a, 0xff, 0x3c, 0xff, 0x34, 0xff, 0x4c, 0xff,
+0x74, 0xff, 0xb0, 0xff, 0xf2, 0xff, 0x1e, 0x00, 0x5a, 0x00, 0x7e, 0x00, 0x9e, 0x00, 0x9c, 0x00,
+0x86, 0x00, 0x62, 0x00, 0x1c, 0x00, 0xec, 0xff, 0xb2, 0xff, 0x8a, 0xff, 0x58, 0xff, 0x44, 0xff,
+0x4c, 0xff, 0x56, 0xff, 0x90, 0xff, 0xca, 0xff, 0x02, 0x00, 0x34, 0x00, 0x60, 0x00, 0x84, 0x00,
+0x90, 0x00, 0x82, 0x00, 0x6e, 0x00, 0x4a, 0x00, 0x10, 0x00, 0xdc, 0xff, 0xba, 0xff, 0x8e, 0xff,
+0x6e, 0xff, 0x64, 0xff, 0x6c, 0xff, 0x8a, 0xff, 0xa8, 0xff, 0xe8, 0xff, 0x14, 0x00, 0x2c, 0x00,
+0x52, 0x00, 0x58, 0x00, 0x70, 0x00, 0x66, 0x00, 0x50, 0x00, 0x2c, 0x00, 0xfe, 0xff, 0xe6, 0xff,
+0xb0, 0xff, 0x9e, 0xff, 0x84, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0xa2, 0xff, 0xc2, 0xff, 0xec, 0xff,
+0x0c, 0x00, 0x20, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x44, 0x00, 0x32, 0x00, 0x1a, 0x00,
+0xf0, 0xff, 0xe6, 0xff, 0xce, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xac, 0xff, 0xb0, 0xff, 0xba, 0xff,
+0xd8, 0xff, 0xec, 0xff, 0x02, 0x00, 0x10, 0x00, 0x24, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x20, 0x00,
+0x16, 0x00, 0x08, 0x00, 0x02, 0x00, 0xf0, 0xff, 0xdc, 0xff, 0xd6, 0xff, 0xc8, 0xff, 0xd0, 0xff,
+0xd8, 0xff, 0xd8, 0xff, 0xe0, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfc, 0xff,
+0xfe, 0xff, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x06, 0x00, 0x02, 0x00, 0xf0, 0xff, 0xf2, 0xff,
+0xec, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd6, 0xff, 0xd4, 0xff, 0xd0, 0xff,
+0xd2, 0xff, 0xe0, 0xff, 0xe8, 0xff, 0xee, 0xff, 0xf8, 0xff, 0x00, 0x00, 0x0a, 0x00, 0x0a, 0x00,
+0x1e, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x0a, 0x00, 0xf4, 0xff, 0xf6, 0xff, 0xe4, 0xff, 0xd0, 0xff,
+0xbe, 0xff, 0xac, 0xff, 0xbc, 0xff, 0xca, 0xff, 0xca, 0xff, 0xde, 0xff, 0xf2, 0xff, 0x08, 0x00,
+0x1a, 0x00, 0x28, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x2a, 0x00, 0x24, 0x00, 0x0a, 0x00, 0xf2, 0xff,
+0xe2, 0xff, 0xb2, 0xff, 0x9a, 0xff, 0x92, 0xff, 0x94, 0xff, 0xa4, 0xff, 0xb0, 0xff, 0xd4, 0xff,
+0xf4, 0xff, 0x10, 0x00, 0x36, 0x00, 0x4c, 0x00, 0x56, 0x00, 0x5c, 0x00, 0x50, 0x00, 0x3e, 0x00,
+0x1c, 0x00, 0xf2, 0xff, 0xc4, 0xff, 0xa2, 0xff, 0x8c, 0xff, 0x76, 0xff, 0x7a, 0xff, 0x8e, 0xff,
+0xa0, 0xff, 0xd0, 0xff, 0xfe, 0xff, 0x2a, 0x00, 0x58, 0x00, 0x6a, 0x00, 0x8c, 0x00, 0x7e, 0x00,
+0x70, 0x00, 0x52, 0x00, 0x18, 0x00, 0xf2, 0xff, 0xb2, 0xff, 0x7e, 0xff, 0x64, 0xff, 0x54, 0xff,
+0x54, 0xff, 0x70, 0xff, 0x92, 0xff, 0xc8, 0xff, 0x06, 0x00, 0x3e, 0x00, 0x72, 0x00, 0x8e, 0x00,
+0xa8, 0x00, 0xa0, 0x00, 0x7c, 0x00, 0x48, 0x00, 0x10, 0x00, 0xd6, 0xff, 0x96, 0xff, 0x5e, 0xff,
+0x42, 0xff, 0x34, 0xff, 0x3e, 0xff, 0x68, 0xff, 0xa6, 0xff, 0xdc, 0xff, 0x10, 0x00, 0x60, 0x00,
+0x90, 0x00, 0xa8, 0x00, 0xc4, 0x00, 0xa6, 0x00, 0x78, 0x00, 0x30, 0x00, 0xf2, 0xff, 0xc4, 0xff,
+0x78, 0xff, 0x44, 0xff, 0x24, 0xff, 0x28, 0xff, 0x48, 0xff, 0x70, 0xff, 0xba, 0xff, 0xf8, 0xff,
+0x1e, 0x00, 0x60, 0x00, 0x9c, 0x00, 0xb6, 0x00, 0xb8, 0x00, 0x9c, 0x00, 0x5e, 0x00, 0x1c, 0x00,
+0xe0, 0xff, 0xac, 0xff, 0x60, 0xff, 0x38, 0xff, 0x22, 0xff, 0x22, 0xff, 0x48, 0xff, 0x6e, 0xff,
+0xb6, 0xff, 0xf6, 0xff, 0x2e, 0x00, 0x70, 0x00, 0x9a, 0x00, 0xae, 0x00, 0xac, 0x00, 0x88, 0x00,
+0x58, 0x00, 0x1c, 0x00, 0xd8, 0xff, 0x9c, 0xff, 0x60, 0xff, 0x3e, 0xff, 0x2a, 0xff, 0x3a, 0xff,
+0x52, 0xff, 0x84, 0xff, 0xc4, 0xff, 0x0a, 0x00, 0x3a, 0x00, 0x74, 0x00, 0x9a, 0x00, 0xa6, 0x00,
+0xa4, 0x00, 0x76, 0x00, 0x48, 0x00, 0x0a, 0x00, 0xd0, 0xff, 0x8c, 0xff, 0x60, 0xff, 0x44, 0xff,
+0x34, 0xff, 0x4c, 0xff, 0x62, 0xff, 0x94, 0xff, 0xd8, 0xff, 0x0c, 0x00, 0x42, 0x00, 0x7c, 0x00,
+0x8c, 0x00, 0x94, 0x00, 0x82, 0x00, 0x5c, 0x00, 0x32, 0x00, 0xfa, 0xff, 0xc8, 0xff, 0x9a, 0xff,
+0x84, 0xff, 0x64, 0xff, 0x62, 0xff, 0x6a, 0xff, 0x8c, 0xff, 0xbe, 0xff, 0xec, 0xff, 0x12, 0x00,
+0x42, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x72, 0x00, 0x70, 0x00, 0x4a, 0x00, 0x24, 0x00, 0xfa, 0xff,
+0xd8, 0xff, 0xba, 0xff, 0xae, 0xff, 0xa2, 0xff, 0x94, 0xff, 0xa4, 0xff, 0xb0, 0xff, 0xd6, 0xff,
+0xf2, 0xff, 0x0c, 0x00, 0x28, 0x00, 0x34, 0x00, 0x42, 0x00, 0x40, 0x00, 0x38, 0x00, 0x1e, 0x00,
+0x0e, 0x00, 0xee, 0xff, 0xe2, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc4, 0xff, 0xb6, 0xff, 0xbc, 0xff,
+0xc4, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x0c, 0x00, 0x04, 0x00, 0x10, 0x00, 0x1a, 0x00,
+0x16, 0x00, 0x08, 0x00, 0x04, 0x00, 0xfa, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe8, 0xff,
+0xda, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xe2, 0xff, 0xe8, 0xff,
+0xe2, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x14, 0x00,
+0x06, 0x00, 0xfc, 0xff, 0xe8, 0xff, 0xdc, 0xff, 0xde, 0xff, 0xca, 0xff, 0xb8, 0xff, 0xae, 0xff,
+0xb4, 0xff, 0xba, 0xff, 0xba, 0xff, 0xc8, 0xff, 0xe0, 0xff, 0xfa, 0xff, 0x0a, 0x00, 0x1e, 0x00,
+0x30, 0x00, 0x30, 0x00, 0x24, 0x00, 0x28, 0x00, 0x0e, 0x00, 0xf0, 0xff, 0xe0, 0xff, 0xc0, 0xff,
+0xae, 0xff, 0x96, 0xff, 0x98, 0xff, 0xa2, 0xff, 0xa6, 0xff, 0xc2, 0xff, 0xe4, 0xff, 0x00, 0x00,
+0x1e, 0x00, 0x42, 0x00, 0x50, 0x00, 0x5e, 0x00, 0x3c, 0x00, 0x34, 0x00, 0x26, 0x00, 0xf6, 0xff,
+0xe4, 0xff, 0xae, 0xff, 0x8e, 0xff, 0x74, 0xff, 0x70, 0xff, 0x76, 0xff, 0x88, 0xff, 0xaa, 0xff,
+0xd2, 0xff, 0x04, 0x00, 0x34, 0x00, 0x62, 0x00, 0x72, 0x00, 0x70, 0x00, 0x6a, 0x00, 0x58, 0x00,
+0x38, 0x00, 0xfe, 0xff, 0xd2, 0xff, 0x9c, 0xff, 0x6a, 0xff, 0x5a, 0xff, 0x50, 0xff, 0x5c, 0xff,
+0x7c, 0xff, 0xb2, 0xff, 0xe0, 0xff, 0x1a, 0x00, 0x5e, 0x00, 0x8a, 0x00, 0xa2, 0x00, 0x9c, 0x00,
+0x90, 0x00, 0x6a, 0x00, 0x3e, 0x00, 0xfe, 0xff, 0xca, 0xff, 0x8e, 0xff, 0x5c, 0xff, 0x46, 0xff,
+0x3c, 0xff, 0x52, 0xff, 0x7e, 0xff, 0xba, 0xff, 0xfa, 0xff, 0x32, 0x00, 0x64, 0x00, 0x9e, 0x00,
+0xaa, 0x00, 0xac, 0x00, 0x8c, 0x00, 0x5a, 0x00, 0x1c, 0x00, 0xe6, 0xff, 0xb8, 0xff, 0x76, 0xff,
+0x48, 0xff, 0x22, 0xff, 0x38, 0xff, 0x58, 0xff, 0x8a, 0xff, 0xcc, 0xff, 0xfa, 0xff, 0x40, 0x00,
+0x7e, 0x00, 0x9e, 0x00, 0xae, 0x00, 0xa8, 0x00, 0x8c, 0x00, 0x52, 0x00, 0x0c, 0x00, 0xd8, 0xff,
+0xa6, 0xff, 0x6c, 0xff, 0x34, 0xff, 0x2a, 0xff, 0x3c, 0xff, 0x60, 0xff, 0x9a, 0xff, 0xe2, 0xff,
+0x0e, 0x00, 0x4c, 0x00, 0x80, 0x00, 0x9c, 0x00, 0xae, 0x00, 0xa2, 0x00, 0x82, 0x00, 0x42, 0x00,
+0x00, 0x00, 0xc0, 0xff, 0x92, 0xff, 0x5c, 0xff, 0x2c, 0xff, 0x2c, 0xff, 0x3e, 0xff, 0x62, 0xff,
+0xa2, 0xff, 0xe0, 0xff, 0x12, 0x00, 0x44, 0x00, 0x78, 0x00, 0x8c, 0x00, 0x96, 0x00, 0x82, 0x00,
+0x64, 0x00, 0x2e, 0x00, 0xea, 0xff, 0xae, 0xff, 0x7e, 0xff, 0x5a, 0xff, 0x38, 0xff, 0x3a, 0xff,
+0x56, 0xff, 0x7e, 0xff, 0xb6, 0xff, 0xf4, 0xff, 0x28, 0x00, 0x58, 0x00, 0x7c, 0x00, 0x86, 0x00,
+0x84, 0x00, 0x70, 0x00, 0x4a, 0x00, 0x14, 0x00, 0xee, 0xff, 0xae, 0xff, 0x7e, 0xff, 0x62, 0xff,
+0x56, 0xff, 0x5a, 0xff, 0x7e, 0xff, 0x9a, 0xff, 0xc6, 0xff, 0x00, 0x00, 0x2e, 0x00, 0x50, 0x00,
+0x5e, 0x00, 0x70, 0x00, 0x66, 0x00, 0x52, 0x00, 0x32, 0x00, 0x04, 0x00, 0xe2, 0xff, 0xaa, 0xff,
+0x8c, 0xff, 0x7e, 0xff, 0x76, 0xff, 0x80, 0xff, 0x90, 0xff, 0xb8, 0xff, 0xe2, 0xff, 0x00, 0x00,
+0x14, 0x00, 0x38, 0x00, 0x50, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x42, 0x00, 0x22, 0x00, 0x06, 0x00,
+0xea, 0xff, 0xce, 0xff, 0xba, 0xff, 0xb6, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xc0, 0xff, 0xda, 0xff,
+0xf0, 0xff, 0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x22, 0x00,
+0x12, 0x00, 0xfc, 0xff, 0xf8, 0xff, 0xe4, 0xff, 0xd2, 0xff, 0xdc, 0xff, 0xc8, 0xff, 0xd6, 0xff,
+0xd6, 0xff, 0xde, 0xff, 0xe2, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00,
+0x10, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xf8, 0xff,
+0xfa, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xee, 0xff, 0xea, 0xff, 0xda, 0xff, 0xda, 0xff, 0xde, 0xff,
+0xde, 0xff, 0xe4, 0xff, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x1e, 0x00,
+0x26, 0x00, 0x1a, 0x00, 0x14, 0x00, 0x08, 0x00, 0xf8, 0xff, 0xe0, 0xff, 0xcc, 0xff, 0xb4, 0xff,
+0xaa, 0xff, 0xb0, 0xff, 0xbc, 0xff, 0xbe, 0xff, 0xd4, 0xff, 0xe4, 0xff, 0xf8, 0xff, 0x18, 0x00,
+0x30, 0x00, 0x40, 0x00, 0x3c, 0x00, 0x36, 0x00, 0x24, 0x00, 0x0a, 0x00, 0xf0, 0xff, 0xd6, 0xff,
+0xb2, 0xff, 0x94, 0xff, 0x84, 0xff, 0x8c, 0xff, 0xa2, 0xff, 0xa6, 0xff, 0xc4, 0xff, 0xf0, 0xff,
+0x06, 0x00, 0x34, 0x00, 0x54, 0x00, 0x54, 0x00, 0x66, 0x00, 0x52, 0x00, 0x3a, 0x00, 0x1a, 0x00,
+0xe6, 0xff, 0xc8, 0xff, 0xa6, 0xff, 0x82, 0xff, 0x68, 0xff, 0x68, 0xff, 0x7c, 0xff, 0x9c, 0xff,
+0xc0, 0xff, 0xf0, 0xff, 0x20, 0x00, 0x4a, 0x00, 0x66, 0x00, 0x80, 0x00, 0x7c, 0x00, 0x6e, 0x00,
+0x46, 0x00, 0x10, 0x00, 0xe0, 0xff, 0xa8, 0xff, 0x7e, 0xff, 0x5a, 0xff, 0x42, 0xff, 0x3c, 0xff,
+0x62, 0xff, 0x90, 0xff, 0xc8, 0xff, 0x00, 0x00, 0x32, 0x00, 0x66, 0x00, 0x8c, 0x00, 0xa2, 0x00,
+0xa2, 0x00, 0x8c, 0x00, 0x44, 0x00, 0x12, 0x00, 0xd6, 0xff, 0xa8, 0xff, 0x70, 0xff, 0x48, 0xff,
+0x40, 0xff, 0x3a, 0xff, 0x6a, 0xff, 0x98, 0xff, 0xda, 0xff, 0x0c, 0x00, 0x46, 0x00, 0x82, 0x00,
+0xac, 0x00, 0xba, 0x00, 0xb0, 0x00, 0x8e, 0x00, 0x40, 0x00, 0x08, 0x00, 0xd2, 0xff, 0x8e, 0xff,
+0x64, 0xff, 0x34, 0xff, 0x22, 0xff, 0x36, 0xff, 0x5c, 0xff, 0xa4, 0xff, 0xdc, 0xff, 0x1c, 0x00,
+0x5a, 0x00, 0x8c, 0x00, 0xb8, 0x00, 0xc8, 0x00, 0xb0, 0x00, 0x78, 0x00, 0x44, 0x00, 0xf6, 0xff,
+0xcc, 0xff, 0x82, 0xff, 0x46, 0xff, 0x32, 0xff, 0x28, 0xff, 0x3c, 0xff, 0x6c, 0xff, 0xb6, 0xff,
+0xec, 0xff, 0x2a, 0x00, 0x6c, 0x00, 0x9c, 0x00, 0xbe, 0x00, 0xb8, 0x00, 0xa0, 0x00, 0x74, 0x00,
+0x2a, 0x00, 0xf2, 0xff, 0xbc, 0xff, 0x7c, 0xff, 0x4a, 0xff, 0x2e, 0xff, 0x42, 0xff, 0x50, 0xff,
+0x78, 0xff, 0xbe, 0xff, 0xf8, 0xff, 0x2a, 0x00, 0x68, 0x00, 0x96, 0x00, 0x9e, 0x00, 0xa0, 0x00,
+0x78, 0x00, 0x4e, 0x00, 0x10, 0x00, 0xd8, 0xff, 0xa4, 0xff, 0x6c, 0xff, 0x48, 0xff, 0x3c, 0xff,
+0x4a, 0xff, 0x6c, 0xff, 0x92, 0xff, 0xbe, 0xff, 0x0a, 0x00, 0x44, 0x00, 0x6a, 0x00, 0x80, 0x00,
+0x88, 0x00, 0x80, 0x00, 0x60, 0x00, 0x36, 0x00, 0x02, 0x00, 0xd0, 0xff, 0x9c, 0xff, 0x84, 0xff,
+0x6c, 0xff, 0x60, 0xff, 0x76, 0xff, 0x8e, 0xff, 0xb8, 0xff, 0xea, 0xff, 0x0e, 0x00, 0x42, 0x00,
+0x5a, 0x00, 0x68, 0x00, 0x5a, 0x00, 0x58, 0x00, 0x3c, 0x00, 0x14, 0x00, 0xf2, 0xff, 0xc6, 0xff,
+0xac, 0xff, 0x98, 0xff, 0x94, 0xff, 0x94, 0xff, 0x9e, 0xff, 0xac, 0xff, 0xd0, 0xff, 0xee, 0xff,
+0x02, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x2c, 0x00, 0x2e, 0x00, 0x2c, 0x00, 0x1a, 0x00, 0x04, 0x00,
+0xf2, 0xff, 0xd8, 0xff, 0xc6, 0xff, 0xbe, 0xff, 0xc0, 0xff, 0xbc, 0xff, 0xc0, 0xff, 0xca, 0xff,
+0xe2, 0xff, 0xfa, 0xff, 0x0a, 0x00, 0x10, 0x00, 0x14, 0x00, 0x12, 0x00, 0x18, 0x00, 0x10, 0x00,
+0x12, 0x00, 0x06, 0x00, 0xfa, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe6, 0xff,
+0xe6, 0xff, 0xe4, 0xff, 0xe6, 0xff, 0xea, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xe8, 0xff,
+0xea, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0x04, 0x00, 0x06, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00,
+0x06, 0x00, 0xfc, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xdc, 0xff, 0xcc, 0xff, 0xc4, 0xff, 0xba, 0xff,
+0xbc, 0xff, 0xbe, 0xff, 0xde, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0x0a, 0x00, 0x24, 0x00, 0x36, 0x00,
+0x40, 0x00, 0x34, 0x00, 0x26, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xf4, 0xff, 0xda, 0xff, 0xae, 0xff,
+0x9e, 0xff, 0xa0, 0xff, 0xa2, 0xff, 0xac, 0xff, 0xb4, 0xff, 0xdc, 0xff, 0xfc, 0xff, 0x12, 0x00,
+0x3a, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x4a, 0x00, 0x3e, 0x00, 0x28, 0x00, 0x08, 0x00, 0xec, 0xff,
+0xba, 0xff, 0x92, 0xff, 0x82, 0xff, 0x72, 0xff, 0x6a, 0xff, 0x84, 0xff, 0xa0, 0xff, 0xcc, 0xff,
+0xfc, 0xff, 0x1c, 0x00, 0x48, 0x00, 0x5e, 0x00, 0x7c, 0x00, 0x6e, 0x00, 0x54, 0x00, 0x36, 0x00,
+0x0a, 0x00, 0xec, 0xff, 0xb2, 0xff, 0x82, 0xff, 0x66, 0xff, 0x5a, 0xff, 0x56, 0xff, 0x7e, 0xff,
+0xa2, 0xff, 0xd4, 0xff, 0x18, 0x00, 0x3c, 0x00, 0x6a, 0x00, 0x7e, 0x00, 0x8e, 0x00, 0x8a, 0x00,
+0x74, 0x00, 0x42, 0x00, 0x0c, 0x00, 0xd4, 0xff, 0x96, 0xff, 0x5e, 0xff, 0x42, 0xff, 0x3e, 0xff,
+0x4c, 0xff, 0x7a, 0xff, 0xac, 0xff, 0xe4, 0xff, 0x16, 0x00, 0x50, 0x00, 0x84, 0x00, 0x9a, 0x00,
+0xa6, 0x00, 0x9e, 0x00, 0x62, 0x00, 0x2e, 0x00, 0xfc, 0xff, 0xb8, 0xff, 0x88, 0xff, 0x4a, 0xff,
+0x2c, 0xff, 0x38, 0xff, 0x54, 0xff, 0x82, 0xff, 0xc2, 0xff, 0xf6, 0xff, 0x32, 0x00, 0x7c, 0x00,
+0xa2, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x9c, 0x00, 0x6a, 0x00, 0x20, 0x00, 0xf0, 0xff, 0xb4, 0xff,
+0x74, 0xff, 0x44, 0xff, 0x30, 0xff, 0x44, 0xff, 0x56, 0xff, 0x92, 0xff, 0xda, 0xff, 0x0a, 0x00,
+0x40, 0x00, 0x84, 0x00, 0xa4, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0x8e, 0x00, 0x48, 0x00, 0x0c, 0x00,
+0xd8, 0xff, 0x98, 0xff, 0x62, 0xff, 0x3a, 0xff, 0x2c, 0xff, 0x42, 0xff, 0x62, 0xff, 0xa0, 0xff,
+0xea, 0xff, 0x16, 0x00, 0x4c, 0x00, 0x84, 0x00, 0xa0, 0x00, 0xb0, 0x00, 0xa2, 0x00, 0x7a, 0x00,
+0x3e, 0x00, 0x02, 0x00, 0xc6, 0xff, 0x8c, 0xff, 0x66, 0xff, 0x52, 0xff, 0x44, 0xff, 0x5c, 0xff,
+0x7c, 0xff, 0xb8, 0xff, 0xec, 0xff, 0x34, 0x00, 0x54, 0x00, 0x70, 0x00, 0x90, 0x00, 0x96, 0x00,
+0x82, 0x00, 0x56, 0x00, 0x28, 0x00, 0xea, 0xff, 0xbe, 0xff, 0x88, 0xff, 0x6c, 0xff, 0x68, 0xff,
+0x54, 0xff, 0x7a, 0xff, 0x9a, 0xff, 0xae, 0xff, 0xf0, 0xff, 0x14, 0x00, 0x36, 0x00, 0x5c, 0x00,
+0x6a, 0x00, 0x6a, 0x00, 0x56, 0x00, 0x3a, 0x00, 0x04, 0x00, 0xe6, 0xff, 0xc2, 0xff, 0x9e, 0xff,
+0x94, 0xff, 0x88, 0xff, 0x80, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xce, 0xff, 0xf8, 0xff, 0x16, 0x00,
+0x2c, 0x00, 0x3a, 0x00, 0x54, 0x00, 0x46, 0x00, 0x40, 0x00, 0x26, 0x00, 0x04, 0x00, 0xf2, 0xff,
+0xd4, 0xff, 0xba, 0xff, 0xbc, 0xff, 0xb0, 0xff, 0xa0, 0xff, 0xb2, 0xff, 0xce, 0xff, 0xd6, 0xff,
+0xf8, 0xff, 0x0c, 0x00, 0x14, 0x00, 0x24, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x1a, 0x00, 0x08, 0x00,
+0x00, 0x00, 0xe8, 0xff, 0xe2, 0xff, 0xd8, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xc8, 0xff, 0xc8, 0xff,
+0xd0, 0xff, 0xe6, 0xff, 0xee, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0x02, 0x00, 0x06, 0x00,
+0x16, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0xf4, 0xff,
+0xf8, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xd6, 0xff, 0xda, 0xff, 0xe2, 0xff, 0xe8, 0xff,
+0xe2, 0xff, 0xe2, 0xff, 0xee, 0xff, 0xfa, 0xff, 0x00, 0x00, 0x10, 0x00, 0x22, 0x00, 0x26, 0x00,
+0x14, 0x00, 0x18, 0x00, 0x0a, 0x00, 0xf4, 0xff, 0xf0, 0xff, 0xd0, 0xff, 0xc4, 0xff, 0xb8, 0xff,
+0xb6, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xc4, 0xff, 0xde, 0xff, 0xfc, 0xff, 0x14, 0x00, 0x34, 0x00,
+0x40, 0x00, 0x52, 0x00, 0x42, 0x00, 0x34, 0x00, 0x1e, 0x00, 0x04, 0x00, 0xda, 0xff, 0xbc, 0xff,
+0xa0, 0xff, 0x94, 0xff, 0x90, 0xff, 0x8c, 0xff, 0xa2, 0xff, 0xb4, 0xff, 0xea, 0xff, 0x0e, 0x00,
+0x3a, 0x00, 0x5c, 0x00, 0x68, 0x00, 0x78, 0x00, 0x60, 0x00, 0x40, 0x00, 0x1e, 0x00, 0xf8, 0xff,
+0xd8, 0xff, 0x96, 0xff, 0x76, 0xff, 0x56, 0xff, 0x56, 0xff, 0x68, 0xff, 0x86, 0xff, 0xb0, 0xff,
+0xf0, 0xff, 0x18, 0x00, 0x4a, 0x00, 0x76, 0x00, 0x8a, 0x00, 0x88, 0x00, 0x76, 0x00, 0x4c, 0x00,
+0x1c, 0x00, 0xf0, 0xff, 0xaa, 0xff, 0x80, 0xff, 0x58, 0xff, 0x3a, 0xff, 0x42, 0xff, 0x5a, 0xff,
+0x84, 0xff, 0xbc, 0xff, 0xee, 0xff, 0x26, 0x00, 0x6a, 0x00, 0x98, 0x00, 0xa8, 0x00, 0x9c, 0x00,
+0x7a, 0x00, 0x4c, 0x00, 0x18, 0x00, 0xe6, 0xff, 0xaa, 0xff, 0x70, 0xff, 0x42, 0xff, 0x24, 0xff,
+0x30, 0xff, 0x52, 0xff, 0x7e, 0xff, 0xd0, 0xff, 0xfc, 0xff, 0x36, 0x00, 0x80, 0x00, 0x9c, 0x00,
+0xb6, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x4a, 0x00, 0x00, 0x00, 0xd6, 0xff, 0x9c, 0xff, 0x58, 0xff,
+0x32, 0xff, 0x22, 0xff, 0x2a, 0xff, 0x4e, 0xff, 0x90, 0xff, 0xd8, 0xff, 0x18, 0x00, 0x54, 0x00,
+0x82, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0xa2, 0x00, 0x8a, 0x00, 0x44, 0x00, 0x00, 0x00, 0xda, 0xff,
+0x92, 0xff, 0x58, 0xff, 0x2c, 0xff, 0x28, 0xff, 0x3a, 0xff, 0x6c, 0xff, 0xae, 0xff, 0xe8, 0xff,
+0x1a, 0x00, 0x64, 0x00, 0x8e, 0x00, 0xaa, 0x00, 0xae, 0x00, 0x98, 0x00, 0x6a, 0x00, 0x3a, 0x00,
+0x02, 0x00, 0xc2, 0xff, 0x86, 0xff, 0x4c, 0xff, 0x40, 0xff, 0x3c, 0xff, 0x4e, 0xff, 0x88, 0xff,
+0xbc, 0xff, 0xf0, 0xff, 0x26, 0x00, 0x60, 0x00, 0x88, 0x00, 0x94, 0x00, 0x9a, 0x00, 0x82, 0x00,
+0x56, 0x00, 0x1c, 0x00, 0xee, 0xff, 0xba, 0xff, 0x88, 0xff, 0x64, 0xff, 0x52, 0xff, 0x52, 0xff,
+0x76, 0xff, 0x98, 0xff, 0xda, 0xff, 0x02, 0x00, 0x2a, 0x00, 0x62, 0x00, 0x70, 0x00, 0x80, 0x00,
+0x78, 0x00, 0x64, 0x00, 0x46, 0x00, 0x0e, 0x00, 0xec, 0xff, 0xb8, 0xff, 0x8e, 0xff, 0x72, 0xff,
+0x72, 0xff, 0x7c, 0xff, 0x86, 0xff, 0xae, 0xff, 0xe4, 0xff, 0x0c, 0x00, 0x24, 0x00, 0x4a, 0x00,
+0x58, 0x00, 0x5e, 0x00, 0x56, 0x00, 0x46, 0x00, 0x28, 0x00, 0x04, 0x00, 0xd8, 0xff, 0xb2, 0xff,
+0xa0, 0xff, 0x8e, 0xff, 0x8c, 0xff, 0x90, 0xff, 0xb0, 0xff, 0xc4, 0xff, 0xe2, 0xff, 0x08, 0x00,
+0x16, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x3c, 0x00, 0x34, 0x00, 0x28, 0x00, 0x12, 0x00, 0xf8, 0xff,
+0xe2, 0xff, 0xc6, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xc2, 0xff, 0xce, 0xff, 0xde, 0xff,
+0xec, 0xff, 0xf6, 0xff, 0x0c, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x0a, 0x00, 0x10, 0x00,
+0x00, 0x00, 0xf6, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xf2, 0xff, 0xf4, 0xff,
+0xec, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xe6, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xee, 0xff, 0xe2, 0xff,
+0xf2, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0x0a, 0x00, 0x08, 0x00, 0x18, 0x00, 0x12, 0x00, 0x12, 0x00,
+0x18, 0x00, 0x08, 0x00, 0x02, 0x00, 0xf2, 0xff, 0xda, 0xff, 0xcc, 0xff, 0xbe, 0xff, 0xcc, 0xff,
+0xce, 0xff, 0xc4, 0xff, 0xde, 0xff, 0xee, 0xff, 0x06, 0x00, 0x10, 0x00, 0x32, 0x00, 0x3a, 0x00,
+0x3e, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x1e, 0x00, 0x06, 0x00, 0xec, 0xff, 0xc6, 0xff, 0xaa, 0xff,
+0xa0, 0xff, 0xa4, 0xff, 0xae, 0xff, 0xb4, 0xff, 0xcc, 0xff, 0xf8, 0xff, 0x08, 0x00, 0x30, 0x00,
+0x50, 0x00, 0x58, 0x00, 0x58, 0x00, 0x50, 0x00, 0x40, 0x00, 0x16, 0x00, 0xfa, 0xff, 0xce, 0xff,
+0x98, 0xff, 0x7a, 0xff, 0x80, 0xff, 0x7e, 0xff, 0x8c, 0xff, 0xa8, 0xff, 0xcc, 0xff, 0xfc, 0xff,
+0x24, 0x00, 0x54, 0x00, 0x76, 0x00, 0x82, 0x00, 0x7e, 0x00, 0x64, 0x00, 0x42, 0x00, 0x18, 0x00,
+0xda, 0xff, 0xb0, 0xff, 0x84, 0xff, 0x66, 0xff, 0x4c, 0xff, 0x58, 0xff, 0x7c, 0xff, 0xa0, 0xff,
+0xd4, 0xff, 0xfc, 0xff, 0x42, 0x00, 0x70, 0x00, 0x88, 0x00, 0xa2, 0x00, 0x92, 0x00, 0x70, 0x00,
+0x38, 0x00, 0xfe, 0xff, 0xc0, 0xff, 0x86, 0xff, 0x5a, 0xff, 0x3c, 0xff, 0x30, 0xff, 0x3c, 0xff,
+0x5a, 0xff, 0x9c, 0xff, 0xda, 0xff, 0x10, 0x00, 0x52, 0x00, 0x82, 0x00, 0xa2, 0x00, 0xaa, 0x00,
+0xa0, 0x00, 0x74, 0x00, 0x2a, 0x00, 0xee, 0xff, 0xbe, 0xff, 0x7e, 0xff, 0x4a, 0xff, 0x2a, 0xff,
+0x22, 0xff, 0x3c, 0xff, 0x68, 0xff, 0xb2, 0xff, 0xec, 0xff, 0x16, 0x00, 0x60, 0x00, 0x92, 0x00,
+0xb8, 0x00, 0xb0, 0x00, 0x90, 0x00, 0x6e, 0x00, 0x24, 0x00, 0xee, 0xff, 0xa8, 0xff, 0x76, 0xff,
+0x48, 0xff, 0x28, 0xff, 0x2a, 0xff, 0x3c, 0xff, 0x74, 0xff, 0xb2, 0xff, 0xf6, 0xff, 0x2a, 0x00,
+0x66, 0x00, 0x8e, 0x00, 0xae, 0x00, 0xb4, 0x00, 0x8e, 0x00, 0x5a, 0x00, 0x18, 0x00, 0xdc, 0xff,
+0xae, 0xff, 0x6e, 0xff, 0x40, 0xff, 0x3c, 0xff, 0x3a, 0xff, 0x5c, 0xff, 0x8a, 0xff, 0xc8, 0xff,
+0x04, 0x00, 0x40, 0x00, 0x7a, 0x00, 0x92, 0x00, 0xac, 0x00, 0x9e, 0x00, 0x7c, 0x00, 0x4a, 0x00,
+0x0e, 0x00, 0xda, 0xff, 0xa8, 0xff, 0x76, 0xff, 0x5c, 0xff, 0x52, 0xff, 0x56, 0xff, 0x6e, 0xff,
+0xa0, 0xff, 0xe6, 0xff, 0x20, 0x00, 0x42, 0x00, 0x74, 0x00, 0x92, 0x00, 0x92, 0x00, 0x84, 0x00,
+0x5c, 0x00, 0x34, 0x00, 0xfa, 0xff, 0xce, 0xff, 0xa4, 0xff, 0x82, 0xff, 0x66, 0xff, 0x64, 0xff,
+0x72, 0xff, 0x8c, 0xff, 0xbe, 0xff, 0xf4, 0xff, 0x22, 0x00, 0x44, 0x00, 0x5a, 0x00, 0x6e, 0x00,
+0x68, 0x00, 0x5c, 0x00, 0x46, 0x00, 0x1a, 0x00, 0xfa, 0xff, 0xc6, 0xff, 0xa8, 0xff, 0x9a, 0xff,
+0x88, 0xff, 0x8a, 0xff, 0x8c, 0xff, 0xac, 0xff, 0xce, 0xff, 0xfa, 0xff, 0x14, 0x00, 0x3a, 0x00,
+0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3a, 0x00, 0x2a, 0x00, 0x04, 0x00, 0xec, 0xff, 0xd0, 0xff,
+0xb6, 0xff, 0xac, 0xff, 0xa4, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xbc, 0xff, 0xda, 0xff, 0xe8, 0xff,
+0xfe, 0xff, 0x18, 0x00, 0x1e, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x12, 0x00, 0xfe, 0xff,
+0xea, 0xff, 0xe0, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xc6, 0xff, 0xc2, 0xff, 0xc4, 0xff, 0xce, 0xff,
+0xce, 0xff, 0xe8, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x02, 0x00,
+0x04, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x02, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xea, 0xff,
+0xea, 0xff, 0xde, 0xff, 0xd8, 0xff, 0xd0, 0xff, 0xcc, 0xff, 0xc8, 0xff, 0xcc, 0xff, 0xd0, 0xff,
+0xd4, 0xff, 0xf8, 0xff, 0x02, 0x00, 0x0a, 0x00, 0x1a, 0x00, 0x32, 0x00, 0x22, 0x00, 0x18, 0x00,
+0x1c, 0x00, 0x0a, 0x00, 0x02, 0x00, 0xee, 0xff, 0xd0, 0xff, 0xb8, 0xff, 0xa8, 0xff, 0x9e, 0xff,
+0xb4, 0xff, 0xb0, 0xff, 0xc6, 0xff, 0xe0, 0xff, 0xfa, 0xff, 0x1e, 0x00, 0x3c, 0x00, 0x50, 0x00,
+0x4a, 0x00, 0x46, 0x00, 0x3e, 0x00, 0x28, 0x00, 0x08, 0x00, 0xe6, 0xff, 0xbc, 0xff, 0xa4, 0xff,
+0x84, 0xff, 0x84, 0xff, 0x8c, 0xff, 0xaa, 0xff, 0xc4, 0xff, 0xea, 0xff, 0x0e, 0x00, 0x40, 0x00,
+0x64, 0x00, 0x64, 0x00, 0x74, 0x00, 0x66, 0x00, 0x5e, 0x00, 0x3e, 0x00, 0x06, 0x00, 0xde, 0xff,
+0xaa, 0xff, 0x7a, 0xff, 0x66, 0xff, 0x64, 0xff, 0x6a, 0xff, 0x86, 0xff, 0xb6, 0xff, 0xe6, 0xff,
+0x0e, 0x00, 0x52, 0x00, 0x72, 0x00, 0x94, 0x00, 0xa0, 0x00, 0x8a, 0x00, 0x60, 0x00, 0x34, 0x00,
+0x02, 0x00, 0xc6, 0xff, 0x98, 0xff, 0x5c, 0xff, 0x48, 0xff, 0x3c, 0xff, 0x5e, 0xff, 0x82, 0xff,
+0xba, 0xff, 0xfc, 0xff, 0x20, 0x00, 0x60, 0x00, 0x92, 0x00, 0xae, 0x00, 0xa6, 0x00, 0x92, 0x00,
+0x6a, 0x00, 0x2a, 0x00, 0xf4, 0xff, 0xba, 0xff, 0x7e, 0xff, 0x40, 0xff, 0x2e, 0xff, 0x2c, 0xff,
+0x4c, 0xff, 0x82, 0xff, 0xc0, 0xff, 0xf6, 0xff, 0x2c, 0x00, 0x72, 0x00, 0x9a, 0x00, 0xb6, 0x00,
+0xb0, 0x00, 0x8c, 0x00, 0x4c, 0x00, 0x08, 0x00, 0xd6, 0xff, 0x96, 0xff, 0x56, 0xff, 0x28, 0xff,
+0x1c, 0xff, 0x30, 0xff, 0x56, 0xff, 0x88, 0xff, 0xda, 0xff, 0x0a, 0x00, 0x40, 0x00, 0x86, 0x00,
+0xa8, 0x00, 0xb0, 0x00, 0xa2, 0x00, 0x7e, 0x00, 0x40, 0x00, 0xfa, 0xff, 0xc8, 0xff, 0x92, 0xff,
+0x4a, 0xff, 0x26, 0xff, 0x26, 0xff, 0x3c, 0xff, 0x64, 0xff, 0xa8, 0xff, 0xec, 0xff, 0x1a, 0x00,
+0x56, 0x00, 0x82, 0x00, 0xa6, 0x00, 0xb4, 0x00, 0x9c, 0x00, 0x72, 0x00, 0x20, 0x00, 0xe6, 0xff,
+0xae, 0xff, 0x7c, 0xff, 0x46, 0xff, 0x30, 0xff, 0x2e, 0xff, 0x50, 0xff, 0x7c, 0xff, 0xac, 0xff,
+0xfa, 0xff, 0x28, 0x00, 0x56, 0x00, 0x84, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x84, 0x00, 0x5a, 0x00,
+0x1e, 0x00, 0xec, 0xff, 0xb6, 0xff, 0x86, 0xff, 0x5e, 0xff, 0x54, 0xff, 0x58, 0xff, 0x7a, 0xff,
+0x96, 0xff, 0xd0, 0xff, 0x02, 0x00, 0x32, 0x00, 0x66, 0x00, 0x74, 0x00, 0x96, 0x00, 0x84, 0x00,
+0x72, 0x00, 0x46, 0x00, 0x0e, 0x00, 0xe8, 0xff, 0xb8, 0xff, 0x9e, 0xff, 0x88, 0xff, 0x86, 0xff,
+0x80, 0xff, 0x9a, 0xff, 0xb6, 0xff, 0xde, 0xff, 0x08, 0x00, 0x2e, 0x00, 0x42, 0x00, 0x42, 0x00,
+0x52, 0x00, 0x4c, 0x00, 0x48, 0x00, 0x20, 0x00, 0xfc, 0xff, 0xe6, 0xff, 0xcc, 0xff, 0xb4, 0xff,
+0xaa, 0xff, 0xac, 0xff, 0xae, 0xff, 0xb8, 0xff, 0xd2, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0x14, 0x00,
+0x30, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x22, 0x00, 0x06, 0x00, 0xf4, 0xff, 0xec, 0xff,
+0xdc, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xc8, 0xff, 0xd0, 0xff, 0xd8, 0xff, 0xde, 0xff, 0xfa, 0xff,
+0xfc, 0xff, 0xf6, 0xff, 0x0a, 0x00, 0x04, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf6, 0xff,
+0xf4, 0xff, 0xea, 0xff, 0xdc, 0xff, 0xe6, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xd8, 0xff, 0xd8, 0xff,
+0xe0, 0xff, 0xdc, 0xff, 0xd6, 0xff, 0xe2, 0xff, 0xe6, 0xff, 0xe2, 0xff, 0xe0, 0xff, 0xe4, 0xff,
+0xe6, 0xff, 0xea, 0xff, 0xf8, 0xff, 0x08, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00,
+0xfc, 0xff, 0xf2, 0xff, 0xe0, 0xff, 0xd2, 0xff, 0xc4, 0xff, 0xb8, 0xff, 0xbe, 0xff, 0xc8, 0xff,
+0xc2, 0xff, 0xda, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0x10, 0x00, 0x28, 0x00, 0x30, 0x00, 0x30, 0x00,
+0x2a, 0x00, 0x10, 0x00, 0x08, 0x00, 0xe6, 0xff, 0xca, 0xff, 0xb2, 0xff, 0x9e, 0xff, 0x94, 0xff,
+0x98, 0xff, 0xa2, 0xff, 0xa0, 0xff, 0xbc, 0xff, 0xe4, 0xff, 0x06, 0x00, 0x34, 0x00, 0x4c, 0x00,
+0x56, 0x00, 0x56, 0x00, 0x3e, 0x00, 0x34, 0x00, 0x10, 0x00, 0xea, 0xff, 0xc8, 0xff, 0x92, 0xff,
+0x7a, 0xff, 0x6c, 0xff, 0x70, 0xff, 0x8c, 0xff, 0xa0, 0xff, 0xca, 0xff, 0x04, 0x00, 0x2c, 0x00,
+0x52, 0x00, 0x7c, 0x00, 0x84, 0x00, 0x86, 0x00, 0x68, 0x00, 0x4c, 0x00, 0x1e, 0x00, 0xe6, 0xff,
+0xb4, 0xff, 0x90, 0xff, 0x78, 0xff, 0x5c, 0xff, 0x58, 0xff, 0x6a, 0xff, 0x9c, 0xff, 0xca, 0xff,
+0x02, 0x00, 0x3a, 0x00, 0x70, 0x00, 0x94, 0x00, 0x9e, 0x00, 0x94, 0x00, 0x78, 0x00, 0x48, 0x00,
+0x10, 0x00, 0xdc, 0xff, 0x9e, 0xff, 0x72, 0xff, 0x4c, 0xff, 0x32, 0xff, 0x44, 0xff, 0x6a, 0xff,
+0x9e, 0xff, 0xde, 0xff, 0x14, 0x00, 0x4c, 0x00, 0x8c, 0x00, 0xa6, 0x00, 0xbc, 0x00, 0xac, 0x00,
+0x7c, 0x00, 0x4a, 0x00, 0x04, 0x00, 0xdc, 0xff, 0xa6, 0xff, 0x6c, 0xff, 0x4c, 0xff, 0x36, 0xff,
+0x46, 0xff, 0x6c, 0xff, 0xac, 0xff, 0xf0, 0xff, 0x22, 0x00, 0x66, 0x00, 0x96, 0x00, 0xb6, 0x00,
+0xbc, 0x00, 0xa4, 0x00, 0x74, 0x00, 0x36, 0x00, 0xfa, 0xff, 0xc8, 0xff, 0x84, 0xff, 0x4e, 0xff,
+0x2a, 0xff, 0x12, 0xff, 0x42, 0xff, 0x66, 0xff, 0xa2, 0xff, 0xf2, 0xff, 0x1e, 0x00, 0x60, 0x00,
+0x92, 0x00, 0xa4, 0x00, 0xb4, 0x00, 0x8a, 0x00, 0x52, 0x00, 0x20, 0x00, 0xe6, 0xff, 0xb0, 0xff,
+0x74, 0xff, 0x4c, 0xff, 0x2c, 0xff, 0x30, 0xff, 0x4c, 0xff, 0x7e, 0xff, 0xc4, 0xff, 0x04, 0x00,
+0x2e, 0x00, 0x64, 0x00, 0x94, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x82, 0x00, 0x5a, 0x00, 0x16, 0x00,
+0xe0, 0xff, 0xb0, 0xff, 0x7a, 0xff, 0x4a, 0xff, 0x3a, 0xff, 0x46, 0xff, 0x5e, 0xff, 0x90, 0xff,
+0xce, 0xff, 0x08, 0x00, 0x2a, 0x00, 0x60, 0x00, 0x74, 0x00, 0x8c, 0x00, 0x80, 0x00, 0x5c, 0x00,
+0x34, 0x00, 0x0a, 0x00, 0xde, 0xff, 0xa0, 0xff, 0x80, 0xff, 0x5e, 0xff, 0x56, 0xff, 0x52, 0xff,
+0x78, 0xff, 0xa0, 0xff, 0xd4, 0xff, 0xfa, 0xff, 0x34, 0x00, 0x58, 0x00, 0x68, 0x00, 0x72, 0x00,
+0x5e, 0x00, 0x5a, 0x00, 0x26, 0x00, 0x02, 0x00, 0xde, 0xff, 0xb0, 0xff, 0xa6, 0xff, 0x8a, 0xff,
+0x84, 0xff, 0x8e, 0xff, 0x9e, 0xff, 0xc6, 0xff, 0xf6, 0xff, 0x16, 0x00, 0x36, 0x00, 0x40, 0x00,
+0x42, 0x00, 0x4c, 0x00, 0x3c, 0x00, 0x34, 0x00, 0x20, 0x00, 0xfa, 0xff, 0xe2, 0xff, 0xba, 0xff,
+0xb4, 0xff, 0xa8, 0xff, 0x96, 0xff, 0xa6, 0xff, 0xc2, 0xff, 0xe0, 0xff, 0xf6, 0xff, 0x0a, 0x00,
+0x12, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x1e, 0x00, 0x16, 0x00, 0x0c, 0x00, 0xfe, 0xff, 0xf4, 0xff,
+0xe8, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xee, 0xff,
+0xf2, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x08, 0x00, 0x10, 0x00, 0x12, 0x00,
+0x0a, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xfc, 0xff, 0xf8, 0xff,
+0xf4, 0xff, 0xea, 0xff, 0xda, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc6, 0xff, 0xd0, 0xff, 0xd6, 0xff,
+0xe8, 0xff, 0xee, 0xff, 0xfa, 0xff, 0x0c, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x12, 0x00,
+0x0e, 0x00, 0xfa, 0xff, 0xf2, 0xff, 0xd4, 0xff, 0xc2, 0xff, 0xae, 0xff, 0xa0, 0xff, 0xae, 0xff,
+0xae, 0xff, 0xc4, 0xff, 0xd6, 0xff, 0xf0, 0xff, 0x04, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x36, 0x00,
+0x46, 0x00, 0x3a, 0x00, 0x36, 0x00, 0x0a, 0x00, 0xf6, 0xff, 0xd2, 0xff, 0xac, 0xff, 0x9a, 0xff,
+0x8a, 0xff, 0x90, 0xff, 0x96, 0xff, 0xac, 0xff, 0xce, 0xff, 0xec, 0xff, 0x1a, 0x00, 0x36, 0x00,
+0x48, 0x00, 0x56, 0x00, 0x5a, 0x00, 0x4a, 0x00, 0x2e, 0x00, 0x10, 0x00, 0xec, 0xff, 0xbc, 0xff,
+0x92, 0xff, 0x72, 0xff, 0x5e, 0xff, 0x62, 0xff, 0x7a, 0xff, 0x90, 0xff, 0xcc, 0xff, 0xfa, 0xff,
+0x2e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x8e, 0x00, 0x8a, 0x00, 0x66, 0x00, 0x40, 0x00, 0x0e, 0x00,
+0xda, 0xff, 0xa8, 0xff, 0x72, 0xff, 0x4a, 0xff, 0x52, 0xff, 0x56, 0xff, 0x72, 0xff, 0xa8, 0xff,
+0xe0, 0xff, 0x18, 0x00, 0x4e, 0x00, 0x8a, 0x00, 0xa8, 0x00, 0xba, 0x00, 0xa8, 0x00, 0x80, 0x00,
+0x42, 0x00, 0x08, 0x00, 0xd4, 0xff, 0x88, 0xff, 0x52, 0xff, 0x2a, 0xff, 0x2e, 0xff, 0x48, 0xff,
+0x6c, 0xff, 0xb6, 0xff, 0xee, 0xff, 0x24, 0x00, 0x5c, 0x00, 0x90, 0x00, 0xaa, 0x00, 0xb2, 0x00,
+0xa0, 0x00, 0x6a, 0x00, 0x2c, 0x00, 0xf6, 0xff, 0xc4, 0xff, 0x78, 0xff, 0x40, 0xff, 0x2c, 0xff,
+0x34, 0xff, 0x58, 0xff, 0x78, 0xff, 0xc6, 0xff, 0x00, 0x00, 0x2e, 0x00, 0x72, 0x00, 0x9e, 0x00,
+0xbc, 0x00, 0xb8, 0x00, 0x8a, 0x00, 0x58, 0x00, 0x16, 0x00, 0xe6, 0xff, 0xa4, 0xff, 0x62, 0xff,
+0x4a, 0xff, 0x30, 0xff, 0x48, 0xff, 0x6a, 0xff, 0xa0, 0xff, 0xde, 0xff, 0x0a, 0x00, 0x40, 0x00,
+0x7e, 0x00, 0x9c, 0x00, 0xa8, 0x00, 0x98, 0x00, 0x6e, 0x00, 0x3c, 0x00, 0x00, 0x00, 0xc4, 0xff,
+0x90, 0xff, 0x5c, 0xff, 0x44, 0xff, 0x3a, 0xff, 0x50, 0xff, 0x7a, 0xff, 0xa0, 0xff, 0xe6, 0xff,
+0x24, 0x00, 0x4a, 0x00, 0x7a, 0x00, 0x94, 0x00, 0x94, 0x00, 0x7c, 0x00, 0x56, 0x00, 0x22, 0x00,
+0xf6, 0xff, 0xb8, 0xff, 0x90, 0xff, 0x72, 0xff, 0x5c, 0xff, 0x5e, 0xff, 0x70, 0xff, 0x8a, 0xff,
+0xc2, 0xff, 0xf6, 0xff, 0x22, 0x00, 0x54, 0x00, 0x74, 0x00, 0x86, 0x00, 0x78, 0x00, 0x5e, 0x00,
+0x3a, 0x00, 0x10, 0x00, 0xe0, 0xff, 0xb6, 0xff, 0x8e, 0xff, 0x7a, 0xff, 0x74, 0xff, 0x7a, 0xff,
+0x94, 0xff, 0xa8, 0xff, 0xdc, 0xff, 0xfa, 0xff, 0x2c, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x60, 0x00,
+0x48, 0x00, 0x40, 0x00, 0x24, 0x00, 0x08, 0x00, 0xe6, 0xff, 0xbe, 0xff, 0xa6, 0xff, 0x9c, 0xff,
+0x98, 0xff, 0xa0, 0xff, 0xae, 0xff, 0xce, 0xff, 0xec, 0xff, 0x0c, 0x00, 0x1c, 0x00, 0x30, 0x00,
+0x32, 0x00, 0x30, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x0a, 0x00, 0xf8, 0xff, 0xf0, 0xff, 0xde, 0xff,
+0xcc, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc2, 0xff, 0xd2, 0xff, 0xe4, 0xff, 0xf2, 0xff, 0xfa, 0xff,
+0xf8, 0xff, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0a, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfc, 0xff,
+0xf4, 0xff, 0xf4, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xee, 0xff, 0xea, 0xff,
+0xf0, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xe0, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe0, 0xff, 0xf2, 0xff,
+0xf0, 0xff, 0x06, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x1a, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x08, 0x00,
+0x00, 0x00, 0xf2, 0xff, 0xe6, 0xff, 0xcc, 0xff, 0xc0, 0xff, 0xba, 0xff, 0xbe, 0xff, 0xbc, 0xff,
+0xd0, 0xff, 0xda, 0xff, 0xf2, 0xff, 0x10, 0x00, 0x22, 0x00, 0x38, 0x00, 0x44, 0x00, 0x30, 0x00,
+0x26, 0x00, 0x16, 0x00, 0xf8, 0xff, 0xe6, 0xff, 0xc2, 0xff, 0xa0, 0xff, 0x94, 0xff, 0x8c, 0xff,
+0x94, 0xff, 0xa2, 0xff, 0xb2, 0xff, 0xea, 0xff, 0xfc, 0xff, 0x2a, 0x00, 0x4a, 0x00, 0x50, 0x00,
+0x60, 0x00, 0x4e, 0x00, 0x40, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xea, 0xff, 0xb2, 0xff, 0x8c, 0xff,
+0x78, 0xff, 0x6c, 0xff, 0x7c, 0xff, 0x8a, 0xff, 0xc2, 0xff, 0xe2, 0xff, 0x0c, 0x00, 0x44, 0x00,
+0x64, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x6c, 0x00, 0x50, 0x00, 0x2c, 0x00, 0xfc, 0xff, 0xd0, 0xff,
+0x9c, 0xff, 0x7a, 0xff, 0x54, 0xff, 0x50, 0xff, 0x64, 0xff, 0x8c, 0xff, 0xbc, 0xff, 0xe6, 0xff,
+0x22, 0x00, 0x4e, 0x00, 0x7c, 0x00, 0x98, 0x00, 0x90, 0x00, 0x7c, 0x00, 0x58, 0x00, 0x26, 0x00,
+0xf4, 0xff, 0xb6, 0xff, 0x82, 0xff, 0x4c, 0xff, 0x36, 0xff, 0x44, 0xff, 0x60, 0xff, 0x90, 0xff,
+0xd0, 0xff, 0x0a, 0x00, 0x38, 0x00, 0x76, 0x00, 0x9c, 0x00, 0xaa, 0x00, 0xa6, 0x00, 0x82, 0x00,
+0x4c, 0x00, 0x12, 0x00, 0xe8, 0xff, 0x9c, 0xff, 0x64, 0xff, 0x46, 0xff, 0x32, 0xff, 0x3e, 0xff,
+0x5e, 0xff, 0x9e, 0xff, 0xe8, 0xff, 0x0c, 0x00, 0x54, 0x00, 0x92, 0x00, 0xa4, 0x00, 0xc0, 0x00,
+0xa0, 0x00, 0x76, 0x00, 0x38, 0x00, 0xfe, 0xff, 0xcc, 0xff, 0x80, 0xff, 0x50, 0xff, 0x30, 0xff,
+0x26, 0xff, 0x40, 0xff, 0x74, 0xff, 0xb4, 0xff, 0xe8, 0xff, 0x16, 0x00, 0x58, 0x00, 0x90, 0x00,
+0xb2, 0x00, 0xb8, 0x00, 0x9e, 0x00, 0x68, 0x00, 0x2e, 0x00, 0xfc, 0xff, 0xba, 0xff, 0x7e, 0xff,
+0x4e, 0xff, 0x34, 0xff, 0x32, 0xff, 0x4c, 0xff, 0x80, 0xff, 0xb8, 0xff, 0x00, 0x00, 0x32, 0x00,
+0x6a, 0x00, 0x8e, 0x00, 0x9e, 0x00, 0xa2, 0x00, 0x76, 0x00, 0x4e, 0x00, 0x16, 0x00, 0xd6, 0xff,
+0xa6, 0xff, 0x6e, 0xff, 0x4e, 0xff, 0x42, 0xff, 0x48, 0xff, 0x66, 0xff, 0x94, 0xff, 0xce, 0xff,
+0x00, 0x00, 0x3c, 0x00, 0x58, 0x00, 0x74, 0x00, 0x86, 0x00, 0x72, 0x00, 0x5a, 0x00, 0x28, 0x00,
+0xf4, 0xff, 0xca, 0xff, 0x96, 0xff, 0x74, 0xff, 0x66, 0xff, 0x60, 0xff, 0x76, 0xff, 0x8c, 0xff,
+0xba, 0xff, 0xec, 0xff, 0x12, 0x00, 0x34, 0x00, 0x52, 0x00, 0x5e, 0x00, 0x56, 0x00, 0x4c, 0x00,
+0x3a, 0x00, 0x12, 0x00, 0xf0, 0xff, 0xd0, 0xff, 0xa0, 0xff, 0x9e, 0xff, 0x8c, 0xff, 0x92, 0xff,
+0x94, 0xff, 0xbc, 0xff, 0xd0, 0xff, 0xec, 0xff, 0x18, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x2e, 0x00,
+0x2e, 0x00, 0x28, 0x00, 0x1c, 0x00, 0xfa, 0xff, 0xdc, 0xff, 0xd2, 0xff, 0xca, 0xff, 0xb2, 0xff,
+0xb6, 0xff, 0xba, 0xff, 0xbc, 0xff, 0xce, 0xff, 0xd8, 0xff, 0xf4, 0xff, 0x02, 0x00, 0x0a, 0x00,
+0x1e, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0xea, 0xff, 0xe6, 0xff,
+0xe4, 0xff, 0xd6, 0xff, 0xde, 0xff, 0xd8, 0xff, 0xd6, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xf4, 0xff,
+0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0xfa, 0xff, 0xfe, 0xff,
+0x02, 0x00, 0xf2, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff,
+0xee, 0xff, 0xe6, 0xff, 0xde, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd8, 0xff, 0xdc, 0xff,
+0xe8, 0xff, 0xf2, 0xff, 0x08, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x26, 0x00, 0x18, 0x00, 0x10, 0x00,
+0x08, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xd0, 0xff, 0xc2, 0xff, 0xb0, 0xff, 0xae, 0xff, 0xb2, 0xff,
+0xba, 0xff, 0xde, 0xff, 0xf2, 0xff, 0x06, 0x00, 0x28, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x42, 0x00,
+0x44, 0x00, 0x2e, 0x00, 0x08, 0x00, 0xee, 0xff, 0xc6, 0xff, 0x9a, 0xff, 0x8e, 0xff, 0x7e, 0xff,
+0x78, 0xff, 0x92, 0xff, 0x9a, 0xff, 0xc2, 0xff, 0xf4, 0xff, 0x18, 0x00, 0x34, 0x00, 0x62, 0x00,
+0x62, 0x00, 0x62, 0x00, 0x54, 0x00, 0x26, 0x00, 0xfa, 0xff, 0xd0, 0xff, 0xac, 0xff, 0x7e, 0xff,
+0x62, 0xff, 0x4a, 0xff, 0x58, 0xff, 0x6a, 0xff, 0x9a, 0xff, 0xd6, 0xff, 0xfe, 0xff, 0x3c, 0x00,
+0x56, 0x00, 0x78, 0x00, 0x8a, 0x00, 0x82, 0x00, 0x6c, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0xd6, 0xff,
+0x92, 0xff, 0x68, 0xff, 0x46, 0xff, 0x3a, 0xff, 0x48, 0xff, 0x5e, 0xff, 0x9a, 0xff, 0xd2, 0xff,
+0x0c, 0x00, 0x48, 0x00, 0x82, 0x00, 0xa2, 0x00, 0xae, 0x00, 0x96, 0x00, 0x6e, 0x00, 0x30, 0x00,
+0x00, 0x00, 0xca, 0xff, 0x84, 0xff, 0x52, 0xff, 0x2e, 0xff, 0x18, 0xff, 0x2e, 0xff, 0x5c, 0xff,
+0xa8, 0xff, 0xee, 0xff, 0x22, 0x00, 0x66, 0x00, 0x92, 0x00, 0xc0, 0x00, 0xc6, 0x00, 0xaa, 0x00,
+0x78, 0x00, 0x2a, 0x00, 0xf0, 0xff, 0xca, 0xff, 0x78, 0xff, 0x4a, 0xff, 0x26, 0xff, 0x1e, 0xff,
+0x48, 0xff, 0x74, 0xff, 0xc4, 0xff, 0x02, 0x00, 0x36, 0x00, 0x78, 0x00, 0xa2, 0x00, 0xbc, 0x00,
+0xc0, 0x00, 0x96, 0x00, 0x6a, 0x00, 0x24, 0x00, 0xe8, 0xff, 0xae, 0xff, 0x6c, 0xff, 0x46, 0xff,
+0x2e, 0xff, 0x38, 0xff, 0x54, 0xff, 0x8e, 0xff, 0xca, 0xff, 0x0a, 0x00, 0x40, 0x00, 0x78, 0x00,
+0x96, 0x00, 0xb4, 0x00, 0xa2, 0x00, 0x80, 0x00, 0x52, 0x00, 0x10, 0x00, 0xe4, 0xff, 0xa8, 0xff,
+0x6c, 0xff, 0x46, 0xff, 0x38, 0xff, 0x44, 0xff, 0x74, 0xff, 0xa8, 0xff, 0xde, 0xff, 0x12, 0x00,
+0x3a, 0x00, 0x70, 0x00, 0x90, 0x00, 0xa6, 0x00, 0x90, 0x00, 0x6a, 0x00, 0x30, 0x00, 0xc4, 0xff,
+0x7a, 0xff, 0x50, 0xff, 0x4e, 0xff, 0x76, 0xff, 0x8c, 0xff, 0xb8, 0xff, 0xee, 0xff, 0x1a, 0x00,
+0x4e, 0x00, 0x56, 0x00, 0x72, 0x00, 0x6a, 0x00, 0x5e, 0x00, 0x52, 0x00, 0x14, 0x00, 0xec, 0xff,
+0xc8, 0xff, 0x9c, 0xff, 0x82, 0xff, 0x6e, 0xff, 0x76, 0xff, 0x82, 0xff, 0x9e, 0xff, 0xd6, 0xff,
+0xf6, 0xff, 0x0a, 0x00, 0x32, 0x00, 0x40, 0x00, 0x42, 0x00, 0x48, 0x00, 0x3e, 0x00, 0x2e, 0x00,
+0x0c, 0x00, 0xe6, 0xff, 0xcc, 0xff, 0xb0, 0xff, 0xa8, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0xa4, 0xff,
+0xc2, 0xff, 0xe0, 0xff, 0xf2, 0xff, 0x08, 0x00, 0x20, 0x00, 0x24, 0x00, 0x22, 0x00, 0x2c, 0x00,
+0x22, 0x00, 0x10, 0x00, 0xfe, 0xff, 0xf4, 0xff, 0xdc, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xbc, 0xff,
+0xbc, 0xff, 0xc0, 0xff, 0xd4, 0xff, 0xea, 0xff, 0xee, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0x08, 0x00,
+0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfe, 0xff,
+0xfe, 0xff, 0xf8, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xd6, 0xff, 0xe2, 0xff,
+0xde, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0x10, 0x00, 0x16, 0x00,
+0x16, 0x00, 0x28, 0x00, 0x1c, 0x00, 0x22, 0x00, 0x16, 0x00, 0x02, 0x00, 0xfa, 0xff, 0xda, 0xff,
+0xc4, 0xff, 0xb4, 0xff, 0xb2, 0xff, 0xbc, 0xff, 0xc4, 0xff, 0xd2, 0xff, 0xea, 0xff, 0xfc, 0xff,
+0x12, 0x00, 0x24, 0x00, 0x32, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x34, 0x00, 0x22, 0x00, 0xfe, 0xff,
+0xf0, 0xff, 0xc6, 0xff, 0xa0, 0xff, 0x94, 0xff, 0x92, 0xff, 0x9a, 0xff, 0xa6, 0xff, 0xbe, 0xff,
+0xe8, 0xff, 0xfe, 0xff, 0x28, 0x00, 0x48, 0x00, 0x5c, 0x00, 0x66, 0x00, 0x5a, 0x00, 0x4a, 0x00,
+0x2a, 0x00, 0x04, 0x00, 0xe4, 0xff, 0xae, 0xff, 0x82, 0xff, 0x70, 0xff, 0x64, 0xff, 0x76, 0xff,
+0x8e, 0xff, 0xb6, 0xff, 0xe2, 0xff, 0x0a, 0x00, 0x40, 0x00, 0x5e, 0x00, 0x8a, 0x00, 0x86, 0x00,
+0x6e, 0x00, 0x4a, 0x00, 0x22, 0x00, 0xf8, 0xff, 0xae, 0xff, 0x86, 0xff, 0x5c, 0xff, 0x40, 0xff,
+0x30, 0xff, 0x58, 0xff, 0x82, 0xff, 0xae, 0xff, 0xe4, 0xff, 0x1e, 0x00, 0x5c, 0x00, 0x8c, 0x00,
+0xa6, 0x00, 0xa4, 0x00, 0x8e, 0x00, 0x56, 0x00, 0x24, 0x00, 0xe8, 0xff, 0xa8, 0xff, 0x6e, 0xff,
+0x42, 0xff, 0x2c, 0xff, 0x2c, 0xff, 0x44, 0xff, 0x7e, 0xff, 0xbc, 0xff, 0xec, 0xff, 0x2c, 0x00,
+0x72, 0x00, 0xa4, 0x00, 0xbe, 0x00, 0xb6, 0x00, 0x90, 0x00, 0x5c, 0x00, 0x0e, 0x00, 0xde, 0xff,
+0x92, 0xff, 0x50, 0xff, 0x30, 0xff, 0x1a, 0xff, 0x20, 0xff, 0x4e, 0xff, 0x86, 0xff, 0xd0, 0xff,
+0xfe, 0xff, 0x46, 0x00, 0x88, 0x00, 0xb0, 0x00, 0xc6, 0x00, 0xb2, 0x00, 0x8a, 0x00, 0x42, 0x00,
+0x02, 0x00, 0xc4, 0xff, 0x82, 0xff, 0x50, 0xff, 0x2a, 0xff, 0x28, 0xff, 0x3c, 0xff, 0x60, 0xff,
+0xaa, 0xff, 0xe2, 0xff, 0x22, 0x00, 0x58, 0x00, 0x94, 0x00, 0xb4, 0x00, 0xbc, 0x00, 0xac, 0x00,
+0x76, 0x00, 0x36, 0x00, 0xf2, 0xff, 0xc4, 0xff, 0x80, 0xff, 0x54, 0xff, 0x3c, 0xff, 0x3a, 0xff,
+0x56, 0xff, 0x84, 0xff, 0xb6, 0xff, 0xfc, 0xff, 0x30, 0x00, 0x62, 0x00, 0x9a, 0x00, 0xa0, 0x00,
+0xac, 0x00, 0x84, 0x00, 0x56, 0x00, 0x26, 0x00, 0xe4, 0xff, 0xb0, 0xff, 0x7a, 0xff, 0x62, 0xff,
+0x4a, 0xff, 0x54, 0xff, 0x66, 0xff, 0x94, 0xff, 0xca, 0xff, 0x08, 0x00, 0x40, 0x00, 0x62, 0x00,
+0x82, 0x00, 0x90, 0x00, 0x80, 0x00, 0x6a, 0x00, 0x42, 0x00, 0x0a, 0x00, 0xd6, 0xff, 0xaa, 0xff,
+0x8e, 0xff, 0x74, 0xff, 0x6e, 0xff, 0x74, 0xff, 0x90, 0xff, 0xa4, 0xff, 0xea, 0xff, 0x1a, 0x00,
+0x40, 0x00, 0x66, 0x00, 0x68, 0x00, 0x6a, 0x00, 0x60, 0x00, 0x46, 0x00, 0x2c, 0x00, 0xfa, 0xff,
+0xda, 0xff, 0xb2, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x8e, 0xff, 0x92, 0xff, 0x9c, 0xff, 0xca, 0xff,
+0xea, 0xff, 0x04, 0x00, 0x30, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x3a, 0x00, 0x34, 0x00, 0x26, 0x00,
+0x00, 0x00, 0xf0, 0xff, 0xe0, 0xff, 0xc2, 0xff, 0xba, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb0, 0xff,
+0xbe, 0xff, 0xd2, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0x0e, 0x00, 0x22, 0x00, 0x1a, 0x00, 0x12, 0x00,
+0x16, 0x00, 0x0e, 0x00, 0x06, 0x00, 0xf6, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xe0, 0xff, 0xe2, 0xff,
+0xd8, 0xff, 0xdc, 0xff, 0xda, 0xff, 0xdc, 0xff, 0xe8, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xee, 0xff,
+0xee, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00,
+0xfe, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xca, 0xff,
+0xc4, 0xff, 0xcc, 0xff, 0xbc, 0xff, 0xc4, 0xff, 0xde, 0xff, 0xec, 0xff, 0xf6, 0xff, 0x0c, 0x00,
+0x2a, 0x00, 0x2e, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0xf4, 0xff, 0xe6, 0xff,
+0xce, 0xff, 0xb0, 0xff, 0xa4, 0xff, 0x9a, 0xff, 0xa4, 0xff, 0xac, 0xff, 0xd2, 0xff, 0xf6, 0xff,
+0x14, 0x00, 0x32, 0x00, 0x50, 0x00, 0x5c, 0x00, 0x58, 0x00, 0x4e, 0x00, 0x3a, 0x00, 0x12, 0x00,
+0xf2, 0xff, 0xd8, 0xff, 0xa4, 0xff, 0x82, 0xff, 0x74, 0xff, 0x6c, 0xff, 0x7c, 0xff, 0x96, 0xff,
+0xc8, 0xff, 0xf2, 0xff, 0x22, 0x00, 0x56, 0x00, 0x6a, 0x00, 0x7e, 0x00, 0x78, 0x00, 0x62, 0x00,
+0x42, 0x00, 0x0e, 0x00, 0xe8, 0xff, 0xbe, 0xff, 0x90, 0xff, 0x62, 0xff, 0x4e, 0xff, 0x54, 0xff,
+0x78, 0xff, 0x98, 0xff, 0xca, 0xff, 0x08, 0x00, 0x3e, 0x00, 0x6a, 0x00, 0x92, 0x00, 0xa4, 0x00,
+0x96, 0x00, 0x7c, 0x00, 0x48, 0x00, 0x1a, 0x00, 0xe4, 0xff, 0xac, 0xff, 0x6c, 0xff, 0x40, 0xff,
+0x46, 0xff, 0x3a, 0xff, 0x64, 0xff, 0xa0, 0xff, 0xd4, 0xff, 0x18, 0x00, 0x4c, 0x00, 0x8a, 0x00,
+0xa4, 0x00, 0xac, 0x00, 0xa0, 0x00, 0x74, 0x00, 0x46, 0x00, 0x00, 0x00, 0xc6, 0xff, 0x8e, 0xff,
+0x4e, 0xff, 0x32, 0xff, 0x1a, 0xff, 0x3c, 0xff, 0x6e, 0xff, 0xa4, 0xff, 0xee, 0xff, 0x20, 0x00,
+0x60, 0x00, 0x9a, 0x00, 0xaa, 0x00, 0xb8, 0x00, 0x98, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0xee, 0xff,
+0xc6, 0xff, 0x7a, 0xff, 0x44, 0xff, 0x2c, 0xff, 0x28, 0xff, 0x42, 0xff, 0x78, 0xff, 0xc2, 0xff,
+0xfe, 0xff, 0x34, 0x00, 0x6c, 0x00, 0x94, 0x00, 0xb6, 0x00, 0xb0, 0x00, 0x98, 0x00, 0x5e, 0x00,
+0x16, 0x00, 0xe4, 0xff, 0xaa, 0xff, 0x68, 0xff, 0x42, 0xff, 0x1a, 0xff, 0x2a, 0xff, 0x54, 0xff,
+0x82, 0xff, 0xd0, 0xff, 0x06, 0x00, 0x3c, 0x00, 0x74, 0x00, 0x9a, 0x00, 0xa8, 0x00, 0x98, 0x00,
+0x78, 0x00, 0x4e, 0x00, 0x10, 0x00, 0xd0, 0xff, 0x96, 0xff, 0x62, 0xff, 0x46, 0xff, 0x38, 0xff,
+0x42, 0xff, 0x6a, 0xff, 0xa8, 0xff, 0xe0, 0xff, 0x18, 0x00, 0x50, 0x00, 0x76, 0x00, 0x90, 0x00,
+0x9e, 0x00, 0x88, 0x00, 0x6a, 0x00, 0x3e, 0x00, 0xfe, 0xff, 0xd0, 0xff, 0x9c, 0xff, 0x6e, 0xff,
+0x60, 0xff, 0x52, 0xff, 0x6c, 0xff, 0x8c, 0xff, 0xb2, 0xff, 0xf8, 0xff, 0x1e, 0x00, 0x3e, 0x00,
+0x66, 0x00, 0x74, 0x00, 0x72, 0x00, 0x68, 0x00, 0x4a, 0x00, 0x22, 0x00, 0xf2, 0xff, 0xc4, 0xff,
+0xa0, 0xff, 0x8c, 0xff, 0x76, 0xff, 0x86, 0xff, 0x8e, 0xff, 0xa8, 0xff, 0xd8, 0xff, 0xfa, 0xff,
+0x1c, 0x00, 0x34, 0x00, 0x3a, 0x00, 0x54, 0x00, 0x4a, 0x00, 0x40, 0x00, 0x2e, 0x00, 0x08, 0x00,
+0xf4, 0xff, 0xd8, 0xff, 0xba, 0xff, 0xb2, 0xff, 0xa4, 0xff, 0xb4, 0xff, 0xc8, 0xff, 0xce, 0xff,
+0xea, 0xff, 0xfe, 0xff, 0x0e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1e, 0x00,
+0x0c, 0x00, 0xf4, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xc4, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xc6, 0xff,
+0xd6, 0xff, 0xe2, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x02, 0x00, 0xfc, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xf0, 0xff,
+0xea, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xe2, 0xff,
+0xe4, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x0c, 0x00,
+0x14, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xf4, 0xff, 0xea, 0xff, 0xce, 0xff, 0xc0, 0xff,
+0xb6, 0xff, 0xb6, 0xff, 0xc0, 0xff, 0xba, 0xff, 0xca, 0xff, 0xe0, 0xff, 0xf6, 0xff, 0x08, 0x00,
+0x24, 0x00, 0x36, 0x00, 0x34, 0x00, 0x36, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x04, 0x00, 0xe4, 0xff,
+0xcc, 0xff, 0xa6, 0xff, 0x9c, 0xff, 0x92, 0xff, 0x90, 0xff, 0xb0, 0xff, 0xb4, 0xff, 0xde, 0xff,
+0x02, 0x00, 0x24, 0x00, 0x4c, 0x00, 0x5a, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x58, 0x00, 0x3c, 0x00,
+0x0a, 0x00, 0xe4, 0xff, 0xb0, 0xff, 0x8e, 0xff, 0x72, 0xff, 0x62, 0xff, 0x72, 0xff, 0x8c, 0xff,
+0xa6, 0xff, 0xde, 0xff, 0x0a, 0x00, 0x3c, 0x00, 0x64, 0x00, 0x82, 0x00, 0x94, 0x00, 0x74, 0x00,
+0x60, 0x00, 0x36, 0x00, 0x0a, 0x00, 0xd2, 0xff, 0x84, 0xff, 0x6a, 0xff, 0x48, 0xff, 0x3c, 0xff,
+0x54, 0xff, 0x7e, 0xff, 0xb2, 0xff, 0xe4, 0xff, 0x24, 0x00, 0x60, 0x00, 0x8e, 0x00, 0xa4, 0x00,
+0xa6, 0x00, 0x98, 0x00, 0x64, 0x00, 0x24, 0x00, 0xf8, 0xff, 0xb8, 0xff, 0x80, 0xff, 0x56, 0xff,
+0x2c, 0xff, 0x32, 0xff, 0x4e, 0xff, 0x82, 0xff, 0xbc, 0xff, 0x02, 0x00, 0x36, 0x00, 0x72, 0x00,
+0x9e, 0x00, 0xa6, 0x00, 0xae, 0x00, 0x8a, 0x00, 0x52, 0x00, 0x14, 0x00, 0xd4, 0xff, 0xa4, 0xff,
+0x5e, 0xff, 0x40, 0xff, 0x2c, 0xff, 0x26, 0xff, 0x4c, 0xff, 0x7c, 0xff, 0xce, 0xff, 0x04, 0x00,
+0x40, 0x00, 0x7c, 0x00, 0x98, 0x00, 0xa6, 0x00, 0x94, 0x00, 0x7e, 0x00, 0x40, 0x00, 0xfa, 0xff,
+0xce, 0xff, 0x8e, 0xff, 0x5e, 0xff, 0x36, 0xff, 0x26, 0xff, 0x38, 0xff, 0x5e, 0xff, 0x9a, 0xff,
+0xde, 0xff, 0x10, 0x00, 0x4c, 0x00, 0x84, 0x00, 0xa4, 0x00, 0x9e, 0x00, 0x90, 0x00, 0x6e, 0x00,
+0x32, 0x00, 0xfc, 0xff, 0xb8, 0xff, 0x8c, 0xff, 0x64, 0xff, 0x40, 0xff, 0x38, 0xff, 0x40, 0xff,
+0x70, 0xff, 0xaa, 0xff, 0xec, 0xff, 0x1e, 0x00, 0x44, 0x00, 0x76, 0x00, 0x8a, 0x00, 0x8a, 0x00,
+0x76, 0x00, 0x4c, 0x00, 0x20, 0x00, 0xea, 0xff, 0xbc, 0xff, 0x8e, 0xff, 0x6c, 0xff, 0x5c, 0xff,
+0x5a, 0xff, 0x6a, 0xff, 0x94, 0xff, 0xc4, 0xff, 0xfa, 0xff, 0x34, 0x00, 0x4a, 0x00, 0x62, 0x00,
+0x74, 0x00, 0x76, 0x00, 0x6a, 0x00, 0x36, 0x00, 0x18, 0x00, 0xf2, 0xff, 0xbc, 0xff, 0xa6, 0xff,
+0x90, 0xff, 0x7e, 0xff, 0x88, 0xff, 0x90, 0xff, 0xa8, 0xff, 0xe4, 0xff, 0x0c, 0x00, 0x26, 0x00,
+0x44, 0x00, 0x5a, 0x00, 0x60, 0x00, 0x58, 0x00, 0x46, 0x00, 0x2c, 0x00, 0x06, 0x00, 0xea, 0xff,
+0xc4, 0xff, 0xae, 0xff, 0x9e, 0xff, 0x96, 0xff, 0x9a, 0xff, 0xa2, 0xff, 0xc2, 0xff, 0xe4, 0xff,
+0xfe, 0xff, 0x1a, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x34, 0x00, 0x38, 0x00, 0x34, 0x00, 0x12, 0x00,
+0x00, 0x00, 0xec, 0xff, 0xd4, 0xff, 0xc6, 0xff, 0xc0, 0xff, 0xc6, 0xff, 0xc0, 0xff, 0xc4, 0xff,
+0xd6, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0x02, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x12, 0x00,
+0x10, 0x00, 0x02, 0x00, 0xf8, 0xff, 0xea, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe6, 0xff,
+0xde, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xd8, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xe8, 0xff,
+0xec, 0xff, 0xea, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0x02, 0x00,
+0xfc, 0xff, 0x04, 0x00, 0xfa, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xd0, 0xff, 0xbc, 0xff, 0xbe, 0xff,
+0xc4, 0xff, 0xc4, 0xff, 0xc6, 0xff, 0xde, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0x0e, 0x00, 0x18, 0x00,
+0x24, 0x00, 0x22, 0x00, 0x16, 0x00, 0x22, 0x00, 0x14, 0x00, 0xfe, 0xff, 0xe2, 0xff, 0xbc, 0xff,
+0xa8, 0xff, 0xa4, 0xff, 0xa6, 0xff, 0xa8, 0xff, 0xb2, 0xff, 0xd4, 0xff, 0xf0, 0xff, 0x04, 0x00,
+0x22, 0x00, 0x38, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x20, 0x00, 0xfa, 0xff,
+0xd6, 0xff, 0xa6, 0xff, 0x8c, 0xff, 0x86, 0xff, 0x76, 0xff, 0x8c, 0xff, 0x9e, 0xff, 0xc8, 0xff,
+0xf6, 0xff, 0x1a, 0x00, 0x44, 0x00, 0x60, 0x00, 0x74, 0x00, 0x72, 0x00, 0x62, 0x00, 0x4c, 0x00,
+0x22, 0x00, 0xea, 0xff, 0xc2, 0xff, 0x8e, 0xff, 0x7a, 0xff, 0x66, 0xff, 0x62, 0xff, 0x82, 0xff,
+0x9e, 0xff, 0xd4, 0xff, 0x08, 0x00, 0x36, 0x00, 0x60, 0x00, 0x84, 0x00, 0x9e, 0x00, 0x92, 0x00,
+0x7a, 0x00, 0x4c, 0x00, 0x22, 0x00, 0xe0, 0xff, 0xaa, 0xff, 0x74, 0xff, 0x54, 0xff, 0x4a, 0xff,
+0x4e, 0xff, 0x6a, 0xff, 0xa2, 0xff, 0xd2, 0xff, 0x06, 0x00, 0x3c, 0x00, 0x76, 0x00, 0x98, 0x00,
+0xa2, 0x00, 0xa4, 0x00, 0x72, 0x00, 0x40, 0x00, 0x0a, 0x00, 0xd0, 0xff, 0x96, 0xff, 0x5c, 0xff,
+0x3c, 0xff, 0x28, 0xff, 0x3e, 0xff, 0x68, 0xff, 0xac, 0xff, 0xe8, 0xff, 0x10, 0x00, 0x48, 0x00,
+0x8a, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0x9c, 0x00, 0x6a, 0x00, 0x32, 0x00, 0xf2, 0xff, 0xbe, 0xff,
+0x7a, 0xff, 0x54, 0xff, 0x32, 0xff, 0x2a, 0xff, 0x3c, 0xff, 0x6e, 0xff, 0xbe, 0xff, 0xf2, 0xff,
+0x24, 0x00, 0x60, 0x00, 0x8e, 0x00, 0xa8, 0x00, 0xa4, 0x00, 0x86, 0x00, 0x50, 0x00, 0x14, 0x00,
+0xd8, 0xff, 0xaa, 0xff, 0x74, 0xff, 0x48, 0xff, 0x28, 0xff, 0x38, 0xff, 0x52, 0xff, 0x7e, 0xff,
+0xbc, 0xff, 0xf8, 0xff, 0x36, 0x00, 0x60, 0x00, 0x8a, 0x00, 0xa2, 0x00, 0x94, 0x00, 0x76, 0x00,
+0x46, 0x00, 0x0c, 0x00, 0xde, 0xff, 0xac, 0xff, 0x76, 0xff, 0x58, 0xff, 0x4a, 0xff, 0x4a, 0xff,
+0x66, 0xff, 0x92, 0xff, 0xc8, 0xff, 0xfe, 0xff, 0x34, 0x00, 0x68, 0x00, 0x80, 0x00, 0x9a, 0x00,
+0x88, 0x00, 0x60, 0x00, 0x3c, 0x00, 0xfe, 0xff, 0xd6, 0xff, 0xa4, 0xff, 0x84, 0xff, 0x6c, 0xff,
+0x60, 0xff, 0x6e, 0xff, 0x86, 0xff, 0xa6, 0xff, 0xde, 0xff, 0x0e, 0x00, 0x30, 0x00, 0x54, 0x00,
+0x64, 0x00, 0x72, 0x00, 0x64, 0x00, 0x48, 0x00, 0x1c, 0x00, 0xf0, 0xff, 0xd2, 0xff, 0xa8, 0xff,
+0xa0, 0xff, 0x94, 0xff, 0x86, 0xff, 0x96, 0xff, 0xac, 0xff, 0xcc, 0xff, 0xf4, 0xff, 0x14, 0x00,
+0x36, 0x00, 0x4a, 0x00, 0x48, 0x00, 0x50, 0x00, 0x46, 0x00, 0x2a, 0x00, 0x12, 0x00, 0xf2, 0xff,
+0xda, 0xff, 0xc6, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xba, 0xff, 0xc0, 0xff, 0xcc, 0xff, 0xe4, 0xff,
+0x02, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x18, 0x00, 0x26, 0x00, 0x1c, 0x00, 0x02, 0x00,
+0xfe, 0xff, 0xf2, 0xff, 0xe2, 0xff, 0xd8, 0xff, 0xd4, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xdc, 0xff,
+0xde, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff,
+0xfa, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xfa, 0xff,
+0xf8, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xde, 0xff,
+0xd4, 0xff, 0xcc, 0xff, 0xdc, 0xff, 0xe2, 0xff, 0xee, 0xff, 0x00, 0x00, 0x10, 0x00, 0x1a, 0x00,
+0x0e, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x02, 0x00, 0xf8, 0xff, 0xdc, 0xff, 0xd0, 0xff, 0xbc, 0xff,
+0xb4, 0xff, 0xb6, 0xff, 0xae, 0xff, 0xb4, 0xff, 0xcc, 0xff, 0xde, 0xff, 0xfc, 0xff, 0x1a, 0x00,
+0x2e, 0x00, 0x30, 0x00, 0x38, 0x00, 0x2e, 0x00, 0x1c, 0x00, 0x04, 0x00, 0xf2, 0xff, 0xcc, 0xff,
+0xa4, 0xff, 0x96, 0xff, 0x88, 0xff, 0x8c, 0xff, 0xa0, 0xff, 0xa6, 0xff, 0xcc, 0xff, 0xf6, 0xff,
+0x1a, 0x00, 0x48, 0x00, 0x52, 0x00, 0x60, 0x00, 0x60, 0x00, 0x4c, 0x00, 0x32, 0x00, 0x06, 0x00,
+0xe6, 0xff, 0xbe, 0xff, 0x8a, 0xff, 0x66, 0xff, 0x64, 0xff, 0x62, 0xff, 0x78, 0xff, 0x9c, 0xff,
+0xca, 0xff, 0xf8, 0xff, 0x32, 0x00, 0x5c, 0x00, 0x72, 0x00, 0x8a, 0x00, 0x84, 0x00, 0x62, 0x00,
+0x36, 0x00, 0x0a, 0x00, 0xda, 0xff, 0xa4, 0xff, 0x6e, 0xff, 0x40, 0xff, 0x40, 0xff, 0x48, 0xff,
+0x66, 0xff, 0xb0, 0xff, 0xde, 0xff, 0x16, 0x00, 0x50, 0x00, 0x8a, 0x00, 0xac, 0x00, 0xac, 0x00,
+0xa0, 0x00, 0x74, 0x00, 0x3e, 0x00, 0x0a, 0x00, 0xcc, 0xff, 0x90, 0xff, 0x4e, 0xff, 0x3a, 0xff,
+0x30, 0xff, 0x3a, 0xff, 0x76, 0xff, 0xb8, 0xff, 0xf4, 0xff, 0x26, 0x00, 0x70, 0x00, 0xa4, 0x00,
+0xb8, 0x00, 0xc0, 0x00, 0xa4, 0x00, 0x74, 0x00, 0x2e, 0x00, 0xf4, 0xff, 0xb8, 0xff, 0x74, 0xff,
+0x3c, 0xff, 0x20, 0xff, 0x26, 0xff, 0x44, 0xff, 0x6c, 0xff, 0xc4, 0xff, 0x00, 0x00, 0x3c, 0x00,
+0x7c, 0x00, 0xaa, 0x00, 0xc8, 0x00, 0xba, 0x00, 0xa4, 0x00, 0x6e, 0x00, 0x1a, 0x00, 0xee, 0xff,
+0xa8, 0xff, 0x64, 0xff, 0x3c, 0xff, 0x26, 0xff, 0x2c, 0xff, 0x50, 0xff, 0x94, 0xff, 0xd2, 0xff,
+0x0e, 0x00, 0x4e, 0x00, 0x7e, 0x00, 0xa6, 0x00, 0xc2, 0x00, 0xb2, 0x00, 0x90, 0x00, 0x5a, 0x00,
+0x12, 0x00, 0xd0, 0xff, 0x9c, 0xff, 0x60, 0xff, 0x32, 0xff, 0x2c, 0xff, 0x36, 0xff, 0x5e, 0xff,
+0x9a, 0xff, 0xd6, 0xff, 0x10, 0x00, 0x3c, 0x00, 0x72, 0x00, 0x8e, 0x00, 0x96, 0x00, 0x8e, 0x00,
+0x64, 0x00, 0x36, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x8a, 0xff, 0x6a, 0xff, 0x52, 0xff, 0x42, 0xff,
+0x5e, 0xff, 0x7e, 0xff, 0xb4, 0xff, 0xec, 0xff, 0x16, 0x00, 0x44, 0x00, 0x5e, 0x00, 0x78, 0x00,
+0x78, 0x00, 0x5e, 0x00, 0x4a, 0x00, 0x10, 0x00, 0xf4, 0xff, 0xc2, 0xff, 0x8e, 0xff, 0x84, 0xff,
+0x66, 0xff, 0x72, 0xff, 0x84, 0xff, 0x98, 0xff, 0xd2, 0xff, 0xf4, 0xff, 0x1c, 0x00, 0x38, 0x00,
+0x42, 0x00, 0x50, 0x00, 0x4a, 0x00, 0x46, 0x00, 0x26, 0x00, 0x04, 0x00, 0xee, 0xff, 0xc0, 0xff,
+0xa0, 0xff, 0xa2, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0xae, 0xff, 0xc2, 0xff, 0xe2, 0xff, 0x02, 0x00,
+0x14, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x2e, 0x00, 0x22, 0x00, 0x16, 0x00, 0x00, 0x00,
+0xec, 0xff, 0xde, 0xff, 0xd0, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xda, 0xff, 0xe6, 0xff,
+0xf2, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x0c, 0x00,
+0xfc, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xe4, 0xff,
+0xe4, 0xff, 0xee, 0xff, 0xee, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xf2, 0xff};
+
+#endif
diff --git a/mbtk/test/libql_lib_v2/Makefile b/mbtk/test/libql_lib_v2/Makefile
new file mode 100755
index 0000000..401a563
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/Makefile
@@ -0,0 +1,34 @@
+BUILD_ROOT = $(shell pwd)/../..
+include $(BUILD_ROOT)/Make.defines
+
+INC_DIR +=
+
+LIB_DIR +=
+
+LIBS += -lmbtk_lib -lql_lib
+
+CFLAGS = $(CFLAGS_TEST)
+
+DEFINE +=
+
+LOCAL_SRC_FILES = $(wildcard *.c) $(wildcard *.cpp)
+
+$(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES))
+
+OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(LOCAL_SRC_FILES)))
+BINS = $(patsubst %.o,%,$(OBJS))
+
+all: $(BINS)
+
+$(BINS):$(OBJS)
+	@echo "  BIN     $@"
+	$(CC) $(CFLAGS) $(LIB_DIR) $(LIBS) $@.o -o $(OUT_DIR)/bin/$@
+
+%.o:%.c
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+%.o:%.cpp
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+clean:
+	rm -f $(OBJS)
diff --git a/mbtk/test/libql_lib_v2/ql_adc_test.c b/mbtk/test/libql_lib_v2/ql_adc_test.c
new file mode 100755
index 0000000..d82a5b9
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_adc_test.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include "ql_adc.h"
+
+int main(int argc, char *argv[])
+{
+    if(argc != 2) {
+        printf("ql_adc_test <0/1/2>\n");
+        return -1;
+    }
+
+    int adc = atoi(argv[1]);
+    if(adc != 0 && adc != 1 && adc != 2) {
+        printf("ql_adc_test <0/1/2>\n");
+        return -1;
+    }
+
+    int result = ql_adc_show((ADC_CHANNEL_E)(adc + 1));
+
+    printf("ADC : %d\n", result);
+
+    return 0;
+}
+
diff --git a/mbtk/test/libql_lib_v2/ql_atc_test.c b/mbtk/test/libql_lib_v2/ql_atc_test.c
new file mode 100755
index 0000000..47c00ac
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_atc_test.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include "ql_atc.h"
+
+
+int main(int argc, char *argv[])
+{
+    if(argc != 2) {
+        printf("ql_atc_test <at>\n");
+        return -1;
+    }
+
+    if(ql_atc_init()) {
+        printf("ql_atc_init() fail.\n");
+        return -1;
+    }
+
+    char resp[1024];
+    if(ql_atc_send(argv[1], resp, sizeof(resp))) {
+        printf("ql_atc_send() fail.\n");
+        return -1;
+    }
+
+    if(ql_atc_deinit()) {
+        printf("ql_atc_deinit() fail.\n");
+        return -1;
+    }
+
+    printf("RSP : %s\n", resp);
+
+    return 0;
+}
diff --git a/mbtk/test/libql_lib_v2/ql_audio_test.c b/mbtk/test/libql_lib_v2/ql_audio_test.c
new file mode 100755
index 0000000..1944fb5
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_audio_test.c
@@ -0,0 +1,541 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file m_audio.c
+  @brief audio API example
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when         who          what, where, why
+  --------     ---          ----------------------------------------------------------
+  2021-11-03   dameng.lin      Create.
+-------------------------------------------------------------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+
+#include "ql_v2/ql_type.h"
+#include "ql_v2/ql_audio_pcm.h"
+#include "ql_v2/ql_audio_cfg.h"
+#include "ql_v2/ql_test_utils.h"
+
+typedef void (*show_handler_f)(void);
+
+typedef struct
+{
+    const char *name;
+    show_handler_f handle;
+}audio_show_t;
+
+typedef struct
+{
+    int playback_dest;
+    int block_flag;
+    char file_name[128];
+}audio_playback_info_t;
+
+static ql_audio_handle_t g_playback_handle = QL_AUDIO_INVALID_HANDLE;
+static int g_playback_end = 0;
+
+
+void item_ql_audio_init(void)
+{
+    int ret = 0;
+
+    printf("test ql_audio_init: ");
+    ret = ql_audio_init();
+    if(QL_ERR_OK != ret)
+    {
+        printf("Failed to init audio service, ret = %d\n", ret);
+    }
+    else
+    {
+        printf("Success to init audio service\n");
+    }
+}
+
+static void audio_service_error_cb_func(int error)
+{
+    printf("===== Audio Service Abort ===== error = %d\n",error);
+}
+
+static void item_ql_audio_set_service_error_cb(void)
+{
+    int ret = QL_ERR_OK;
+
+    printf("test ql_audio_set_service_error_cb: \n");
+    ret = ql_audio_set_service_error_cb(audio_service_error_cb_func);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_audio_set_service_error_cb, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+static void item_ql_audio_set_loopback_enable_state(void)
+{
+    int ret = QL_ERR_OK;
+    int loopback_enable_state = 0;
+
+    printf("test ql_audio_set_loopback_enable_state: \n");
+    printf("please enter the loopback enable state(0-1): ");
+    ret = t_get_int(&loopback_enable_state);
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    ret = ql_audio_set_loopback_enable_state(loopback_enable_state);
+    if (QL_ERR_OK != ret)
+    {
+        printf("Failed to set loopback enable state, ret = %d\n", ret);
+    }
+    else
+    {
+        printf("Success to set loopback enable state\n");
+    }
+}
+
+static void item_ql_audio_get_loopback_enable_state(void)
+{
+    int ret = QL_ERR_OK;
+    int32_t loopback_enable_state = 0;
+
+    printf("test ql_audio_get_loopback_enable_state: \n");
+
+    ret = ql_audio_get_loopback_enable_state(&loopback_enable_state);
+    if (QL_ERR_OK != ret)
+    {
+        printf("Failed to get loopback enable state, ret = %d\n", ret);
+    }
+    else
+    {
+        printf("Success to get loopback enable state, loopback_enable_state = %d\n", loopback_enable_state);
+    }
+}
+
+
+static void item_ql_audio_set_tx_voice_mic_gain(void)
+{
+    int ret = QL_ERR_OK;
+    int tx_voice_mic_gain = 0;
+
+    printf("test ql_audio_set_tx_voice_mic_gain: \n");
+    printf("please enter the tx voice mic gain(0-65535): ");
+    ret = t_get_int(&tx_voice_mic_gain);
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    ret = ql_audio_set_tx_voice_mic_gain(tx_voice_mic_gain);
+    if (QL_ERR_OK != ret)
+    {
+        printf("Failed to set tx voice mic gain, ret = %d\n", ret);
+    }
+    else
+    {
+        printf("Success to set tx voice mic gain\n");
+    }
+}
+
+static void item_ql_audio_get_tx_voice_mic_gain(void)
+{
+    int ret = QL_ERR_OK;
+    int32_t tx_voice_mic_gain = 0;
+
+    printf("test ql_audio_get_tx_voice_mic_gain: \n");
+
+    ret = ql_audio_get_tx_voice_mic_gain(&tx_voice_mic_gain);
+    if (QL_ERR_OK != ret)
+    {
+        printf("Failed to get tx voice mic gain, ret = %d\n", ret);
+    }
+    else
+    {
+        printf("Success to get tx voice mic gain, tx_voice_mic_gain = %d\n", tx_voice_mic_gain);
+    }
+}
+
+static void item_ql_audio_set_codec_down_vol(void)
+{
+    int ret = QL_ERR_OK;
+    int down_volume = 0;
+
+    printf("test ql_audio_set_codec_down_vol: \n");
+    printf("please enter the codec down volume(0-100): ");
+    ret = t_get_int(&down_volume);
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    ret = ql_audio_set_codec_down_vol(down_volume);
+    if (QL_ERR_OK != ret)
+    {
+        printf("Failed to set codec down volume, ret = %d\n", ret);
+    }
+    else
+    {
+        printf("Success to set codec down volume\n");
+    }
+}
+
+static void item_ql_audio_get_codec_down_vol(void)
+{
+    int ret = QL_ERR_OK;
+    int32_t down_volume = 0;
+
+    printf("test ql_audio_get_codec_down_vol: \n");
+
+    ret = ql_audio_get_codec_down_vol(&down_volume);
+    if (QL_ERR_OK != ret)
+    {
+        printf("Failed to get codec down volume, ret = %d\n", ret);
+    }
+    else
+    {
+        printf("Success to codec down volume, down_volume = %d\n", down_volume);
+    }
+}
+
+void item_ql_audio_deinit(void)
+{
+    int ret = 0;
+
+    printf("test ql_audio_deinit: ");
+    ret = ql_audio_deinit();
+    if(QL_ERR_OK != ret)
+    {
+        printf("Failed to deinit audio service, ret = %d\n", ret);
+    }
+    else
+    {
+        printf("Success to deinit audio service\n");
+    }
+}
+
+static int default_playback_state(ql_audio_handle_t handle, void *params, QL_AUDIO_PLAYBACK_STATE_E state)
+{
+    int ret = 0;
+
+    switch(state)
+    {
+        case QL_AUDIO_PLAYBACK_STATE_OPEN:
+        {
+            printf("QL_AUDIO_PLAYBACK_STATE_OPEN\n");
+            break;
+        }
+        case QL_AUDIO_PLAYBACK_STATE_PREPARE:
+        {
+            printf("QL_AUDIO_PLAYBACK_STATE_PREPARE\n");
+            break;
+        }
+        case QL_AUDIO_PLAYBACK_STATE_PLAYING:
+        {
+            printf("QL_AUDIO_PLAYBACK_STATE_PLAYING\n");
+            break;
+        }
+        case QL_AUDIO_PLAYBACK_STATE_FINISHED:
+        {
+            printf("QL_AUDIO_PLAYBACK_STATE_FINISHED\n");
+            g_playback_end = 1;
+            break;
+        }
+        case QL_AUDIO_PLAYBACK_STATE_PAUSE:
+        {
+            printf("QL_AUDIO_PLAYBACK_STATE_PAUSE\n");
+            break;
+        }
+        case QL_AUDIO_PLAYBACK_STATE_ERROR:
+        {
+            printf("QL_AUDIO_PLAYBACK_STATE_ERROR\n");
+            g_playback_end = 1;
+            break;
+        }
+        default:
+        {
+            printf("INVALID PALYBACK STATE\n");
+            ret = -1;
+            break;
+        }
+    }
+
+    return ret;
+}
+
+static void *ql_audio_play_file_thread(void *args)
+{
+    int ret = QL_ERR_OK;
+    uint32_t be_dai_mask = 0;
+    ql_audio_handle_t handle = QL_AUDIO_INVALID_HANDLE;
+
+    audio_playback_info_t *playback_info = (audio_playback_info_t *)args;
+    if (NULL == playback_info)
+    {
+        printf("invalid params\n");
+        return NULL;
+    }
+
+    switch(playback_info->playback_dest)
+    {
+        case 0:
+        {
+            be_dai_mask = QL_AUDIO_BE_DAI_MASK_PLAYBACK_PRI_PCM;
+            break;
+        }
+        case 1:
+        {
+            be_dai_mask = QL_AUDIO_BE_DAI_MASK_PLAYBACK_VOICE_TX;
+            break;
+        }
+        case 2:
+        {
+            be_dai_mask = QL_AUDIO_BE_DAI_MASK_PLAYBACK_PRI_PCM | QL_AUDIO_BE_DAI_MASK_PLAYBACK_VOICE_TX;
+            break;
+        }
+        default:
+        {
+            printf("invalid playback destination\n");
+            free(playback_info);
+            playback_info = NULL;
+            return NULL;
+        }
+    }
+
+    handle = ql_audio_playback_open(QL_AUDIO_FE_PCM_DEV_MULTIMEDIA1, be_dai_mask);
+    if (QL_AUDIO_INVALID_HANDLE >= handle)
+    {
+        printf("Failed to open playback\n");
+        free(playback_info);
+        playback_info = NULL;
+        return NULL;
+    }
+
+    g_playback_handle = handle;
+
+    printf("playback handle = %d",g_playback_handle);
+    ql_audio_playback_set_block_flag(g_playback_handle, playback_info->block_flag);
+
+    ret = ql_audio_playback_file_prepare(g_playback_handle,
+                                         playback_info->file_name,
+                                         NULL,
+                                         default_playback_state,
+                                         NULL);
+    if (QL_ERR_OK != ret)
+    {
+        printf("Failed to prepare playback file\n");
+        free(playback_info);
+        playback_info = NULL;
+        ql_audio_playback_close(g_playback_handle);
+        return NULL;
+    }
+    printf("playback handle = %d",g_playback_handle);
+
+	ret = ql_audio_playback_play(g_playback_handle);
+    if (QL_ERR_OK != ret)
+    {
+        printf("Failed to play file\n");
+        free(playback_info);
+        playback_info = NULL;
+        ql_audio_playback_close(g_playback_handle);
+        return NULL;
+    }
+
+    while(0 == g_playback_end)
+    {
+        usleep(100 * 1000);
+    }
+
+    printf("End playing file\n");
+    ql_audio_playback_close(g_playback_handle);
+    g_playback_handle = QL_AUDIO_INVALID_HANDLE;
+    g_playback_end = 0;
+
+    free(playback_info);
+    playback_info = NULL;
+
+    return NULL;
+}
+
+static void item_ql_audio_playback_play_file(void)
+{
+    int ret = 0;
+    pthread_t thread_id;
+    pthread_attr_t thread_attr;
+    audio_playback_info_t *playback_info = NULL;
+
+    printf("test ql_audio_playback_play_file: \n");
+
+    playback_info = (audio_playback_info_t *)malloc(sizeof(audio_playback_info_t));
+    if (NULL == playback_info)
+    {
+        printf("Failed to malloc memory\n");
+        return;
+    }
+    memset(playback_info, 0, sizeof(audio_playback_info_t));
+
+    printf("please enter the file name: ");
+    ret = t_get_string(playback_info->file_name,sizeof(playback_info->file_name));
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("please enter the playback destination(0-To pcm interface / 1-To voice / 2-To pcm interface and voice): ");
+    ret = t_get_int(&(playback_info->playback_dest));
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("please enter the block flag(0-nonblock / 1-block): ");
+    ret = t_get_int(&(playback_info->block_flag));
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    pthread_attr_init(&thread_attr);
+    pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
+
+    ret = pthread_create(&thread_id, &thread_attr, ql_audio_play_file_thread, (void *)playback_info);
+    if (0 > ret)
+    {
+        printf("Failed to create play file thread, ret = %d, err = %s\n", ret, strerror(errno));
+    }
+
+    pthread_attr_destroy(&thread_attr);
+}
+
+
+static audio_show_t audio_show[] =
+{
+    { "ql_audio_init",                          item_ql_audio_init                         },
+    { "ql_audio_set_service_error_cb",          item_ql_audio_set_service_error_cb         },
+    { "ql_audio_set_loopback_enable_state",     item_ql_audio_set_loopback_enable_state    },
+    { "ql_audio_get_loopback_enable_state",     item_ql_audio_get_loopback_enable_state    },
+    { "ql_audio_set_tx_voice_mic_gain",         item_ql_audio_set_tx_voice_mic_gain        },
+    { "ql_audio_get_tx_voice_mic_gain",         item_ql_audio_get_tx_voice_mic_gain        },
+    { "ql_audio_set_codec_down_vol",            item_ql_audio_set_codec_down_vol           },
+    { "ql_audio_get_codec_down_vol",            item_ql_audio_get_codec_down_vol           },
+    { "ql_audio_playback_play_file",            item_ql_audio_playback_play_file           },
+    { "ql_audio_deinit",                        item_ql_audio_deinit                       }
+	
+};
+
+int audio_get_int(int *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if (NULL == val)
+    {   
+        return -1;
+    }
+
+    if (fgets(buf, sizeof(buf), stdin) == NULL)
+    {
+        return -1;
+    }
+
+    if('\0' == buf[0])
+    {
+        return -1;
+    }
+
+    if('\n' == buf[0])
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 10); 
+    if((NULL != ptr_end) && ('\n' != ptr_end[0]))
+    {
+        return -1;
+    }
+
+    *val = dat;
+    return 0;
+}
+
+static void dump_audio_show(void)
+{
+    int i = 0;
+
+    for(i = 0; i < sizeof(audio_show)/sizeof(audio_show[0]); i++)
+    {
+        printf("%d\t%s\n", i, audio_show[i].name);
+    }
+    printf("-1\texit\n");
+}
+
+
+int main(int argc, char **argv)
+{
+    int ret = 0;
+    int index = 0;
+
+    dump_audio_show();
+
+    while (1)
+    {
+        printf("\n");
+        printf("Please enter your choice: ");
+        ret = audio_get_int(&index);
+        printf("\n");
+        if(ret < 0)
+        {
+            printf("Invalid input\n");
+            continue;
+        }
+        else if(ret == 1)
+        {
+            dump_audio_show();
+            continue;
+        }
+
+        if (index == -1)
+        {
+            break;
+        }
+
+        if ((index < 0) || (index >= sizeof(audio_show)/sizeof(audio_show[0])))
+        {
+            printf("Not support index: %d\n", index);
+            continue;
+        }
+
+        if (NULL != audio_show[index].handle)
+        {
+            audio_show[index].handle();
+        }
+    }
+
+    return 0;
+}
+
+
+
diff --git a/mbtk/test/libql_lib_v2/ql_data_call_main_apn_test.c b/mbtk/test/libql_lib_v2/ql_data_call_main_apn_test.c
new file mode 100755
index 0000000..8921f4f
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_data_call_main_apn_test.c
@@ -0,0 +1,250 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file main_apn.c
+  @brief Example how to set and get APN configuration
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20190624   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <stdint.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include "ql_type.h"
+#include "ql_data_call.h"
+
+const char *g_options_short = "a:n:v:f:u:p:sg";
+
+struct option g_options_long[] = {
+    {"set",        no_argument,          0,     's'},
+    {"get",        no_argument,          0,     'g'},
+    {"apn_id",     required_argument,    0,     'a'},
+    {"apn_name",   required_argument,    0,     'n'},
+    {"ip_ver",     required_argument,    0,     'v'},
+    {"auth_pref",  required_argument,    0,     'f'},
+    {"username",   required_argument,    0,     'u'},
+    {"password",   required_argument,    0,     'p'},
+    {NULL,         0,                    0,      0 }
+};
+
+#define USAGE_STRING "exec --[set|s]|[get|g], set or get apn configuration\r\n"\
+    "     --apn_id|a number, apn id, range:1-16\r\n"\
+    "     [--ip_ver|v number], ip vresion:4-IPV4,6-IPV6,10-IPV4V6\r\n"\
+    "     [--apn_name|n string], apn name\r\n"\
+    "     [--auth_pref|f number], auth pref:0-none,1-pap,2-chap,3-pan&chap\r\n"\
+    "     [--username|u string], \r\n"\
+    "     [--password|p string], auth pref:0-none,1-pap,2-chap,3-pan&chap\r\n"\
+    "exp : exec -g -a 1\r\n " \
+    "      exec -s -a 4 -v 4 -n test_apn -f 0 -u test_username -p test_password\r\n "
+
+
+void usage(void)
+{
+    printf("%s", USAGE_STRING);
+}
+
+
+int main(int argc, char *argv[])
+{
+    int c;
+    int dat;
+    int ret;
+    int opt_idx = 0;
+    int retry_cnt = 0;
+
+    int opt_type = -1; /*1-get 2-set*/
+    int apn_id = -1;
+    int ip_ver = QL_NET_IP_VER_V4;
+    int auth_pref = QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED;
+    char apn_name[128] = {0};
+    char username[128] = {0};
+    char password[128] = {0};
+
+    ql_data_call_apn_config_t cfg;
+
+    while(1)
+    {
+        c = getopt_long(argc, argv, g_options_short, g_options_long, &opt_idx);
+        if(c==-1)
+        {
+            break;
+        }
+
+        switch(c) {
+            case 's':
+                opt_type = 2;
+                break;
+            case 'g':
+                opt_type = 1;
+                break;
+
+            case 'a':
+                apn_id = atoi(optarg);
+                if(apn_id<=0 || apn_id>QL_NET_MAX_APN_ID)
+                {
+                    printf("Invalid apn_id : %d\n", apn_id);
+                    return -1;
+                }
+
+                break;
+            case 'f':
+                dat = atoi(optarg);
+                switch(dat)
+                {
+                    case 0:
+                        auth_pref = QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED;
+                        break;
+                    case 1:
+                        auth_pref = QL_NET_AUTH_PREF_PAP_ONLY_ALLOWED;
+                        break;
+                    case 2:
+                        auth_pref = QL_NET_AUTH_PREF_CHAP_ONLY_ALLOWED;
+                        break;
+                    case 3:
+                        auth_pref = QL_NET_AUTH_PREF_PAP_CHAP_BOTH_ALLOWED;
+                        break;
+                    default:
+                        printf("Invalid auth pref : %d\n", dat);
+                        return -1;
+                }
+                break;
+            case 'v':
+                dat = atoi(optarg);
+                if(4 == dat)
+                {
+                    ip_ver = QL_NET_IP_VER_V4;
+                }
+                else if(6 == dat)
+                {
+                    ip_ver = QL_NET_IP_VER_V6;
+                }
+                else if(10 == dat)
+                {
+                    ip_ver = QL_NET_IP_VER_V4V6;
+                }
+                else
+                {
+                    printf("Invalid ip_ver : %d\n", dat);
+                    return -1;
+                }
+                break;
+
+            case 'n':
+                strncpy(apn_name, optarg, sizeof(apn_name)-1);
+                break;
+
+            case 'u':
+                strncpy(username, optarg, sizeof(username)-1);
+                break;
+
+            case 'p':
+                strncpy(password, optarg, sizeof(password)-1);
+                break;
+
+            default:
+                usage();
+                return 0;
+        }
+    }
+
+    if(opt_type!=1 && opt_type!=2)
+    {
+        usage();
+        return 0;
+    }
+
+    if(apn_id<=0 || apn_id>QL_NET_MAX_APN_ID)
+    {
+        usage();
+        return 0;
+    }
+
+    retry_cnt = 20*1000/100; /** timeout : 20S */
+    while(retry_cnt>0)
+    {
+        ret = ql_data_call_init();
+        if(ret == QL_ERR_SERVICE_NOT_READY)
+        {
+            retry_cnt--;
+            usleep(100*1000); /** sleep 100ms */
+        }
+        break;
+    }
+
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_init, ret=%d", ret);
+        return -1;
+    }
+
+
+    /** get apn info */
+    if(opt_type == 1)
+    {
+        memset(&cfg, 0 ,sizeof(cfg));
+        ret = ql_data_call_get_apn_config(apn_id, &cfg);
+        if(ret != QL_ERR_OK)
+        {
+            printf("Failed to get apn configuration, ret=%d\n", ret);
+            return -1;
+        }
+        printf("Succeed to get apn configuration\n");
+        printf("apn_id     : %d\n", apn_id);
+        printf("ip_ver     : %d\n", cfg.ip_ver);
+        printf("auth_pref  : %d\n", cfg.auth_pref);
+        printf("apn_name   : %s\n", cfg.apn_name);
+        printf("username   : %s\n", cfg.username);
+        printf("password   : %s\n", cfg.password);
+    }
+    else
+    {
+        memset(&cfg, 0, sizeof(cfg));
+        cfg.ip_ver = ip_ver;
+        cfg.auth_pref = auth_pref;
+        strncpy(cfg.apn_name, apn_name, sizeof(cfg.apn_name)-1);
+        strncpy(cfg.username, username, sizeof(cfg.username)-1);
+        strncpy(cfg.password, password, sizeof(cfg.password)-1);
+
+        printf("Start to set apn configuration\n");
+        printf("apn_id     : %d\n", apn_id);
+        printf("ip_ver     : %d\n", cfg.ip_ver);
+        printf("auth_pref  : %d\n", cfg.auth_pref);
+        printf("apn_name   : %s\n", cfg.apn_name);
+        printf("username   : %s\n", cfg.username);
+        printf("password   : %s\n", cfg.password);
+
+        ret = ql_data_call_set_apn_config(apn_id, &cfg);
+        if(ret != QL_ERR_OK)
+        {
+            printf("Failed to set apn configuration, ret=%d\n", ret);
+            return -1;
+        }
+        printf("Succeed to set apn configuration\n");
+    }
+
+
+    return 0;
+}
+
diff --git a/mbtk/test/libql_lib_v2/ql_data_call_main_data_call_test.c b/mbtk/test/libql_lib_v2/ql_data_call_main_data_call_test.c
new file mode 100755
index 0000000..f6fb33d
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_data_call_main_data_call_test.c
@@ -0,0 +1,332 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file main_data_call.c
+  @brief Example how to data call API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20190624   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <stdint.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include "ql_type.h"
+#include "ql_data_call.h"
+
+const char *g_options_short = "i:n:a:v:r:dhd";
+
+struct option g_options_long[] = {
+    {"call_id",    required_argument,    0,     'i'},
+    {"call_name",  required_argument,    0,     'n'},
+    {"apn_id",     required_argument,    0,     'a'},
+    {"ip_ver",     required_argument,    0,     'v'},
+    {"reconnect",  required_argument,    0,     'r'},
+    {"default",    no_argument,          0,     'd'},
+    {"help",       no_argument,          0,     'h'},
+    {NULL,         0,                    0,      0 }
+};
+
+#define USAGE_STRING "exec --call_id|i,data call ID\r\n"\
+                     "     [--call_name|n], data call name\r\n"\
+                     "     --apn_id|a, APN ID, range:1-16\r\n"\
+                     "     [--ip_ver|v], IP vresion:4-IPV4,6-IPV6\r\n"\
+                     "     [--reconnect|r] reconnect interval in SEC\r\n"\
+                     "     [--default|d], set to system default network\r\n"\
+                     "exp : exec -a 1 -n test_network -i 4 -d\r\n "
+
+int g_is_default_network = 0;
+int g_call_id = -1;
+
+void usage(void)
+{
+    printf("%s", USAGE_STRING);
+}
+
+void data_call_status_ind_cb(int call_id,
+        QL_NET_DATA_CALL_STATUS_E pre_call_status,
+        ql_data_call_status_t *p_msg)
+{
+    FILE *fp;
+    char cmd_buf[256];
+
+    /** not for this data call */
+    if(call_id != g_call_id)
+    {
+        return;
+    }
+
+    printf("data call status change, form %d to %d\n", pre_call_status, p_msg->call_status);
+    if(p_msg->call_status == QL_NET_DATA_CALL_STATUS_CONNECTED)
+    {
+        printf("call_id     : %d\n", p_msg->call_id);
+        printf("call_name   : %s\n", p_msg->call_name);
+        printf("device_name : %s\n", p_msg->device);
+        if(p_msg->has_addr)
+        {
+            printf("IPV4 addr    : %s\n", p_msg->addr.addr);
+            printf("IPV4 gateway : %s\n", p_msg->addr.gateway);
+            printf("IPV4 netmask : %s\n", p_msg->addr.netmask);
+            printf("IPV4 dnsp    : %s\n", p_msg->addr.dnsp);
+            printf("IPV4 dnss    : %s\n", p_msg->addr.dnss);
+
+            if(g_is_default_network)
+            {
+                /** set system default router */
+                snprintf(cmd_buf, sizeof(cmd_buf), "ip ro add default via %s dev %s",
+                        p_msg->addr.gateway, p_msg->device);
+                system(cmd_buf);
+
+                system("iptables -t filter -F");
+
+                snprintf(cmd_buf, sizeof(cmd_buf), "iptables -t nat -A POSTROUTING -o %s -j MASQUERADE", p_msg->device);
+                system(cmd_buf);
+
+                /** set system dns configuration*/
+                fp = fopen("/tmp/resolv_v4.conf", "w");
+                if(!fp)
+                {
+                    printf("Failed to write resolv file, err=%s\n", strerror(errno));
+                    return;
+                }
+
+                if(p_msg->addr.dnsp[0])
+                {
+                    fprintf(fp, "nameserver %s\n", p_msg->addr.dnsp);
+                }
+
+                if(p_msg->addr.dnss[0])
+                {
+                    fprintf(fp, "nameserver %s\n", p_msg->addr.dnss);
+                }
+                fclose(fp);
+
+                system("echo \"\" > /etc/resolv.conf");
+                if(access("/tmp/resolv_v4.conf", F_OK) == 0)
+                {
+                    system("cat /tmp/resolv_v4.conf >> /etc/resolv.conf");
+                }
+                if(access("/tmp/resolv_v6.conf", F_OK) == 0)
+                {
+                    system("cat /tmp/resolv_v6.conf >> /etc/resolv.conf");
+                }
+            }
+        }
+
+        if(p_msg->has_addr6)
+        {
+            printf("IPV6 addr    : %s\n", p_msg->addr6.addr);
+            printf("IPV6 gateway : %s\n", p_msg->addr6.gateway);
+            printf("IPV6 netmask : %s\n", p_msg->addr6.prefix);
+            printf("IPV6 dnsp    : %s\n", p_msg->addr6.dnsp);
+            printf("IPV6 dnss    : %s\n", p_msg->addr6.dnss);
+
+            if(g_is_default_network)
+            {
+                /** set system default router */
+                snprintf(cmd_buf, sizeof(cmd_buf), "ip -6 ro add default via %s dev %s",
+                        p_msg->addr6.gateway, p_msg->device);
+                system(cmd_buf);
+
+                /** set system dns configuration*/
+                fp = fopen("/tmp/resolv_v6.conf", "w");
+                if(!fp)
+                {
+                    printf("Failed to write resolv file, err=%s\n", strerror(errno));
+                    return;
+                }
+
+                if(p_msg->addr6.dnsp[0])
+                {
+                    fprintf(fp, "nameserver %s\n", p_msg->addr6.dnsp);
+                }
+
+                if(p_msg->addr6.dnss[0])
+                {
+                    fprintf(fp, "nameserver %s\n", p_msg->addr6.dnss);
+                }
+                fclose(fp);
+
+                system("echo \"\" > /etc/resolv.conf");
+                if(access("/tmp/resolv_v4.conf", F_OK) == 0)
+                {
+                    system("cat /tmp/resolv_v4.conf >> /etc/resolv.conf");
+                }
+                if(access("/tmp/resolv_v6.conf", F_OK) == 0)
+                {
+                    system("cat /tmp/resolv_v6.conf >> /etc/resolv.conf");
+                }
+            }
+        }
+    }
+}
+
+
+int main(int argc, char *argv[])
+{
+    int c;
+    int dat;
+    int ret;
+    int opt_idx = 0;
+    int retry_cnt = 0;
+
+    ql_data_call_param_t *p_cfg;
+    int reconnect_interval = 0;
+    int apn_id = -1;
+    int ip_ver = QL_NET_IP_VER_V4;
+    char call_name[128] = "test_network";
+
+    while(1)
+    {
+        c = getopt_long(argc, argv, g_options_short, g_options_long, &opt_idx);
+        if(c==-1)
+        {
+            break;
+        }
+
+        switch(c) {
+            case 'i':
+                g_call_id = atoi(optarg);
+                if(g_call_id < 0)
+                {
+                    printf("Invalid call id : %d", g_call_id);
+                    return -1;
+                }
+                break;
+
+            case 'r':
+                reconnect_interval = atoi(optarg);
+                if(reconnect_interval<=0)
+                {
+                    printf("Invalid reconnect interval : %d\n", reconnect_interval);
+                    return -1;
+                }
+                break;
+
+            case 'n':
+                strncpy(call_name, optarg, sizeof(call_name)-1);
+                break;
+
+            case 'a':
+                apn_id = atoi(optarg);
+                if(apn_id<=0 || apn_id>QL_NET_MAX_APN_ID)
+                {
+                    printf("Invalid apn_id : %d\n", apn_id);
+                    return -1;
+                }
+
+                break;
+            case 'v':
+                dat = atoi(optarg);
+                if(4 == dat)
+                {
+                    ip_ver = QL_NET_IP_VER_V4;
+                }
+                else if(6 == dat)
+                {
+                    ip_ver = QL_NET_IP_VER_V6;
+                }
+                else
+                {
+                    printf("Invalid ip_ver : %d\n", dat);
+                    return -1;
+                }
+                break;
+
+            case 'd':
+                g_is_default_network = 1;
+                break;
+            default:
+                usage();
+                return 0;
+        }
+    }
+
+    if(g_call_id < 0)
+    {
+        usage();
+        return 0;
+    }
+
+    retry_cnt = 20*1000/100; /** timeout : 20S */
+    while(retry_cnt>0)
+    {
+        ret = ql_data_call_init();
+        if(ret == QL_ERR_SERVICE_NOT_READY)
+        {
+            retry_cnt--;
+            usleep(100*1000); /** sleep 100ms */
+	    continue;
+        }
+        break;
+    }
+
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_init, ret=%d", ret);
+        return -1;
+    }
+
+    ql_data_call_set_status_ind_cb(data_call_status_ind_cb);
+
+    ret = ql_data_call_create(g_call_id, call_name, 0);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to create data call, ret=%d\n", ret);
+        return -1;
+    }
+
+    p_cfg = ql_data_call_param_alloc();
+    ql_data_call_param_set_apn_id(p_cfg, apn_id);
+    ql_data_call_param_set_ip_version(p_cfg, ip_ver);
+
+    if(reconnect_interval > 0)
+    {
+        int time_list[2] = {0};
+        time_list[0] = reconnect_interval;
+        ql_data_call_param_set_reconnect_mode(p_cfg, QL_NET_DATA_CALL_RECONNECT_NORMAL);
+        ql_data_call_param_set_reconnect_interval(p_cfg, time_list, sizeof(time_list)/sizeof(time_list[0]));
+    }
+
+    ret = ql_data_call_config(g_call_id, p_cfg);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to config data call, ret=%d", ret);
+        return -1;
+    }
+
+    ret = ql_data_call_start(g_call_id);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to start data call, ret=%d", ret);
+        return -1;
+    }
+
+    while(1)
+    {
+        sleep(10);
+    }
+
+    return 0;
+}
diff --git a/mbtk/test/libql_lib_v2/ql_data_call_multi_data_call_test.c b/mbtk/test/libql_lib_v2/ql_data_call_multi_data_call_test.c
new file mode 100755
index 0000000..35610ca
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_data_call_multi_data_call_test.c
@@ -0,0 +1,320 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file main_apn.c
+  @brief Sample code for multiple data call
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20191127   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <stdint.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include "ql_type.h"
+#include "ql_data_call.h"
+
+#define APN_NAME_PUBLIC    "apnpublic"
+#define APN_NAME_PRIVATE   "apnprivate"
+
+#define DATA_CALL_APN_PUBLIC  3
+#define DATA_CALL_APN_PRIVATE 4
+
+#define DATA_CALL_ID_PUBLIC   1
+#define DATA_CALL_ID_PRIVATE  2
+
+void data_call_status_ind_cb(int call_id,
+        QL_NET_DATA_CALL_STATUS_E pre_call_status,
+        ql_data_call_status_t *p_msg)
+{
+    FILE *fp;
+    char cmd_buf[256];
+
+    /** not for this data call */
+    if(call_id!=DATA_CALL_ID_PUBLIC && call_id!=DATA_CALL_ID_PRIVATE)
+    {
+        return;
+    }
+
+    printf("data call %d:%s status change, form %d to %d\n",
+            call_id, p_msg->call_name, pre_call_status, p_msg->call_status);
+    if(p_msg->call_status == QL_NET_DATA_CALL_STATUS_CONNECTED)
+    {
+        printf("call_id     : %d\n", p_msg->call_id);
+        printf("call_name   : %s\n", p_msg->call_name);
+        printf("device_name : %s\n", p_msg->device);
+        if(p_msg->has_addr)
+        {
+            printf("IPV4 addr    : %s\n", p_msg->addr.addr);
+            printf("IPV4 gateway : %s\n", p_msg->addr.gateway);
+            printf("IPV4 netmask : %s\n", p_msg->addr.netmask);
+            printf("IPV4 dnsp    : %s\n", p_msg->addr.dnsp);
+            printf("IPV4 dnss    : %s\n", p_msg->addr.dnss);
+
+            if(call_id == DATA_CALL_ID_PUBLIC)
+            {
+                /** set system default router */
+                snprintf(cmd_buf, sizeof(cmd_buf), "ip ro add default via %s dev %s",
+                        p_msg->addr.gateway, p_msg->device);
+                system(cmd_buf);
+
+                system("iptables -t filter -F");
+
+                snprintf(cmd_buf, sizeof(cmd_buf), "iptables -t nat -A POSTROUTING -o %s -j MASQUERADE", p_msg->device);
+                system(cmd_buf);
+
+                /** set system dns configuration*/
+                fp = fopen("/tmp/resolv_v4.conf", "w");
+                if(!fp)
+                {
+                    printf("Failed to write resolv file, err=%s\n", strerror(errno));
+                    return;
+                }
+
+                if(p_msg->addr.dnsp[0])
+                {
+                    fprintf(fp, "nameserver %s\n", p_msg->addr.dnsp);
+                }
+
+                if(p_msg->addr.dnss[0])
+                {
+                    fprintf(fp, "nameserver %s\n", p_msg->addr.dnss);
+                }
+                fclose(fp);
+
+                system("echo \"\" > /etc/resolv.conf");
+                if(access("/tmp/resolv_v4.conf", F_OK) == 0)
+                {
+                    system("cat /tmp/resolv_v4.conf >> /etc/resolv.conf");
+                }
+                if(access("/tmp/resolv_v6.conf", F_OK) == 0)
+                {
+                    system("cat /tmp/resolv_v6.conf >> /etc/resolv.conf");
+                }
+            }
+        }
+
+        if(p_msg->has_addr6)
+        {
+            printf("IPV6 addr    : %s\n", p_msg->addr6.addr);
+            printf("IPV6 gateway : %s\n", p_msg->addr6.gateway);
+            printf("IPV6 netmask : %s\n", p_msg->addr6.prefix);
+            printf("IPV6 dnsp    : %s\n", p_msg->addr6.dnsp);
+            printf("IPV6 dnss    : %s\n", p_msg->addr6.dnss);
+
+            if(call_id == DATA_CALL_ID_PUBLIC)
+            {
+                /** set system default router */
+                snprintf(cmd_buf, sizeof(cmd_buf), "ip -6 ro add default via %s dev %s",
+                        p_msg->addr6.gateway, p_msg->device);
+                system(cmd_buf);
+
+                /** set system dns configuration*/
+                fp = fopen("/tmp/resolv_v6.conf", "w");
+                if(!fp)
+                {
+                    printf("Failed to write resolv file, err=%s\n", strerror(errno));
+                    return;
+                }
+
+                if(p_msg->addr6.dnsp[0])
+                {
+                    fprintf(fp, "nameserver %s\n", p_msg->addr6.dnsp);
+                }
+
+                if(p_msg->addr6.dnss[0])
+                {
+                    fprintf(fp, "nameserver %s\n", p_msg->addr6.dnss);
+                }
+                fclose(fp);
+
+                system("echo \"\" > /etc/resolv.conf");
+                if(access("/tmp/resolv_v4.conf", F_OK) == 0)
+                {
+                    system("cat /tmp/resolv_v4.conf >> /etc/resolv.conf");
+                }
+                if(access("/tmp/resolv_v6.conf", F_OK) == 0)
+                {
+                    system("cat /tmp/resolv_v6.conf >> /etc/resolv.conf");
+                }
+            }
+        }
+    }
+}
+
+static void data_call_service_error_cb(int error)
+{
+    if(error == QL_ERR_ABORTED) {
+        printf("RIL service exit!!!\n");
+    }
+}
+
+int main(int argc, char *argv[])
+{
+    int ret = 0;
+    ql_data_call_apn_config_t apn_cfg;
+    ql_data_call_param_t *p_param = NULL;
+    int time_interval_list[20] = {0};
+    int retry_cnt = 20;
+
+    while(retry_cnt > 0)
+    {
+        ret = ql_data_call_init();
+
+        if(ret == QL_ERR_SERVICE_NOT_READY)
+        {
+            sleep(1);
+            retry_cnt --;
+            continue;
+        }
+        break;
+    }
+
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_init, ret=%d\n", ret);
+        return -1;
+    }
+
+    ql_data_call_set_status_ind_cb(data_call_status_ind_cb);
+
+    ql_data_call_set_service_error_cb(data_call_service_error_cb);
+
+    /**
+     * STEP 1: Set LTE default attach APN
+     */
+    memset(&apn_cfg, 0, sizeof(apn_cfg));
+    strncpy(apn_cfg.apn_name, APN_NAME_PRIVATE, sizeof(apn_cfg.apn_name));
+    apn_cfg.ip_ver = QL_NET_IP_VER_V4;
+
+    ret = ql_data_call_set_apn_config(1, &apn_cfg);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_set_apn_config, APN1, ret=%d\n", ret);
+        return -1;
+    }
+
+    /**
+     *  STEP 2: Set APN used by Data call
+     *  APN6 for public network
+     *  APN7 For private network
+     */
+    memset(&apn_cfg, 0, sizeof(apn_cfg));
+    strncpy(apn_cfg.apn_name, APN_NAME_PUBLIC, sizeof(apn_cfg.apn_name));
+    apn_cfg.ip_ver = QL_NET_IP_VER_V4;
+
+    ret = ql_data_call_set_apn_config(DATA_CALL_APN_PUBLIC, &apn_cfg);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_set_apn_config, APN_ID=%d, ret=%d\n", DATA_CALL_APN_PUBLIC, ret);
+        return -1;
+    }
+
+    memset(&apn_cfg, 0, sizeof(apn_cfg));
+    strncpy(apn_cfg.apn_name, APN_NAME_PRIVATE, sizeof(apn_cfg.apn_name));
+    apn_cfg.ip_ver = QL_NET_IP_VER_V4;
+
+    ret = ql_data_call_set_apn_config(DATA_CALL_APN_PRIVATE, &apn_cfg);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_set_apn_config, APN_ID=%d, ret=%d\n", DATA_CALL_APN_PRIVATE, ret);
+        return -1;
+    }
+
+    p_param = ql_data_call_param_alloc();
+    if(p_param == NULL)
+    {
+        printf("Failed to ql_data_call_param_alloc, memory is not enough\n");
+        return -1;
+    }
+
+    /**
+     * STEP 3: create and start data call
+     * Public network data call: call_id=1, call_name=public, APN6
+     * Private network data_call: call_id=2, call_name=private, APN7
+     */
+    ret = ql_data_call_create(DATA_CALL_ID_PUBLIC, "public", 0);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_create, call_id=%d, ret=%d\n", DATA_CALL_ID_PUBLIC, ret);
+        return -1;
+    }
+
+    ql_data_call_param_init(p_param);
+    ql_data_call_param_set_apn_id(p_param, DATA_CALL_APN_PUBLIC);
+    ql_data_call_param_set_ip_version(p_param, QL_NET_IP_VER_V4);
+    ql_data_call_param_set_reconnect_mode(p_param, QL_NET_DATA_CALL_RECONNECT_NORMAL);
+    time_interval_list[0] = 20;
+    ql_data_call_param_set_reconnect_interval(p_param, time_interval_list, 1);
+
+    ret = ql_data_call_config(DATA_CALL_ID_PUBLIC, p_param);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_config, call_id=%d, ret=%d\n", DATA_CALL_ID_PUBLIC, ret);
+        return -1;
+    }
+
+    printf("Start data call : public\n");
+    ret = ql_data_call_start(DATA_CALL_ID_PUBLIC);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_start, call_id=%d, ret=%d\n", DATA_CALL_ID_PUBLIC, ret);
+        return -1;
+    }
+
+    ret = ql_data_call_create(DATA_CALL_ID_PRIVATE, "private", 0);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_create, call_id=%d, ret=%d\n", DATA_CALL_ID_PRIVATE, ret);
+        return -1;
+    }
+
+    ql_data_call_param_init(p_param);
+    ql_data_call_param_set_apn_id(p_param, DATA_CALL_APN_PRIVATE);
+    ql_data_call_param_set_ip_version(p_param, QL_NET_IP_VER_V4);
+    ql_data_call_param_set_reconnect_mode(p_param, QL_NET_DATA_CALL_RECONNECT_NORMAL);
+    time_interval_list[0] = 20;
+    ql_data_call_param_set_reconnect_interval(p_param, time_interval_list, 1);
+
+    ret = ql_data_call_config(DATA_CALL_ID_PRIVATE, p_param);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_config, call_id=%d, ret=%d\n", DATA_CALL_ID_PRIVATE, ret);
+    }
+
+    printf("Start data call : private\n");
+    ret = ql_data_call_start(DATA_CALL_ID_PRIVATE);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_start, call_id=%d, ret=%d\n", DATA_CALL_ID_PRIVATE, ret);
+        return -1;
+    }
+
+    while(1)
+    {
+        sleep(1);
+    }
+
+    return 0;
+}
diff --git a/mbtk/test/libql_lib_v2/ql_data_call_test.c b/mbtk/test/libql_lib_v2/ql_data_call_test.c
new file mode 100755
index 0000000..240ef45
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_data_call_test.c
@@ -0,0 +1,965 @@
+#include <stdio.h>
+#include <string.h>
+#include "ql_type.h"
+#include "ql_data_call.h"
+#include "ql_nslookup.h"
+#include "mbtk_utils.h"
+
+typedef void (*item_handler_f)(void);
+
+typedef struct
+{
+    const char *name;
+    item_handler_f handle;
+} t_item_t;
+
+const char *ql_data_call_state_str(int state)
+{
+    switch(state)
+    {
+        case QL_NET_DATA_CALL_STATUS_NONE:
+            return "NONE";
+        case QL_NET_DATA_CALL_STATUS_CREATED:
+            return "CREATE";
+        case  QL_NET_DATA_CALL_STATUS_IDLE:
+            return "IDLE";
+        case  QL_NET_DATA_CALL_STATUS_CONNECTING:
+            return "CONNECTING";
+        case QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED:
+            return "PARTIAL_V4_CONNECTED";
+        case  QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED:
+            return "PARTIAL_V6_CONNECTED";
+        case QL_NET_DATA_CALL_STATUS_CONNECTED:
+            return "CONNECTED";
+        case  QL_NET_DATA_CALL_STATUS_DISCONNECTED:
+            return "DISCONNECTED";
+        case  QL_NET_DATA_CALL_STATUS_ERROR:
+            return "ERROR";
+        case  QL_NET_DATA_CALL_STATUS_DELETED:
+            return "DELETE";
+        default:
+            break;
+    };
+
+    return "UNKNOW";
+}
+
+
+void data_call_status_ind_cb(int call_id,
+        QL_NET_DATA_CALL_STATUS_E pre_call_status,
+        ql_data_call_status_t *p_msg)
+{
+    printf("----DATA CALL STATUS CHANGE EVENT:\n");
+    printf("\tcall_id=%d\n", call_id);
+    printf("\tpre_call_status=%s\n", ql_data_call_state_str(pre_call_status));
+    printf("\tcall_name=%s\n", p_msg->call_name);
+    printf("\tcall_status=%s\n", ql_data_call_state_str(p_msg->call_status));
+    if(p_msg->device[0])
+    {
+        printf("\tdevice=%s\n", p_msg->device);
+    }
+    if(p_msg->has_addr)
+    {
+        printf("\tIP4 : addr=%s\n", p_msg->addr.addr);
+        printf("\tIP4 : netmask=%s\n", p_msg->addr.netmask);
+        printf("\tIP4 : subnet_bits=%d\n", p_msg->addr.subnet_bits);
+        printf("\tIP4 : gateway=%s\n", p_msg->addr.gateway);
+        printf("\tIP4 : dnsp=%s\n", p_msg->addr.dnsp);
+        printf("\tIP4 : dnss=%s\n", p_msg->addr.dnss);
+    }
+
+    if(p_msg->has_addr6)
+    {
+        printf("\tIP6 : addr=%s\n", p_msg->addr6.addr);
+        printf("\tIP6 : prefix=%s\n", p_msg->addr6.prefix);
+        printf("\tIP6 : prefix_bits=%d\n", p_msg->addr6.prefix_bits);
+        printf("\tIP6 : gateway=%s\n", p_msg->addr6.gateway);
+        printf("\tIP6 : dnsp=%s\n", p_msg->addr6.dnsp);
+        printf("\tIP6 : dnss=%s\n", p_msg->addr6.dnss);
+    }
+
+    printf("\tcall_end_reason_type=%d\n", p_msg->call_end_reason_type);
+    printf("\tcall_end_reason_code=0x%X\n", p_msg->call_end_reason_code);
+}
+
+void data_call_service_error_cb(int error)
+{
+    printf("===== DATACALL Service Abort =====\n");
+}
+
+void item_ql_data_call_init(void)
+{
+    int ret = 0;
+    printf("Start to ql_data_call_init\n");
+    ret = ql_data_call_init();
+    if(ret == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to ql_data_call_init, ret=%d\n", ret);
+    }
+}
+
+void item_ql_data_call_set_service_error_cb(void)
+{
+    int ret = 0;
+    printf("Start to ql_data_call_set_service_error_cb\n");
+    ret = ql_data_call_set_service_error_cb(data_call_service_error_cb);
+    if(ret == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to ql_data_call_set_service_error_cb, ret=%d\n", ret);
+    }
+
+}
+
+void item_ql_data_call_deinit(void)
+{
+    int ret = 0;
+    printf("Start to ql_data_call_deinit\n");
+    ret = ql_data_call_deinit();
+    if(ret == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to ql_data_call_deinit, ret=%d\n", ret);
+    }
+}
+
+void item_ql_data_call_create(void)
+{
+    int ret = 0;
+    int call_id = -1;
+    char call_name[64] = {0};
+    int is_background = 0;
+
+    printf("Please input call_id :");
+    ret = t_get_int(&call_id);
+    if(ret != 0)
+    {
+       printf("Invalid input\n");
+       return;
+    }
+
+    printf("Please input call name :");
+    ret = t_get_string(call_name, sizeof(call_name));
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("Working in background ?[0|1] :");
+    ret = t_get_int(&is_background);
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("call_id=%d\n", call_id);
+    printf("call_name=%s\n", call_name);
+    printf("is_background=%d\n", is_background);
+    printf("Start to ql_data_call_create\n");
+    ret = ql_data_call_create(call_id, call_name, is_background);
+
+    if(ret == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to ql_data_call_create, ret=%d\n", ret);
+    }
+}
+
+void dump_data_call_config(ql_data_call_param_t *pcfg)
+{
+    int ret;
+    int dat;
+    int i;
+    int dat_list[128];
+    int dat_len;
+
+    ret = ql_data_call_param_get_apn_id(pcfg, &dat);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to get apn_id\n");
+        return;
+    }
+
+    printf("apn_id  : %d\n", dat);
+
+    ret = ql_data_call_param_get_ip_version(pcfg, &dat);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to get ip_version\n");
+        return;
+    }
+    printf("ip_version : %d\n", dat);
+
+    ret = ql_data_call_param_get_reconnect_mode(pcfg, &dat);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to get reconnect_mode\n");
+        return;
+    }
+    printf("reconnect_mode : %d\n", dat);
+
+    dat_len = sizeof(dat_list)/sizeof(dat_list[0]);
+    ret = ql_data_call_param_get_reconnect_interval(pcfg, dat_list, &dat_len);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to get reconnect interval\n");
+        return;
+    }
+
+    printf("interval : ");
+    for(i=0; i<dat_len; i++)
+    {
+        if(dat_list[i]==0)
+        {
+            break;
+        }
+        if(i!=0)
+        {
+            printf("%c", ',');
+        }
+        printf("%d", dat_list[i]);
+    }
+    printf("\n");
+}
+
+void item_ql_data_call_config(void)
+{
+    int ret = 0;
+    int call_id;
+    int apn_id;
+    int dat = 0;
+    ql_data_call_param_t *pcfg;
+    int dat_buf[128];
+    int dat_len = sizeof(dat_buf)/sizeof(dat_buf[0]);
+
+    pcfg = ql_data_call_param_alloc();
+    if(pcfg == NULL)
+    {
+
+        printf("Failed to ql_data_call_param_alloc");
+        return;
+    }
+
+    do
+    {
+        printf("Please input call_id :");
+        ret = t_get_int(&call_id);
+        if(ret != 0)
+        {
+            printf("Invalid input\n");
+            ret = -1;
+            break;
+        }
+
+        printf("Please input apn_id :");
+        ret = t_get_int(&apn_id);
+        if(ret != 0)
+        {
+            printf("Invalid input\n");
+            ret = -1;
+            break;
+        }
+
+        if(apn_id<1 || apn_id>QL_NET_MAX_APN_ID)
+        {
+            printf("Invalid apn_id\n");
+            ret = -1;
+            break;
+        }
+
+        ql_data_call_param_set_apn_id(pcfg, apn_id);
+
+        printf("Please input ip_version [1-IPV4,2-IPV6,3-IPV4V6] :");
+        ret = t_get_int(&dat);
+        if(ret < 0)
+        {
+            printf("Invalid input\n");
+            ret = -1;
+            break;
+        }
+
+        if(ret == 0)
+        {
+            if(!IS_QL_NET_IP_VER_VALID(dat))
+            {
+                printf("Unsupport ip_version : %d\n", dat);
+                ret = -1;
+                break;
+            }
+
+            ql_data_call_param_set_ip_version(pcfg, dat);
+        }
+
+        printf("Please input reconnect_mode [0-disable,1-normal,2-mode1,3-mode2] :");
+        ret = t_get_int(&dat);
+        if(ret < 0)
+        {
+            printf("Invalid input\n");
+            ret = -1;
+            break;
+        }
+
+        if(ret == 0)
+        {
+            if(!IS_QL_NET_DATA_CALL_RECONNECT_MODE_VALID(dat))
+            {
+                printf("Unsupport mode : %d\n", dat);
+                ret = -1;
+                break;
+            }
+           ql_data_call_param_set_reconnect_mode(pcfg, dat);
+        }
+
+
+        printf("Please input interval_list [split by ,.:] :");
+        dat_len = sizeof(dat_buf)/sizeof(dat_buf[0]);
+        ret = t_get_int_list(dat_buf, &dat_len);
+        if(ret < 0)
+        {
+            printf("Invalid input\n");
+            ret = -1;
+            break;
+        }
+
+        if(ret == 0)
+        {
+            ql_data_call_param_set_reconnect_interval(pcfg, dat_buf, dat_len);
+        }
+
+        ret = 0;
+    }
+    while(0);
+
+    if(ret == 0)
+    {
+        dump_data_call_config(pcfg);
+        printf("Accept ? [Y|N] :");
+        ret = t_get_char(&dat);
+        if(ret < 0)
+        {
+            printf("Invalid input\n");
+        }
+        else
+        {
+            if(ret==1 || dat=='Y' || dat=='y')
+            {
+                printf("Start to ql_data_call_config\n");
+                ret = ql_data_call_config(call_id, pcfg);
+                if(ret != QL_ERR_OK)
+                {
+                    printf("Failed to ql_data_call_config, ret=%d\n", ret);
+                }
+                else
+                {
+                    printf("Successful\n");
+                }
+            }
+            else
+            {
+                printf("Skip ql_data_call_config");
+            }
+        }
+    }
+
+    ql_data_call_param_free(pcfg);
+}
+
+
+void item_ql_data_call_get_config(void)
+{
+    int ret = 0;
+    int call_id;
+    ql_data_call_param_t *pcfg;
+
+    pcfg = ql_data_call_param_alloc();
+    if(pcfg == NULL)
+    {
+
+        printf("Failed to ql_data_call_param_alloc");
+        return;
+    }
+
+    do
+    {
+        printf("Please input call_id :");
+        ret = t_get_int(&call_id);
+        if(ret != 0)
+        {
+            printf("Invalid input\n");
+            ret = -1;
+            break;
+        }
+
+        ret = ql_data_call_get_config(call_id, pcfg);
+        if(ret != QL_ERR_OK)
+        {
+            printf("Failed to ql_data_call_get_config, ret=%d\n", ret);
+            ret = -1;
+            break;
+        }
+
+        printf("Successful\n");
+
+        dump_data_call_config(pcfg);
+    } while(0);
+
+    ql_data_call_param_free(pcfg);
+}
+
+void item_ql_data_call_start(void)
+{
+    int ret = 0;
+    int call_id = -1;
+
+    printf("Please input call_id :");
+    ret = t_get_int(&call_id);
+    if(ret != 0)
+    {
+       printf("Invalid input\n");
+       return;
+    }
+
+    printf("Start to ql_data_call_start, data_call=%d\n", call_id);
+    ret = ql_data_call_start(call_id);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_start, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+void item_ql_data_call_stop(void)
+{
+    int ret = 0;
+    int call_id = -1;
+
+    printf("Please input call_id :");
+    ret = t_get_int(&call_id);
+    if(ret != 0)
+    {
+       printf("Invalid input\n");
+       return;
+    }
+
+    printf("Start to ql_data_call_stop, data_call=%d\n", call_id);
+    ret = ql_data_call_stop(call_id);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_stop, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+void item_ql_data_call_delete(void)
+{
+    int ret = 0;
+    int call_id = -1;
+
+    printf("Please input call_id :");
+    ret = t_get_int(&call_id);
+    if(ret != 0)
+    {
+       printf("Invalid input\n");
+       return;
+    }
+
+    printf("Start to ql_data_call_delete, data_call=%d\n", call_id);
+    ret = ql_data_call_delete(call_id);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_delete, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+void item_ql_data_call_get_list(void)
+{
+    int i;
+    int ret = 0;
+    ql_data_call_item_t item_list[20];
+    int list_len = ARRAY_SIZE(item_list);
+
+    memset(item_list,0,sizeof(ql_data_call_item_t)*20);
+    printf("Start to ql_data_call_get_list\n");
+    ret = ql_data_call_get_list(item_list, &list_len);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_get_list, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Successful, instance_num=%d\n", list_len);
+        for(i=0; i<list_len; i++)
+        {
+            printf("%d\t%d\t%s\n", i, item_list[i].call_id, item_list[i].call_name);
+        }
+    }
+}
+
+void  item_ql_data_call_get_status(void)
+{
+    int ret = 0;
+    int call_id;
+    ql_data_call_status_t sta = {0};
+
+    printf("Please input call_id :");
+    ret = t_get_int(&call_id);
+    if(ret != 0)
+    {
+       printf("Invalid input\n");
+       return;
+    }
+
+    printf("Start to ql_data_call_get_status\n");
+    ret = ql_data_call_get_status(call_id, &sta);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_get_status, ret=%d\n", ret);
+        return;
+    }
+
+    printf("Successful\n");
+    printf("call_id : %d\n", sta.call_id);
+    printf("call_name : %s\n", sta.call_name);
+    printf("call_status : %s\n", ql_data_call_state_str(sta.call_status));
+
+    if(sta.device[0])
+    {
+        printf("device : %s\n", sta.device);
+    }
+
+    if(sta.has_addr)
+    {
+        printf("\tip4 ip      : %s\n", sta.addr.addr);
+        printf("\tip4 netmask : %s\n", sta.addr.netmask);
+        printf("\tip4 subnet_bits : %d\n", sta.addr.subnet_bits);
+        printf("\tip4 gateway : %s\n", sta.addr.gateway);
+        printf("\tip4_dnsp    : %s\n", sta.addr.dnsp);
+        printf("\tip4_dnss    : %s\n", sta.addr.dnss);
+    }
+
+    if(sta.has_addr6)
+    {
+        printf("\tip6 ip      : %s\n", sta.addr6.addr);
+        printf("\tip6 prefix  : %s\n", sta.addr6.prefix);
+        printf("\tip6 prefix_bits : %d\n", sta.addr6.prefix_bits);
+        printf("\tip6 gatway      : %s\n", sta.addr6.gateway);
+        printf("\tip6 dnsp    : %s\n", sta.addr6.dnsp);
+        printf("\tip6 dnss    : %s\n", sta.addr6.dnss);
+    }
+
+    printf("call_end_reason_type : %d\n", sta.call_end_reason_type);
+    printf("call_end_reason_code : 0x%X\n", sta.call_end_reason_code);
+}
+
+void item_ql_data_call_set_status_ind_cb(void)
+{
+    int ret;
+
+    printf("Start to ql_data_call_set_status_ind_cb\n");
+    ret = ql_data_call_set_status_ind_cb(data_call_status_ind_cb);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_set_status_ind_cb, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+void dump_apn_cfg(ql_data_call_apn_config_t *p_cfg)
+{
+    printf("ip_version : %d\n", p_cfg->ip_ver);
+    printf("auth_pref : %d\n", p_cfg->auth_pref);
+    printf("apn_name  : %s\n", p_cfg->apn_name);
+    printf("username  : %s\n", p_cfg->username);
+    printf("password  : %s\n", p_cfg->password);
+}
+
+void item_ql_data_call_set_apn_config(void)
+{
+    int ret;
+    int dat;
+    int apn_id = 0;
+    ql_data_call_apn_config_t cfg = {0};
+
+    printf("Start to item_ql_data_call_set_apn_config\n");
+
+    printf("Please input apn_id :");
+    ret = t_get_int(&apn_id);
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(apn_id<1 || apn_id>16)
+    {
+        printf("Invalid apn_id : %d\n", apn_id);
+        return;
+    }
+
+    printf("Please input auth_pref [0-NONE,1-PAP,2-CHAP,3-PAP&CHAP] :");
+    ret = t_get_int(&dat);
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(ret == 0)
+    {
+        if(!IS_QL_NET_AUTH_PREF_VALID(dat))
+        {
+            printf("Unspport auth_pref : %d\n", dat);
+            return;
+        }
+
+        cfg.auth_pref = dat;
+    }
+
+    printf("Please input ip_version [1-IPV4,2-IPV6,3-IPV4V6] :");
+    ret = t_get_int(&dat);
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(ret == 0)
+    {
+        if(!IS_QL_NET_IP_VER_VALID(dat))
+        {
+            printf("Unsupport ip_version : %d\n", dat);
+            return;
+        }
+
+        cfg.ip_ver = dat;
+    }
+
+    printf("Please input apn_name :");
+    ret = t_get_string(cfg.apn_name, sizeof(cfg.apn_name));
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("Please input username :");
+    ret = t_get_string(cfg.username, sizeof(cfg.username));
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("Please input password :");
+    ret = t_get_string(cfg.password, sizeof(cfg.password));
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("apn_id : %d", apn_id);
+    dump_apn_cfg(&cfg);
+
+    ret = ql_data_call_set_apn_config(apn_id, &cfg);
+
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_set_apn_config, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+void item_ql_data_call_get_apn_config(void)
+{
+    int ret;
+    int apn_id = 0;
+    ql_data_call_apn_config_t cfg = {0};
+
+    printf("Start to item_ql_data_call_get_apn_config\n");
+
+    printf("Please input apn_id :");
+    ret = t_get_int(&apn_id);
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(apn_id<1 || apn_id>16)
+    {
+        printf("Invalid apn_id : %d\n", apn_id);
+        return;
+    }
+
+    ret = ql_data_call_get_apn_config(apn_id, &cfg);
+
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_set_apn_config, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Successful\n");
+        printf("apn_id : %d\n", apn_id);
+        dump_apn_cfg(&cfg);
+    }
+}
+
+#if 0
+void item_ql_nslookup(void)
+{
+    printf("start ql_nslookup\n");
+    int i;
+    int ret = 0;
+    char ip_str[128];
+    char ip_family[5];
+    char hostname[64];
+    char dns_server_ip[20];
+    QUERY_IP_TYPE ip_type;
+    hostaddr_info_u resolved_addr;
+
+    memset(ip_str, 0, sizeof(ip_str));
+    memset(ip_family, 0, sizeof(ip_family));
+    memset(hostname, 0, sizeof(hostname));
+    memset(dns_server_ip, 0, sizeof(dns_server_ip));
+
+    printf("please input domain name: ");
+    ret = t_get_string(hostname, sizeof(hostname));
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("please input dns ip address: ");
+    ret = t_get_string(dns_server_ip, sizeof(dns_server_ip));
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("please input ipfamily(v4/v6): ");
+    ret = t_get_string(ip_family, sizeof(ip_family));
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(0 == strcmp(ip_family, "v4"))
+    {
+        ip_type = QUERY_IPV4_E;
+    }
+    else if(0 == strcmp(ip_family, "v6"))
+    {
+        ip_type = QUERY_IPV6_E;
+    }
+    else
+    {
+        printf("Invalid ip type\n");
+        return;
+    }
+
+
+    ql_nslookup(hostname, dns_server_ip, ip_type, &resolved_addr);
+
+    //printf resolved addr
+    for (i = 0; i < resolved_addr.addr_cnt; i++) {
+         inet_ntop(AF_INET, &resolved_addr.addr[i].s_addr, ip_str, sizeof(ip_str));
+         printf("%s has IPv4 address : %s\n", hostname, ip_str);
+    }
+
+    for (i = 0; i < resolved_addr.addr6_cnt; i++) {
+         inet_ntop(AF_INET6, &resolved_addr.addr6[i].s6_addr, ip_str, sizeof(ip_str));
+         printf("%s has IPv6 address : %s\n", hostname, ip_str);
+    }
+
+    return;
+}
+#endif
+
+void item_ql_data_call_set_attach_apn_config(void)
+{
+    int ret;
+    int dat;
+    ql_data_call_apn_config_t cfg = {0};
+
+    printf("Start to item_ql_data_call_set_attach_apn_config,apn id is 1\n");
+    printf("Please input auth_pref [0-NONE,1-PAP,2-CHAP,3-PAP&CHAP] :");
+    ret = t_get_int(&dat);
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(ret == 0)
+    {
+        if(!IS_QL_NET_AUTH_PREF_VALID(dat))
+        {
+            printf("Unspport auth_pref : %d\n", dat);
+            return;
+        }
+
+        cfg.auth_pref = dat;
+    }
+
+    printf("Please input ip_version [1-IPV4,2-IPV6,3-IPV4V6] :");
+    ret = t_get_int(&dat);
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(ret == 0)
+    {
+        if(!IS_QL_NET_IP_VER_VALID(dat))
+        {
+            printf("Unsupport ip_version : %d\n", dat);
+            return;
+        }
+
+        cfg.ip_ver = dat;
+    }
+
+    printf("Please input apn_name :");
+    ret = t_get_string(cfg.apn_name, sizeof(cfg.apn_name));
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("Please input username :");
+    ret = t_get_string(cfg.username, sizeof(cfg.username));
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+
+    printf("Please input password :");
+    ret = t_get_string(cfg.password, sizeof(cfg.password));
+    if(ret < 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+    dump_apn_cfg(&cfg);
+
+    ret = ql_data_call_set_attach_apn_config(&cfg);
+
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_data_call_set_apn_config, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+static t_item_t ql_data_call_items[] =
+{
+    {"ql_data_call_init", item_ql_data_call_init},
+    {"ql_data_call_create", item_ql_data_call_create},
+    {"ql_data_call_config",item_ql_data_call_config},
+    {"ql_data_call_get_config",item_ql_data_call_get_config},
+    {"ql_data_call_start", item_ql_data_call_start},
+    {"ql_data_call_stop", item_ql_data_call_stop},
+    {"ql_data_call_delete", item_ql_data_call_delete},
+    {"ql_data_call_get_list", item_ql_data_call_get_list},
+    {"ql_data_call_get_status", item_ql_data_call_get_status},
+    {"ql_data_call_set_status_ind_cb", item_ql_data_call_set_status_ind_cb},
+    {"ql_data_call_set_apn_config", item_ql_data_call_set_apn_config},
+    {"ql_data_call_get_apn_config", item_ql_data_call_get_apn_config},
+    {"ql_data_call_set_service_error_cb", item_ql_data_call_set_service_error_cb},
+    {"ql_data_call_deinit", item_ql_data_call_deinit},
+//    {"ql_nslookup",item_ql_nslookup},
+    {"ql_data_call_set_attach_apn_config", item_ql_data_call_set_attach_apn_config}
+};
+
+static void help()
+{
+    int i = 0;
+    printf("Test Items:\n");
+    while(i < ARRAY_SIZE(ql_data_call_items)) {
+        printf("%d : %s\n", i, ql_data_call_items[i].name);
+        i++;
+    }
+    printf(":");
+}
+
+int main(int argc, char *argv[])
+{
+    char cmd[1024];
+    help();
+    while(1)
+    {
+        memset(cmd, 0, sizeof(cmd));
+        if(fgets(cmd, sizeof(cmd), stdin))
+        {
+            char *ptr = cmd + strlen(cmd) - 1;
+            while(ptr >= cmd && (*ptr == '\r' || *ptr == '\n'))
+            {
+                *ptr-- = '\0';
+            }
+
+            if(strlen(cmd) > 0) {
+                if(isdigit(cmd[0])) {
+                    int item = atoi(cmd);
+                    if(item >= 0 && item < ARRAY_SIZE(ql_data_call_items)) {
+                        ql_data_call_items[item].handle();
+                    }
+                }
+                else if(!strcasecmp(cmd, "h")) {
+                    help();
+                }
+                else if(!strcasecmp(cmd, "q")) {
+                    break;
+                }
+            }
+            else {
+                printf("\n");
+            }
+        }
+    }
+    return 0;
+}
+
+
+
diff --git a/mbtk/test/libql_lib_v2/ql_dm_test.c b/mbtk/test/libql_lib_v2/ql_dm_test.c
new file mode 100755
index 0000000..409c460
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_dm_test.c
@@ -0,0 +1,553 @@
+

+#include <stdio.h>

+#include <string.h>

+#include <stdlib.h>

+#include <unistd.h>

+#include <ctype.h>

+#include <stdio.h>

+#include <sys/time.h>

+

+#include "ql_v2/ql_type.h"

+#include "ql_dm.h"

+

+

+
+#define T_ARRAY_SIZE(items) (sizeof(items)/sizeof(items[0]))

+

+typedef void (*item_handler_f)(void);
+typedef int (*init_handler_f)(void);
+typedef int (*deinit_handler_f)(void);
+
+

+
+typedef struct
+{
+    const char *name;
+    item_handler_f handle;
+} t_item_t;
+
+typedef struct
+{
+    const char *name;
+    int item_len;
+    t_item_t *item_list;
+} t_module_t;
+

+typedef struct
+{
+    const char *name;
+    init_handler_f init_handle;
+    deinit_handler_f deinit_handle;
+} t_init_t;

+

+int t_get_int(int *val)

+{

+    int dat;

+    char *ptr_end = NULL;

+    char buf[256] = {0};

+

+    if(NULL == fgets(buf, sizeof(buf)-1, stdin))

+    {

+        return -1;

+    }

+

+    if(0 == buf[0])

+    {

+        return -1;

+    }

+

+    if(buf[0] == '\n')

+    {

+        return 1;

+    }

+

+    dat = strtol(buf, &ptr_end, 10);

+    if(ptr_end!=NULL && ptr_end[0]!='\n')

+    {

+        return -1;

+    }

+

+    if(val)

+    {

+        val[0] = dat;

+    }

+

+    return 0;

+}

+

+

+static int internal_dm_get_air_plane_mode(QL_DM_AIR_PLANE_MODE_TYPE_E mode, char* buf, int buf_len);

+

+

+void dm_air_plane_mode_event_ind_cb(QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode)

+{

+    char mode_info[16] = {0};

+

+    printf("Recv event indication : air plane mode changed event\n");

+

+    if(internal_dm_get_air_plane_mode(air_plane_mode, mode_info, sizeof(mode_info)) == 0)

+    {

+        printf("unrecognized air plane mode:%d\n", air_plane_mode);

+    }

+    else

+    {

+        printf("current air plane mode is %s\n", mode_info);

+    }

+}

+

+void dm_modem_state_change_ind_cb(int modem_state)

+{

+    printf("Recv event indication : modem status changed event\n");

+    if(QL_DM_MODEM_STATE_ONLINE == modem_state)

+    {

+        printf("current modem status is ONLINE\n");

+    }

+    else if(QL_DM_MODEM_STATE_OFFLINE == modem_state)

+    {

+        printf("current modem status is OFFLINE\n");

+    }

+    else

+    {

+        printf("current modem status is UNKNOWN\n");

+    }

+}

+

+void dm_service_error_cb(int error)

+{

+    printf("===== DM Service Abort =====\n");

+}

+

+void item_ql_dm_init(void)

+{

+    int ret = 0;

+

+    printf("Start to ql_dm_init: ");

+    ret = ql_dm_init();

+    if(ret == QL_ERR_OK)

+    {

+        printf("dm init ok\n");

+    }

+    else

+    {

+        printf("failed, ret=%d\n", ret);

+    }

+}

+

+void item_ql_dm_set_service_error_cb(void)

+{

+    int ret = 0;

+

+    printf("Start to item_ql_dm_set_service_error_cb : ");

+    ret = ql_dm_set_service_error_cb(dm_service_error_cb);

+    if(ret != QL_ERR_OK)

+    {

+        printf("failed, ret=%d\n", ret);

+    }

+    else

+    {

+        printf("successful\n");

+    }

+}

+

+void item_ql_dm_deinit(void)

+{

+    int ret = 0;

+

+    printf("Start to ql_dm_deinit: ");

+    ret = ql_dm_deinit();

+    if(ret == QL_ERR_OK)

+    {

+        printf("dm deinit ok\n");

+    }

+    else

+    {

+        printf("failed, ret=%d\n", ret);

+    }

+}

+

+void item_ql_dm_set_air_plane_mode_ind_cb(void)

+{

+    int ret = 0;

+    int reg_flag = 0;

+

+    printf("please input air plane mode reg option: (0: unreg, other: reg): ");

+    ret = t_get_int(&reg_flag);

+    if(ret != 0)

+    {

+        printf("Invalid input\n");

+        return;

+    }

+

+    if(reg_flag)

+    {

+        ret = ql_dm_set_air_plane_mode_ind_cb(dm_air_plane_mode_event_ind_cb);

+    }

+    else

+    {

+        ret = ql_dm_set_air_plane_mode_ind_cb(NULL);

+    }

+    printf("ql_dm_set_air_plane_mode_ind_cb ret = %d\n", ret);

+}

+

+void item_ql_dm_get_software_version(void)

+{

+    int ret;

+    char soft_ver[128] = {0};

+

+    ret = ql_dm_get_software_version(soft_ver, sizeof(soft_ver));

+

+    printf("ql_dm_get_software_version ret = %d, software version is %s\n", ret, soft_ver);

+}

+

+void item_ql_dm_set_modem_state_change_ind_cb(void)

+{

+    int ret = 0;

+    int reg_flag = 0;

+

+    printf("please input modem state reg option: (0: unreg, other: reg): ");

+    ret = t_get_int(&reg_flag);

+    if(ret != 0)

+    {

+        printf("Invalid input\n");

+        return;

+    }

+

+    if(reg_flag)

+    {

+        ret = ql_dm_set_modem_state_change_ind_cb(dm_modem_state_change_ind_cb);

+    }

+    else

+    {

+        ret = ql_dm_set_modem_state_change_ind_cb(NULL);

+    }

+    printf("ql_dm_set_modem_state_change_ind_cb ret = %d\n", ret);

+}

+

+void item_ql_dm_get_device_serial_numbers(void)

+{

+    int ret;

+    ql_dm_device_serial_numbers_info_t t_info;

+    memset(&t_info, 0, sizeof(ql_dm_device_serial_numbers_info_t));

+

+    ret = ql_dm_get_device_serial_numbers(&t_info);

+    printf("ql_dm_get_device_serial_number ret = %d", ret);

+    if(t_info.imei_valid)

+    {

+        printf(", imei is %s", t_info.imei);

+    }

+    if(t_info.imei2_valid)

+    {

+        printf(", imei2 is %s", t_info.imei2);

+    }

+    if(t_info.meid_valid)

+    {

+        printf(", meid is %s ", t_info.meid);

+    }

+    printf("\n");

+}

+

+void item_ql_dm_get_device_firmware_rev_id(void)

+{

+    int ret;

+    char firmware_rev_id[QL_DM_FIRMWARE_REV_MAX_LEN + 1] = {0};

+

+    ret = ql_dm_get_device_firmware_rev_id(firmware_rev_id, sizeof(firmware_rev_id));

+    printf("ql_dm_get_device_firmware_rev_id ret = %d, device revision id is %s\n",

+            ret, firmware_rev_id);

+}

+

+void item_ql_dm_get_air_plane_mode(void)

+{

+    int ret;

+    char mode_info[16] = {0};

+    QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode;

+

+    ret = ql_dm_get_air_plane_mode(&air_plane_mode);

+

+    printf("ql_dm_get_air_plane_mode ret = %d, ", ret);

+    if(internal_dm_get_air_plane_mode(air_plane_mode, mode_info, sizeof(mode_info)) == 0)

+    {

+        printf("unrecognized air plane mode:%d\n", air_plane_mode);

+    }

+    else

+    {

+        printf("current air plane mode is %s\n", mode_info);

+    }

+}

+

+void item_ql_dm_set_air_plane_mode(void)

+{

+    int ret;

+    int mode;

+    QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode;

+

+    printf("please input air plane mode(1: ON, 2: OFF): ");

+    ret = t_get_int(&mode);

+    if(ret != 0)

+    {

+        printf("Invalid input\n");

+        return;

+    }

+    air_plane_mode = mode;

+    if(air_plane_mode != QL_DM_AIR_PLANE_MODE_ON && air_plane_mode != QL_DM_AIR_PLANE_MODE_OFF)

+    {

+        printf("please input 1 or 2\n");

+        return;

+    }

+

+    ret = ql_dm_set_air_plane_mode(air_plane_mode);

+    printf("ql_dm_set_air_plane_mode ret = %d\n", ret);

+}

+

+static int internal_dm_get_air_plane_mode(QL_DM_AIR_PLANE_MODE_TYPE_E mode, char* buf, int buf_len)

+{

+    int ret_val = 1;

+

+    if(buf == NULL || buf_len < 2)

+    {

+        printf("param is valid\n");

+        return 0;

+    }

+

+    memset(buf, 0, buf_len);

+

+    switch(mode)

+    {

+        case QL_DM_AIR_PLANE_MODE_UNKNOWN:

+            strncpy(buf, "UNKNOWN", buf_len - 1);

+            buf[buf_len - 1] = '\0';

+            break;

+        case QL_DM_AIR_PLANE_MODE_ON:

+            strncpy(buf, "ON", buf_len - 1);

+            buf[buf_len - 1] = '\0';

+            break;

+        case QL_DM_AIR_PLANE_MODE_OFF:

+            strncpy(buf, "OFF", buf_len - 1);

+            buf[buf_len - 1] = '\0';

+            break;

+        case QL_DM_AIR_PLANE_MODE_NA:

+            strncpy(buf, "UNAVAILABLE", buf_len - 1);

+            buf[buf_len - 1] = '\0';

+            break;

+        default:

+            ret_val = 0;

+            break;

+    }

+    return ret_val;

+}

+

+

+static t_item_t ql_dm_items[] =

+{

+    {"ql_dm_init", item_ql_dm_init},

+    {"ql_dm_set_air_plane_mode_ind_cb", item_ql_dm_set_air_plane_mode_ind_cb},

+    {"ql_dm_get_software_version", item_ql_dm_get_software_version},

+    {"ql_dm_set_modem_state_change_ind_cb", item_ql_dm_set_modem_state_change_ind_cb},

+    {"ql_dm_get_device_serial_numbers", item_ql_dm_get_device_serial_numbers},

+    {"ql_dm_get_device_firmware_rev_id", item_ql_dm_get_device_firmware_rev_id},

+    {"ql_dm_get_air_plane_mode", item_ql_dm_get_air_plane_mode},

+    {"ql_dm_set_air_plane_mode", item_ql_dm_set_air_plane_mode},

+    {"ql_dm_set_service_error_cb", item_ql_dm_set_service_error_cb},

+    {"ql_dm_deinit",         item_ql_dm_deinit}

+};

+

+t_module_t ql_dm_module =

+{

+    "dm",

+    T_ARRAY_SIZE(ql_dm_items),

+    ql_dm_items

+};

+

+

+t_module_t *test_modules[] =

+{

+    &ql_dm_module,

+

+};

+

+void dump_modules(void)

+{

+    int i;

+

+    printf("\n");

+    for(i=0; i<T_ARRAY_SIZE(test_modules); i++)

+    {

+        printf("%d\t%s\n", i, test_modules[i]->name);

+    }

+    printf("-1\texit\n");

+}

+

+void dump_items(t_module_t *m)

+{

+    int i;

+

+    printf("\n");

+    printf("The current module is: \n");

+

+    for(i=0; i<m->item_len; i++)

+    {

+        printf("%d\t%s\n", i, m->item_list[i].name);

+    }

+    printf("-1\texit\n");

+}

+

+void enter_modules(t_module_t *m)

+{

+    int ret;

+    int idx;

+

+    dump_items(m);

+

+    while(1)

+    {

+        printf("Please enter your choice: ");

+        ret = t_get_int(&idx);

+        printf("\n");

+        if(ret < 0)

+        {

+            printf("Invalid input\n");

+            continue;

+        }

+        else if(ret == 1)

+        {

+            dump_items(m);

+            continue;

+        }

+

+        if(idx == -1)

+        {

+            break;

+        }

+

+        if(idx<0 || idx>=m->item_len)

+        {

+            printf("Not support idx: %d\n", idx);

+            continue;

+        }

+

+        printf("->Item : %s\n", m->item_list[idx].name);

+        m->item_list[idx].handle();

+    }

+}

+

+ static t_init_t init_func[] = {

+     {"ql_dm_init",ql_dm_init,ql_dm_deinit},

+

+

+};

+

+

+void test_init(int retry)

+{

+

+    int i = 0,j = 0;

+    for(i=0; i<T_ARRAY_SIZE(init_func); i++)

+    {

+        printf("Exec %s time = \n", init_func[i].name);

+        //clock_t start,end;

+        struct timeval start,end;

+

+        double cost_time = 0;

+        int ret = QL_ERR_OK;

+        for(j = 0;j < retry; j++)

+        {

+            if(QL_ERR_OK == ret )

+            {

+                //start = clock();

+                gettimeofday(&start, NULL);

+            }

+

+            ret = -1;

+            ret = init_func[i].init_handle();

+            if(QL_ERR_OK == ret)

+            {

+                //end = clock();

+                gettimeofday(&end, NULL);

+                long timeuse = 1000000*(end.tv_sec - start.tv_sec) + end.tv_usec-start.tv_usec;

+                //printf("%6.0f ",(double)(end-start));

+                printf("%ld ",timeuse/1000);

+                //cost_time = cost_time > (end-start) ?cost_time:(end-start);

+                cost_time = cost_time > (timeuse/1000) ?cost_time:(timeuse/1000);

+

+                init_func[i].deinit_handle();

+            }

+

+

+        }

+        printf("\n");

+        printf("Finish test. %s  max cost time = %6.0f ms\n",init_func[i].name, cost_time);

+

+    }

+

+

+}

+

+

+int main(int argc, char *argv[])

+{

+    int ret;

+    int idx;

+

+    if(argc > 1)

+    {

+      int c = -1;

+      int retry = -1;

+

+      while((c = getopt(argc, argv, "i:")) != -1)

+      {

+          if(-1 == c)

+          {

+              break;

+          }

+

+          switch(c)

+          {

+              case 'i':

+                  retry = atoi(optarg);

+                  test_init(retry);

+                  return 0;

+

+              default:

+                  printf("usage: ql_sdk_api_test -i  <retry count> to test init func\n");

+                  printf("       ql_sdk_api_test  to test sdk api\n");

+                  return -1;

+          }

+      }

+    }

+

+

+    dump_modules();

+

+    while(1)

+    {

+        printf("Please enter your choice: ");

+        ret = t_get_int(&idx);

+        printf("\n");

+        if(ret < 0)

+        {

+            printf("Invalid input\n");

+            continue;

+        }

+        else if(ret == 1)

+        {

+            dump_modules();

+            continue;

+        }

+

+        if(idx == -1)

+        {

+            break;

+        }

+

+        if(idx<0 || idx>=T_ARRAY_SIZE(test_modules))

+        {

+            printf("Not support idx: %d\n", idx);

+            continue;

+        }

+

+        enter_modules(test_modules[idx]);

+    }

+

+    return 0;

+}

+

diff --git a/mbtk/test/libql_lib_v2/ql_ecall_test.c b/mbtk/test/libql_lib_v2/ql_ecall_test.c
new file mode 100755
index 0000000..0ad1113
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_ecall_test.c
@@ -0,0 +1,1025 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <ctype.h>
+
+#include "ql_type.h"
+#include "ql_ms_voice.h"
+#include "ql_ecall.h"
+#include "mbtk_utils.h"
+
+typedef void (*item_handler_f)(void);
+
+typedef struct
+{
+    const char *name;
+    item_handler_f handle;
+} t_item_t;
+
+void item_ql_ecall_set_test_number(void)
+{
+    int ret = 0;
+    int sim_id;
+
+    char test_number[QL_VOICE_MAX_PHONE_NUMBER];
+
+    printf("test ql_voice_ecall_set_test_number: ");
+
+    printf("please enter test number: ");
+    char* find = NULL;
+
+    if(NULL == fgets(test_number, QL_VOICE_MAX_PHONE_NUMBER-1, stdin))
+        return;
+    find = strchr(test_number, '\n');
+    if(find)
+    {
+        *find = '\0';
+    }
+
+    printf("please enter the sim_id: ");
+
+    if(1 != scanf("%u", &sim_id))
+        return;
+    getchar();
+    printf("sim_id is %u\n", sim_id);
+
+    ret = ql_ecall_set_test_number(sim_id, test_number);
+
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_ecall_reset_ivs(void)
+{
+    int ret = 0;
+    int sim_id;
+
+    printf("please enter the sim_id: ");
+
+    if(1 != scanf("%u", &sim_id))
+        return;
+    getchar();
+    printf("sim_id is %u\n", sim_id);
+
+    ret = ql_ecall_reset_ivs(sim_id);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void fast_ecall_dial(void){
+    int ret = 0, v = 0;
+    ql_voice_ecall_info_t *p_info = NULL;
+    char *find = NULL;
+    uint32_t id;
+    int sim_id;
+
+    p_info = (ql_voice_ecall_info_t *)calloc(1, sizeof(*p_info));
+    if (NULL  == p_info)
+    {
+        printf("run out of memory\n");
+        return;
+    }
+
+    printf("please enter the sim_id: ");
+    if(1 != scanf("%d", &sim_id))
+        return;
+    getchar();
+
+    if(!QL_IS_SIM_VALID(sim_id))
+    {
+        printf("invalid sim_id\n");
+        free(p_info);
+        p_info = NULL;
+        return;
+    }
+
+    printf("sim_id is %d\n", sim_id);
+
+    printf("example MSD: 01 04 a9 81 d5 49 70 d6 5c 35 97 ca 04 20 c4 14 60 "
+        "0b be 5f 7e b1 4b a6 ee 10 4f c5 27 03 c1 80 q\n");
+    printf("please enter MSD(at most 140 hex), end with 'q': ");
+    while (1 == scanf("%x", &v))
+    {
+        p_info->msd[p_info->msd_len++] = v;
+    }
+    getchar();  // read `q'
+    getchar();  // read '\n'
+
+    printf("MSD ========[");
+    for(v = 0; v < p_info->msd_len; v ++)
+    {
+        printf("%02x ", p_info->msd[v]);
+    }
+    printf("]\n");
+
+    if (p_info->msd_len > QL_VOICE_MAX_ECALL_MSD)
+    {
+        printf("MSD too long\n");
+        free(p_info);
+        p_info = NULL;
+        return;
+    }
+
+    printf("please enter eCall type(1 - test, 2 - emergency,  3 - reconfig): ");
+    if(1 != scanf("%d", (int *)&p_info->type))
+        return;
+    getchar();
+
+    printf("please enter test number(emergency ecall should be empty): ");
+    find = NULL;
+    if(NULL == fgets(p_info->test_number, sizeof(p_info->test_number)-1, stdin))
+        return;
+    find = strchr(p_info->test_number, '\n');
+    if(find)
+    {
+        *find = '\0';
+    }
+
+    printf("how to trigger eCall(0 - manual, 1 - auto): ");
+    if(1 != scanf("%d", &p_info->auto_trigger))
+        return;
+    getchar();
+
+    ret = ql_ecall_dial(sim_id, p_info, &id);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok, call_id is %u\n", id);
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+
+    free(p_info);
+    p_info = NULL;
+}
+
+void item_ql_ecall_dial(void)
+{
+    printf("test ql_voice_ecall_dial: \n");
+    printf("Is fast ecall? (1 - yes, other - wrong): ");
+    int is_fast;
+    scanf("%d", &is_fast);
+    getchar();
+
+    if(is_fast == 1){
+        printf("Dialling fast ecall\n");
+        fast_ecall_dial();
+    }else{
+        printf("Wrong arguments\n");
+    }
+}
+
+void item_ql_ecall_hangup(void)
+{
+    int ret = 0;
+//    int sim_id;
+
+    printf("test ql_voice_ecall_hangup: \n");
+    ret = ql_ecall_hangup();
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_ecall_update_msd_raw(void)
+{
+    int ret = 0, v = 0;
+    uint32_t msd_len = 0;
+    char msd[QL_VOICE_MAX_ECALL_MSD] = {0};
+
+    printf("test ql_voice_ecall_update_msd: \n");
+    printf("example MSD: 01 04 a9 81 d5 49 70 d6 5c 35 97 ca 04 20 c4 14 60 "
+        "0b be 5f 7e b1 4b a6 ee 10 4f c5 27 03 c1 80 q\n");
+    printf("please enter MSD(at most 140 hex), end with 'q': ");
+    while (1 == scanf("%x", &v))
+    {
+        if(msd_len >= QL_VOICE_MAX_ECALL_MSD)
+        {
+            printf("MSD too long\n");
+            int c;
+            while ((c = getchar()) != '\n' && c != EOF) { }
+            return;
+        }
+        else
+        {
+            msd[msd_len++] = v;
+        }
+    }
+    getchar();  // read `q'
+    getchar();  // read '\n'
+
+    ret = ql_ecall_update_msd_raw((uint8_t *)msd, msd_len);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_ecall_push_msd(void)
+{
+    int ret = 0;
+
+    printf("test ql_voice_ecall_push_msd: \n");
+    ret = ql_ecall_push_msd();
+    if (ret == QL_ERR_OK)
+    {
+        printf("sql_ecall_push_msd OK\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void ecall_user_ind_callback(int ind, void *userdata)
+{
+    printf("\n****** eCall indication Received ******\n");
+    printf("ecall_indication: %d - ", ind);
+
+    switch(ind){
+        case QL_ECALL_EVENT_SENDING_START:
+            printf("QL_ECALL_EVENT_SENDING_START\n");
+            break;
+        case QL_ECALL_EVENT_SENDING_MSD:
+            printf("QL_ECALL_EVENT_SENDING_MSD\n");
+            break;
+        case QL_ECALL_EVENT_LLACK_RECEIVED:
+            printf("QL_ECALL_EVENT_LLACK_RECEIVED\n");
+            break;
+        case QL_ECALL_EVENT_ALLACK_POSITIVE_RECEIVED:
+            printf("QL_ECALL_EVENT_ALLACK_POSITIVE_RECEIVED\n");
+            break;
+        case QL_ECALL_EVENT_ALLACK_CLEARDOWN_RECEIVED:
+            printf("QL_ECALL_EVENT_ALLACK_CLEARDOWN_RECEIVED\n");
+            break;
+        case QL_ECALL_EVENT_ACTIVE:
+            printf("QL_ECALL_EVENT_ACTIVE\n");
+            break;
+        case QL_ECALL_EVENT_DISCONNECTED:
+            printf("QL_ECALL_EVENT_DISCONNECTED\n");
+            break;
+        case QL_ECALL_EVENT_ABNORMAL_HANGUP:
+            printf("QL_ECALL_EVENT_ABNORMAL_HANGUP\n");
+            break;
+        case QL_ECALL_EVENT_ONLY_DEREGISTRATION:
+            printf("QL_ECALL_EVENT_ONLY_DEREGISTRATION\n");
+            break;
+        case QL_ECALL_EVENT_MAY_DEREGISTRATION:
+            printf("QL_ECALL_EVENT_MAY_DEREGISTRATION\n");
+            break;
+        case QL_ECALL_EVENT_PSAP_CALLBACK_START:
+            printf("QL_ECALL_EVENT_PSAP_CALLBACK_START\n");
+            break;
+        case QL_ECALL_EVENT_T2_TIMEOUT:
+            printf("QL_ECALL_EVENT_T2_TIMEOUT\n");
+            break;
+        case QL_ECALL_EVENT_T5_TIMEOUT:
+            printf("QL_ECALL_EVENT_T5_TIMEOUT\n");
+            break;
+        case QL_ECALL_EVENT_T6_TIMEOUT:
+            printf("QL_ECALL_EVENT_T6_TIMEOUT\n");
+            break;
+        case QL_ECALL_EVENT_T7_TIMEOUT:
+            printf("QL_ECALL_EVENT_T7_TIMEOUT\n");
+            break;
+        case QL_ECALL_EVENT_ECALL_STARTED:
+            printf("QL_ECALL_EVENT_ECALL_STARTED\n");
+            break;
+        case QL_ECALL_EVENT_INCOMING_CALL:
+            printf("QL_ECALL_EVENT_INCOMING_CALL\n");
+            break;
+        case QL_ECALL_EVENT_DIAL_DURATION_TIMEOUT:
+            printf("QL_ECALL_EVENT_DIAL_DURATION_TIMEOUT\n");
+            break;
+        case QL_ECALL_EVENT_INTERVAL_TIMEOUT:
+            printf("QL_ECALL_EVENT_INTERVAL_TIMEOUT\n");
+            break;
+        case QL_ECALL_EVENT_AUTO_ANSWER_TIMEOUT:
+            printf("QL_ECALL_EVENT_AUTO_ANSWER_TIMEOUT\n");
+            break;
+        default:
+            printf("UNKNOWN\n");
+            break;
+    }
+}
+
+void item_ql_ecall_init(void)
+{
+    int ret = 0;
+
+    printf("test ql_ecall_init: ");
+    ret = ql_ecall_init();
+    if(ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_ecall_deinit(void)
+{
+    int ret = 0;
+
+    printf("test ql_ecall_deinit: ");
+    ret = ql_ecall_deinit();
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_ecall_set_user_ind_cb(void)
+{
+    ql_ecall_set_user_ind_cb(ecall_user_ind_callback, NULL);
+}
+
+void item_ql_ecall_set_msd_version(void)
+{
+    int ret = 0;
+    uint8_t index=0;
+
+    printf("ecall MSD version(1-ASN1_ECALL_MSD_VERSION_1;  2-ASN1_ECALL_MSD_VERSION_2): \n");
+    scanf("%hhd", &index);
+    getchar();
+
+    if (1 == index)
+    {
+        ret = ql_ecall_set_msd_version(ASN1_ECALL_MSD_VERSION_1);
+        printf(" ql_ecall_get_msd_version ret = %d\n", ret);
+    }
+    else if(2 == index)
+    {
+        ret = ql_ecall_set_msd_version(ASN1_ECALL_MSD_VERSION_2);
+        printf(" ql_ecall_get_msd_version ret = %d\n", ret);
+    }
+    else
+    {
+        printf(" This version is not surport.\n");
+    }
+
+}
+
+void item_ql_ecall_get_msd_version(void)
+{
+    uint8_t msdVersion = 0;
+
+    ql_ecall_get_msd_version(&msdVersion);
+
+    if(msdVersion == ASN1_ECALL_MSD_VERSION_1)//unsupported
+    {
+        printf("MSD version is set to ASN1_ECALL_MSD_VERSION_1.\n");
+    }
+    else if (msdVersion == ASN1_ECALL_MSD_VERSION_2)//supported
+    {
+        printf("MSD version is set to ASN1_ECALL_MSD_VERSION_2.\n");
+    }
+    else
+    {
+        printf(" This version is not surport.\n");
+    }
+
+}
+
+void item_ql_ecall_set_system_type(void)
+{
+    int ret = 0;
+    uint8_t index=0;
+
+    printf("ecall system type(0-ECALL_SYSTEM_STD_PAN_EUROPEAN;  1-ECALL_SYSTEM_STD_ERA_GLONASS): \n");
+    scanf("%hhd", &index);
+    getchar();
+
+    if (0 == index)
+    {
+        ret = ql_ecall_set_system_std(ECALL_SYSTEM_STD_PAN_EUROPEAN);
+        printf(" ql_ecall_set_system_std ret = %d\n", ret);
+    }
+    else if(1 == index)
+    {
+        ret = ql_ecall_set_system_std(ECALL_SYSTEM_STD_ERA_GLONASS);
+        printf(" ql_ecall_set_system_std ret = %d\n", ret);
+    }
+    else
+    {
+        printf(" This version is not surport.\n");
+    }
+}
+
+void item_ql_ecall_get_system_type(void)
+{
+    ECALL_SYSTEM_STD_E system_std;
+    ql_ecall_get_system_std(&system_std);
+    if(system_std == ECALL_SYSTEM_STD_PAN_EUROPEAN)
+    {
+        printf("Ecall system type set to ECALL_SYSTEM_STD_PAN_EUROPEAN.\n");
+    }
+    else if (system_std == ECALL_SYSTEM_STD_ERA_GLONASS)
+    {
+        printf("Ecall system type set to ECALL_SYSTEM_STD_ERA_GLONASS.\n");
+    }
+    else
+    {
+        printf("Ecall system type set to unsupported value.\n");
+    }
+}
+
+void item_ql_ecall_set_msd_vehicle_type(void)
+{
+    int ret = 0;
+    uint8_t index=0;
+
+    printf("Please input VehicleType:\n");
+    printf("MSD_VEHICLE_PASSENGER_M1=1\n");
+    printf("MSD_VEHICLE_BUS_M2=2\n");
+    printf("MSD_VEHICLE_BUS_M3=3\n");
+    printf("MSD_VEHICLE_COMMERCIAL_N1=4\n");
+    printf("MSD_VEHICLE_HEAVY_N2=5\n");
+    printf("MSD_VEHICLE_HEAVY_N3=6\n");
+    printf("MSD_VEHICLE_MOTORCYCLE_L1E=7\n");
+    printf("MSD_VEHICLE_MOTORCYCLE_L2E=8\n");
+    printf("MSD_VEHICLE_MOTORCYCLE_L3E=9\n");
+    printf("MSD_VEHICLE_MOTORCYCLE_L4E=10\n");
+    printf("MSD_VEHICLE_MOTORCYCLE_L5E=11\n");
+    printf("MSD_VEHICLE_MOTORCYCLE_L6E=12\n");
+    printf("MSD_VEHICLE_MOTORCYCLE_L7E=13\n");
+
+    scanf("%hhd", &index);
+    getchar();
+
+    ret = ql_ecall_set_msd_vehicle_type(index);
+    printf(" ql_ecall_set_msd_vehicle_type ret = %d\n", ret);
+
+}
+
+void item_ql_ecall_get_msd_vehicle_type(void)
+{
+    uint8_t vehicleType = 0;
+    ql_ecall_get_msd_vehicle_type(&vehicleType);
+    printf("VehicalType is set to: %u\n", vehicleType);
+
+}
+
+void item_ql_ecall_set_msd_position(void)
+{
+    int ret = 0;
+    int32_t latitude, longitude, direction = 0;
+
+    printf("Please input latitude(example:+48898064):\n");
+    scanf("%d", &latitude);
+    getchar();
+
+    printf("Please input longitude(example:+2218092):\n");
+    scanf("%d", &longitude);
+    getchar();
+
+    printf("Please input direction(example:0):\n");
+    scanf("%d", &direction);
+    getchar();
+
+    ret = ql_ecall_set_msd_position(true, latitude, longitude, direction);
+    printf(" ql_ecall_set_msd_position ret = %d\n", ret);
+}
+
+void item_ql_ecall_set_msd_position1(void)
+{
+    int ret = 0;
+    int32_t latitudeDeltaN1, longitudeDeltaN1 = 0;
+
+    printf("Please input latitudeDeltaN1(-512 ~ 511):\n");
+    scanf("%d", &latitudeDeltaN1);
+    getchar();
+
+    printf("Please input longitudeDeltaN1(-512 ~ 511):\n");
+    scanf("%d", &longitudeDeltaN1);
+    getchar();
+
+    ret = ql_ecall_set_msd_position_n1(latitudeDeltaN1, longitudeDeltaN1);
+    printf(" ql_ecall_set_msd_position_n1 ret = %d\n", ret);
+}
+
+void item_ql_ecall_set_msd_position2(void)
+{
+    int ret = 0;
+    int32_t latitudeDeltaN2, longitudeDeltaN2 = 0;
+
+    printf("Please input latitudeDeltaN2(-512 ~ 511):\n");
+    scanf("%d", &latitudeDeltaN2);
+    getchar();
+
+    printf("Please input longitudeDeltaN2(-512 ~ 511):\n");
+    scanf("%d", &longitudeDeltaN2);
+    getchar();
+
+    ret = ql_ecall_set_msd_position_n2(latitudeDeltaN2, longitudeDeltaN2);
+    printf(" ql_ecall_set_msd_position_n2 ret = %d\n", ret);
+}
+
+void item_ql_ecall_set_number_of_passengers(void)
+{
+//    int ret = 0;
+    uint8_t numberOfPassengers=0;
+
+    printf("Please input msd numberOfPassengers:\n");
+    if(1 != scanf("%hhd", &numberOfPassengers))
+        return;
+    getchar();
+
+    ql_ecall_set_msd_passengers_count(numberOfPassengers);
+}
+
+void item_ql_ecall_set_msd_propulsion_type(void)
+{
+//    int ret = 0;
+    uint8_t propulsionType = 0;
+
+    printf("Please input vehicle propulsion type:\n");
+    printf("ECALL_MSD_PROPULSION_TYPE_GASOLINE=0x1\n");
+    printf("ECALL_MSD_PROPULSION_TYPE_DIESEL=0x2\n");
+    printf("ECALL_MSD_PROPULSION_TYPE_NATURALGAS=0x4\n");
+    printf("ECALL_MSD_PROPULSION_TYPE_PROPANE=0x8\n");
+    printf("ECALL_MSD_PROPULSION_TYPE_ELECTRIC=0x10\n");
+    printf("ECALL_MSD_PROPULSION_TYPE_HYDROGEN=0x20\n");
+    printf("ECALL_MSD_PROPULSION_TYPE_OTHER=0x40\n");
+
+    scanf("%hhx", &propulsionType);
+    getchar();
+
+    ql_ecall_set_msd_propulsion_type(propulsionType);
+}
+
+void item_ql_ecall_get_msd_propulsion_type(void)
+{
+    uint8_t propulsionType = 0;
+
+    ql_ecall_get_msd_propulsion_type(&propulsionType);
+
+    printf("PropulsionType set to: 0x%x\n", propulsionType);
+
+}
+
+void item_ql_ecall_get_msd_call_type(void)
+{
+
+    bool type;
+    ql_ecall_get_msd_call_type(&type);
+
+    printf(" item_ql_ecall_get_msd_call_type type = %s\n", type ? "Test" : "Emergency" );
+}
+
+void item_ql_ecall_set_msd_call_type(void)
+{
+    uint8_t index = 0;
+    printf("Input call type: Test(0) Emergency(1)\n");
+    scanf("%hhd", &index);
+    getchar();
+
+    ql_ecall_set_msd_call_type(index == 0);
+
+    printf(" ql_ecall_set_msd_call_type type = %d\n", index);
+}
+
+
+void item_ql_ecall_set_msd_vin(void)
+{
+    int ret = 0;
+    uint8_t index = 0;
+    msd_Vin_t vin = {0};
+    char* find = NULL;
+    char vin_str[QL_ECALL_MAX_VIN];
+
+    printf("Input: default(0) other(1)\n");
+    scanf("%hhd", &index);
+    getchar();
+    if(index)
+    {
+        printf("Please insert VIN:\n");
+        fgets(vin_str, QL_ECALL_MAX_VIN-1, stdin);
+        find = strchr(vin_str, '\n');
+        if(find)
+        {
+            *find = '\0';
+        }
+        // example 1: WM9VDSVDSYA123456
+        // example 2: 4Y1SL65848Z411439
+        // example 3: VF37BRFVE12345678
+        memcpy(&vin.isowmi, vin_str,3);
+        memcpy(&vin.isovds, (vin_str+3),6);
+        memcpy(&vin.isovisModelyear, (vin_str+9) ,1);
+        memcpy(&vin.isovisSeqPlant,  (vin_str+10) ,7);
+        printf("isowmi:%s isovds:%s isovisModelyear:%s,isovisSeqPlant:%s\n",vin.isowmi,vin.isovds,vin.isovisModelyear,vin.isovisSeqPlant);
+    }
+    else
+    {
+        memcpy(&vin.isowmi,"WM9",3);
+        memcpy(&vin.isovds,"VDSVDS",6);
+        memcpy(&vin.isovisModelyear,"Y",1);
+        memcpy(&vin.isovisSeqPlant,"A123456",7);
+        printf("isowmi:%s isovds:%s isovisModelyear:%s,isovisSeqPlant:%s\n",vin.isowmi,vin.isovds,vin.isovisModelyear,vin.isovisSeqPlant);
+    }
+
+    ret = ql_ecall_set_msd_vin(vin);
+    printf(" ql_ecall_set_msd_vin ret = %d\n", ret);
+}
+
+void item_ql_ecall_get_msd_vin(void)
+{
+    int ret = 0;
+    msd_Vin_t vin;
+    char vin_str[QL_ECALL_MAX_VIN];
+
+    ret = ql_ecall_get_msd_vin(&vin);
+    if(0<strlen(vin.isowmi)&&0<strlen(vin.isovds)&&0<strlen(vin.isovisModelyear)&&0<strlen(vin.isovisSeqPlant))
+    {
+        sprintf(vin_str,"%s%s%s%s",vin.isowmi,vin.isovds,vin.isovisModelyear,vin.isovisSeqPlant);
+    }
+    else
+    {
+        printf(" vin is NULL\n");
+        return;
+    }
+    printf(" ql_ecall_get_msd_vin ret = %d\n", ret);
+
+    printf("VIN=%s\n",vin_str);
+}
+
+void item_ql_ecall_set_msd_tx_mode(void)
+{
+    int ret = 0;
+    uint8_t index = 0;
+
+    printf("Please choose MSD Tx Mode: PULL(0) PUSH(1)\n");
+    scanf("%hhd", &index);
+    getchar();
+
+    if(index == 0)
+    {
+        ret = ql_ecall_set_msd_tx_mode(QL_ECALL_TX_MODE_PULL);
+        printf(" ql_ecall_set_msd_tx_mode ret = %d\n", ret);
+    }
+    else if(index == 1)
+    {
+        ret = ql_ecall_set_msd_tx_mode(QL_ECALL_TX_MODE_PUSH);
+        printf(" ql_ecall_set_msd_tx_mode ret = %d\n", ret);
+    }
+    else
+    {
+        printf("Unsupported MSD transmission mode.\n");
+    }
+}
+
+void item_ql_ecall_get_msd_tx_mode(void)
+{
+    QL_ECALL_MSD_TX_MODE_E tx_mode;
+
+    ql_ecall_get_msd_tx_mode(&tx_mode);
+    if(tx_mode == QL_ECALL_TX_MODE_PULL)
+    {
+        printf("MSD Transmission mode is set to QL_ECALL_TX_MODE_PULL\n");
+    }
+    else if (tx_mode == QL_ECALL_TX_MODE_PUSH)
+    {
+        printf("MSD Transmission mode is set to QL_ECALL_TX_MODE_PUSH\n");
+    }
+}
+
+void item_ql_ecall_start_test(void)
+{
+    int ret = 0;
+    int sim_id;
+
+    printf("please enter the sim_id: ");
+    ret = scanf("%d", &sim_id);
+    getchar();
+
+    if(!QL_IS_SIM_VALID(sim_id))
+    {
+        printf("invalid sim_id\n");
+        return;
+    }
+
+    ret = ql_ecall_start_test(sim_id);
+    printf(" ql_ecall_start_test ret = %d\n", ret);
+}
+
+void item_ql_ecall_start_manual(void)
+{
+    int ret = 0;
+    int sim_id;
+
+    printf("please enter the sim_id: ");
+    ret = scanf("%d", &sim_id);
+    getchar();
+
+    if(!QL_IS_SIM_VALID(sim_id))
+    {
+        printf("invalid sim_id\n");
+        return;
+    }
+
+    ret = ql_ecall_start_manual(sim_id);
+    printf(" ql_ecall_start_manual ret = %d\n", ret);
+}
+
+void item_ql_ecall_start_automatic(void)
+{
+    int ret = 0;
+    int sim_id;
+
+    printf("please enter the sim_id: ");
+    ret = scanf("%d", &sim_id);
+    getchar();
+
+    if(!QL_IS_SIM_VALID(sim_id))
+    {
+        printf("invalid sim_id\n");
+        return;
+    }
+
+    ret = ql_ecall_start_automatic(sim_id);
+    printf(" ql_ecall_start_automatic ret = %d\n", ret);
+}
+
+void item_ql_ecall_terminate_nw_registration(void)
+{
+    int ret;
+
+    ret = ql_ecall_terminate_nw_registration();
+    if(ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_ecall_set_interval_between_attempts(void)
+{
+    uint16_t interval = 0;
+
+    printf("Please input interval between attempts in seconds:\n");
+    scanf("%hd", &interval);
+    getchar();
+
+    ql_ecall_set_interval_between_dial_attempts(interval);
+}
+
+void item_ql_ecall_get_interval_between_attempts(void)
+{
+    uint16_t interval = 0;
+    ql_ecall_get_interval_between_dial_attempts(&interval);
+
+    printf("Interval between attempts is set to %hd seconds:\n", interval);
+
+}
+
+void item_ql_ecall_update_msd (void)
+{
+    int ret = 0;
+    ret = ql_ecall_update_msd();
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_ecall_set_config_info(void)
+{
+    ql_ecall_config_t ecall_context_info;
+
+    printf("Whether the time of T5 timer is valid(0:no, 1:yes):\n");
+    scanf("%hhd", &ecall_context_info.t5_timeout_ms_valid);
+    getchar();
+    if(ecall_context_info.t5_timeout_ms_valid)
+    {
+        printf("please input the time of T5 timer(example:5000ms):\n");
+        scanf("%hd", &ecall_context_info.t5_timeout_ms);
+        getchar();
+    }
+
+    printf("Whether the time of T6 timer is valid(0:no, 1:yes):\n");
+    scanf("%hhd", &ecall_context_info.t6_timeout_ms_valid);
+    getchar();
+    if(ecall_context_info.t6_timeout_ms_valid)
+    {
+        printf("please input the time of T6 timer(example:5000ms):\n");
+        scanf("%hd", &ecall_context_info.t6_timeout_ms);
+        getchar();
+    }
+
+    printf("Whether the time of T7 timer is valid(0:no, 1:yes):\n");
+    scanf("%hhd", &ecall_context_info.t7_timeout_ms_valid);
+    getchar();
+    if(ecall_context_info.t7_timeout_ms_valid)
+    {
+        printf("please input the time of T7 timer(example:20000ms):\n");
+        scanf("%hd", &ecall_context_info.t7_timeout_ms);
+        getchar();
+    }
+
+    printf("Whether the time of auto answer timer is valid(0:no, 1:yes):\n");
+    scanf("%hhd", &ecall_context_info.autoAnswer_timeout_ms_valid);
+    getchar();
+    if(ecall_context_info.autoAnswer_timeout_ms_valid)
+    {
+        printf("please input the time of auto answer  timer(example:3600000ms):\n");
+        scanf("%d", &ecall_context_info.autoAnswer_timeout_ms);
+        getchar();
+    }
+
+    printf("Whether the time of dialDurationTimer is valid(0:no, 1:yes):\n");
+    scanf("%hhd", &ecall_context_info.dialDurationTimer_timout_ms_valid);
+    getchar();
+    if(ecall_context_info.dialDurationTimer_timout_ms_valid)
+    {
+        printf("please input the time of dialDurationTimer(example:120000ms):\n");
+        scanf("%d", &ecall_context_info.dialDurationTimer_timout_ms);
+        getchar();
+    }
+
+    printf("(Not supported)Whether the maxDialAttempts is valid(0:no, 1:yes):\n");
+    scanf("%hhd", &ecall_context_info.maxDialAttempts_valid);
+    getchar();
+    if(ecall_context_info.maxDialAttempts_valid)
+    {
+        printf("please input maxDialAttempts:\n");
+        scanf("%d", &ecall_context_info.maxDialAttempts);
+        getchar();
+    }
+
+    printf("(Not supported)Whether the intervalBetweenAttempts is valid(0:no, 1:yes):\n");
+    scanf("%hhd", &ecall_context_info.intervalBetweenAttempts_valid);
+    getchar();
+    if(ecall_context_info.intervalBetweenAttempts_valid)
+    {
+        printf("please input intervalBetweenAttempts(example:30s):\n");
+        scanf("%hd", &ecall_context_info.intervalBetweenAttempts);
+        getchar();
+    }
+
+    printf("(Not supported)Whether the resetEcallSessionMode is valid(0:no, 1:yes):\n");
+    scanf("%hhd", &ecall_context_info.resetEcallSessionMode_valid);
+    getchar();
+    if(ecall_context_info.resetEcallSessionMode_valid)
+    {
+        printf("please input resetEcallSessionMode(example: 1,autoanswer):\n");
+        scanf("%hhd", &ecall_context_info.resetEcallSessionMode);
+        getchar();
+    }
+
+    ql_ecall_set_config_info(ecall_context_info);
+    printf("ok!\n");
+}
+
+void item_ql_ecall_get_config_info(void)
+{
+    ql_ecall_config_t ecall_context_info;
+
+    ql_ecall_get_config_info(&ecall_context_info);
+
+    printf("ok!\n");
+    printf("the time of T5 timer is %hd\n", ecall_context_info.t5_timeout_ms);
+    printf("the time of T6 timer is %hd\n", ecall_context_info.t6_timeout_ms);
+    printf("the time of T7 timer is %hd\n", ecall_context_info.t7_timeout_ms);
+    printf("the time of dialDurationTimer is %d\n", ecall_context_info.dialDurationTimer_timout_ms);
+    printf("the maximum redial attempts is %d\n", ecall_context_info.maxDialAttempts);
+    //printf("the interval value between dial attempts is %hd\n", ecall_context_info.intervalBetweenAttempts);
+}
+
+void item_ql_ecall_set_ecall_only_mode(void)
+{
+    int ret = 0;
+    int ecall_only_value = 0;
+
+    printf("ecall set ecall only mode(0:disable,1:enable): \n");
+    scanf("%d", &ecall_only_value);
+    getchar();
+
+    ret = ql_ecall_set_ecall_only_mode(ecall_only_value);
+    printf(" ql_ecall_set_ecall_only_mode ret = %d\n", ret);
+}
+
+static t_item_t ql_ecall_items[] =
+{
+    {"ql_ecall_init", item_ql_ecall_init},
+    {"ql_ecall_dial", item_ql_ecall_dial},
+    {"ql_ecall_start_test", item_ql_ecall_start_test},
+    {"ql_ecall_start_manual", item_ql_ecall_start_manual},
+    {"ql_ecall_start_automatic", item_ql_ecall_start_automatic},
+    {"ql_ecall_hangup", item_ql_ecall_hangup},
+    {"ql_ecall_set_user_ind_cb", item_ql_ecall_set_user_ind_cb},
+    {"ql_voice_ecall_set_test_number", item_ql_ecall_set_test_number},
+    {"ql_ecall_set_system_type", item_ql_ecall_set_system_type},
+    {"ql_ecall_get_system_type", item_ql_ecall_get_system_type},
+    {"ql_ecall_update_msd_raw", item_ql_ecall_update_msd_raw},
+    {"ql_ecall_push_msd", item_ql_ecall_push_msd},
+    {"ql_voice_ecall_reset_ivs", item_ql_ecall_reset_ivs},
+    {"ql_ecall_set_msd_call_type", item_ql_ecall_set_msd_call_type},
+    {"ql_ecall_get_msd_call_type", item_ql_ecall_get_msd_call_type},
+    {"ql_ecall_set_msd_vin", item_ql_ecall_set_msd_vin},
+    {"ql_ecall_get_msd_vin", item_ql_ecall_get_msd_vin},
+    {"ql_ecall_set_msd_version", item_ql_ecall_set_msd_version},
+    {"ql_ecall_get_msd_version", item_ql_ecall_get_msd_version},
+    {"ql_ecall_set_msd_tx_mode", item_ql_ecall_set_msd_tx_mode},
+    {"ql_ecall_get_msd_tx_mode", item_ql_ecall_get_msd_tx_mode},
+    {"ql_ecall_set_msd_position", item_ql_ecall_set_msd_position},
+    {"ql_ecall_set_msd_position1", item_ql_ecall_set_msd_position1},
+    {"ql_ecall_set_msd_position2", item_ql_ecall_set_msd_position2},
+    {"ql_ecall_set_msd_vehicle_type", item_ql_ecall_set_msd_vehicle_type},
+    {"ql_ecall_get_msd_vehicle_type", item_ql_ecall_get_msd_vehicle_type},
+    {"ql_ecall_set_number_of_passengers", item_ql_ecall_set_number_of_passengers},
+    {"ql_ecall_set_msd_propulsion_type", item_ql_ecall_set_msd_propulsion_type},
+    {"ql_ecall_get_msd_propulsion_type", item_ql_ecall_get_msd_propulsion_type},
+    {"ql_ecall_terminate_nw_registration", item_ql_ecall_terminate_nw_registration},
+    {"ql_ecall_set_interval_between_attempts", item_ql_ecall_set_interval_between_attempts},
+    {"ql_ecall_get_interval_between_attempts", item_ql_ecall_get_interval_between_attempts},
+    {"ql_ecall_update_msd", item_ql_ecall_update_msd},
+    {"ql_ecall_set_config_info", item_ql_ecall_set_config_info},
+    {"ql_ecall_get_config_info", item_ql_ecall_get_config_info},
+    {"ql_ecall_set_ecall_only_mode", item_ql_ecall_set_ecall_only_mode},
+    {"ql_ecall_deinit", item_ql_ecall_deinit}
+};
+
+static void help()
+{
+    int i = 0;
+    printf("Test Items:\n");
+    while(i < ARRAY_SIZE(ql_ecall_items)) {
+        printf("%d : %s\n", i, ql_ecall_items[i].name);
+        i++;
+    }
+    printf(":");
+}
+
+int main(int argc, char *argv[])
+{
+    char cmd[1024];
+    help();
+    while(1)
+    {
+        memset(cmd, 0, sizeof(cmd));
+        if(fgets(cmd, sizeof(cmd), stdin))
+        {
+            char *ptr = cmd + strlen(cmd) - 1;
+            while(ptr >= cmd && (*ptr == '\r' || *ptr == '\n'))
+            {
+                *ptr-- = '\0';
+            }
+
+            if(strlen(cmd) > 0) {
+                if(isdigit(cmd[0])) {
+                    int item = atoi(cmd);
+                    if(item >= 0 && item < ARRAY_SIZE(ql_ecall_items)) {
+                        ql_ecall_items[item].handle();
+                    }
+                }
+                else if(!strcasecmp(cmd, "h")) {
+                    help();
+                }
+                else if(!strcasecmp(cmd, "q")) {
+                    break;
+                }
+            }
+            else {
+                printf("\n");
+            }
+        }
+    }
+    return 0;
+}
+
diff --git a/mbtk/test/libql_lib_v2/ql_gnss_test.c b/mbtk/test/libql_lib_v2/ql_gnss_test.c
new file mode 100755
index 0000000..dc766a9
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_gnss_test.c
@@ -0,0 +1,725 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_gnss_test.c
+  @brief GNSS service API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "ql_test_utils.h"
+#include "ql_type.h"
+#include "ql_gnss.h"
+
+#define IS_DIGIT(x)    ( ((x-'0')>=0) && ((x-'0')<=9) )
+
+
+static void gnss_ind_cb(void *msg)
+{
+    uint8_t *msg_id = NULL; 
+    msg_id = msg;
+    if(*msg_id == QL_GNSS_NMEA_MSG)
+    {
+        nmea_srv_ind_msg *data = (nmea_srv_ind_msg *)msg;
+        printf("time=%d %s",data->time,data->nmea_sentence);
+    }
+    else if (*msg_id == QL_GNSS_STATUS_MSG)
+    {
+        gnss_status_ind_msg *data = (gnss_status_ind_msg *)msg;
+        switch(data->g_status)
+        {
+            case QL_GNSS_STATUS_FOTA_START:
+                printf("gnss engine fota req\n");
+                break;    
+            case QL_GNSS_STATUS_FOTA_BOOT:
+                printf("gnss engine fota bootloader\n");
+                break;    
+            case  QL_GNSS_STATUS_FOTA_FIRM:
+                printf("gnss engine fota firmware\n");
+                break;    
+            case  QL_GNSS_STATUS_WORKING:
+                printf("gnss engine working\n");
+                break;    
+            default:
+                break;
+        };
+    }
+    else
+    {
+      printf("Invalue msg !!!");
+    }
+}
+
+#if 0
+static void gnss_service_error_cb(int error)
+{
+    printf("===== GNSS Service Abort =====\n");
+}
+#endif
+
+static void item_ql_gnss_init(void)
+{
+    int err = QL_ERR_OK;
+    printf("Start to ql_gnss_init\n");
+    err = ql_gnss_init();
+    if(err == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to ql_gnss_init, err=%d\n", err);
+    }
+}
+
+
+static void item_ql_gnss_set_ind_cb(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_set_ind_cb\n");
+    err = ql_gnss_set_ind_cb(gnss_ind_cb);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to ql_gnss_set_ind_cb, err=%d\n", err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+#if 0
+static void item_ql_gnss_set_service_error_cb(void)
+{
+    int err = QL_ERR_OK;
+    printf("Start to item_ql_gnss_set_service_error_cb\n");
+    err = ql_gnss_set_service_error_cb(gnss_service_error_cb);
+    if(err == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to item_ql_gnss_set_service_error_cb, err=%d\n", err);
+    }
+
+}
+#endif
+
+static void item_ql_gnss_start(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_start\n");
+    err = ql_gnss_start();
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to start gnss , err=%d\n", err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+
+static void item_ql_gnss_stop(void)
+{
+    int err = QL_ERR_OK;
+    
+    printf("Start to ql_gnss_stop\n");
+    err = ql_gnss_stop();
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to stop gnss, err=%d\n", err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+#if 0
+static void item_ql_gnss_get_engine_state(void)
+{
+    int err = QL_ERR_OK;
+    QL_GNSS_ENGINE_STATE_E state = 0;
+
+    printf("Start ql_gnss_get_engine_state : \n");
+    err = ql_gnss_get_engine_state(&state);
+    if(err != QL_ERR_OK)
+    {
+        printf("Get engine state  faild %d\n",err);
+    }
+    else
+    {
+        if(state)
+        {
+            printf("Engine state is on\n");
+        }
+        else
+        {
+            printf("Engine state is off\n");
+        }
+    }
+}
+#endif
+
+#if 0
+static void ql_gnss_get_constellation_show(char *str_p, QL_GNSS_CONSTELLATION_MASK_E mask)
+{
+    switch (mask)
+    {
+    case GPS_ONLY:
+        snprintf(str_p, 100, "%s", "GPS");
+        break;
+    case BDS_ONLY:
+        snprintf(str_p, 100, "%s", "BDS_ONLY");
+        break;
+    case GPS_BDS:
+        snprintf(str_p, 100, "%s", "GPS+BDS");
+        break;
+    case GLONASS_ONLY:
+        snprintf(str_p, 100, "%s", "GLONASS_ONLY");
+        break;
+    case GPS_GLONASS:
+        snprintf(str_p, 100, "%s", "GPS+GLONASS");
+        break; 
+    case BDS_GLONASS:
+        snprintf(str_p, 100, "%s", "BDS+GLONASS");
+        break;
+    case GPS_BDS_GLONASS:
+        snprintf(str_p, 100, "%s", "GPS+BDS+GLONASS");
+        break;
+    case GPS_SBAS_QZSS:
+        snprintf(str_p, 100, "%s", "GPS+SBAS+QZSS");
+        break;
+    case GPS_BDS_GALILEO_SBAS_QZSS:
+        snprintf(str_p, 100, "%s", "GPS+BDS+GALILEO+SBAS+QZSS");
+        break;
+    case GPS_GLONASS_GALILEO_SBAS_QZSS:
+        snprintf(str_p, 100, "%s", "GPS+GLONASS+GALILEO+SBAS+QZSS");
+        break;
+    default:
+        snprintf(str_p, 100, "%s", "error");
+        break;
+    };
+}
+
+static void item_ql_gnss_get_constellation(void)
+{
+    int err = QL_ERR_OK;
+    QL_GNSS_CONSTELLATION_MASK_E mask = 0;
+    printf("Start ql_gnss_get_constellation : \n");
+    err = ql_gnss_get_constellation(&mask);
+    if (err != QL_ERR_OK)
+    {
+        printf("Set Constellation  faild %d\n", err);
+    }
+    else
+    {
+        switch (mask)
+        {
+        case GPS_SBAS_QZSS:
+            printf("GPS+SBAS+QZSS\n");
+            break;
+        case BDS_ONLY:
+            printf("BDS_ONLY\n");
+            break;
+        case GPS_BDS_GALILEO_SBAS_QZSS:
+            printf("GPS+BDS+GALILEO+SBAS+QZSS\n");
+            break;
+        case GPS_GLONASS_GALILEO_SBAS_QZSS:
+            printf("GPS+GLONASS+GALILEO+SBAS+QZSS\n");
+            break;
+        case GPS_ONLY:
+            printf("GPS_ONLY\n");
+            break;
+        case GPS_BDS:
+            printf("GPS_BDS\n");
+            break;
+        case GLONASS_ONLY:
+            printf("GLONASS_ONLY\n");
+            break;
+        case GPS_GLONASS:
+            printf("GPS+GLONASS\n");
+            break;
+        case BDS_GLONASS:
+            printf("BDS+GLONASS\n");
+            break;
+        case GPS_BDS_GLONASS:
+            printf("GPS+BDS+GLONASS\n");
+            break;
+        default:
+            break;
+        };
+    }
+}
+
+/*
+EC200 Supported constellations
+(GPS+SBAS+QZSS--0x08|BDS_ONLY--0x10|GPS+BDS+GALILEO+SBAS+QZSS--0x11|GPS+GLONASS+GALILEO+SBAS+QZSS--0x101)");
+
+AG35CET  Supported constellations
+(GPS_ONLY--0x01|BDS_ONLY--0x02|GPS_BDS--0x03|GLONASS_ONLY--0x04)|GPS_GLONASS--0x05|BDS_GLONASS--0x06|GPS_BDS_GLONASS--0x07")
+
+AG35EUT  Supported constellations
+(GPS_ONLY--0x01|BDS_ONLY--0x02|GPS_BDS--0x03|GLONASS_ONLY--0x04)|GPS_GLONASS--0x05|BDS_GLONASS--0x06|GPS_BDS_GLONASS--0x07|
+GALILEO_ONLY--0x08|GPS_GALILEO--0x09|BD_GALILEO--0x10|GPS_BDS_GLONASS_GALILEO--0x11")
+*/
+static void item_ql_gnss_set_constellation(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input = 0;
+    QL_GNSS_CONSTELLATION_MASK_E constellation = 0;
+    printf("Please input gnss constellation:\n");
+    scanf("%x",&input);
+    printf("input=%x\n",input);
+    constellation = (QL_GNSS_CONSTELLATION_MASK_E)input;
+    err = ql_gnss_set_constellation(constellation);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set gnss constellation mask:%x err=%d\n",constellation,err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+static void item_ql_gnss_set_nmea_type(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input = 0;
+
+    printf("Please input nmea type bitmask:\n");
+    printf("(GST|ZDA|VTG|RMC|GSV|GSA|GLL|GGA)(HEX Base, i.e.0xff)\n");
+    scanf("%x",&input);
+    printf("input=%x\n",input);
+    err = ql_gnss_set_nmea_type(input);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set nmea type with type:%x: err=%d\n",input,err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+static void item_ql_gnss_get_nmea_version(void)
+{
+    int err = QL_ERR_OK;
+    QL_GNSS_NMEA_VERSION_ID_E version = 0;
+
+    printf("Start to get nmea_version \n");
+    err = ql_gnss_get_nmea_version(&version);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to get nmea_version with version:%d, err=%d\n",version, err);
+    }
+    else
+    {
+        printf("Successful\n");
+        if(QL_GNSS_NMEA_VERSION_V30 == version)
+        {
+            printf("Nmea_version is 3.0\n");
+        }
+        else if(QL_GNSS_NMEA_VERSION_V41 == version)
+        {
+            printf("Nmea_version is 4.0\n");
+        }
+    }
+    
+}
+
+
+static void item_ql_gnss_set_nmea_version(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input=0;
+    QL_GNSS_NMEA_VERSION_ID_E version;
+    
+    printf("Please input nmea verson : 0--nema v3.0|1--nema v4.1\n");
+    scanf("%d",&input);
+    printf("Start to set nmea_version with version:%d\n",input);
+    version = (QL_GNSS_NMEA_VERSION_ID_E)input;
+    err = ql_gnss_set_nmea_version(version);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set nmea_version with version:%d, err=%d\n",version, err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+#endif
+
+static void item_ql_gnss_set_start_mode(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input=0;
+    QL_GNSS_START_MODE_E mode;
+
+    printf("Please input mode : 0--cold start|1--warm start|2--hot start\n");
+    scanf("%d",&input);
+    printf("Start to ql_set_start_mode with modem:%d\n",input);
+    mode = (QL_GNSS_START_MODE_E)input;
+    err = ql_gnss_set_start_mode(mode);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to Start to ql_set_start_mode with modem:%d, err=%d\n",mode, err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+
+static void item_ql_gnss_set_agnss_mode(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input=0;
+
+    printf("Please input mode : 0x01--GPS| 0x02--BD| 0x04--GLONASS| 0x08--GALILEO| 0x10--QZSS \n");
+    scanf("%x",&input);
+    printf("Start to ql_set_agnss_mode with modem:%x\n",input);
+    err = ql_gnss_set_agnss_mode(input);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to Start to ql_set_agnss_mode with modem:%d, err=%d\n",input, err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+
+}
+
+static void item_ql_gnss_inject_agnss_data(void)
+{
+    int err = QL_ERR_OK;
+
+    err = ql_gnss_inject_agnss_data();
+    if (err != QL_ERR_OK)
+    {
+        printf("Failed to inject agnss  err=%d\n", err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+#if 0
+static int convertUtcTimeMsec(char *utc_str,uint64_t *msec)
+{
+    int i =0;
+    int temp =0;
+    int date[6] = {0};
+    char ch;
+    unsigned char field = 0;
+    struct tm t;
+    while(1)
+    {
+        ch = utc_str[i++];
+
+        if(IS_DIGIT(ch))
+        {
+            temp *= 10;
+            temp += ch - '0';
+        }
+        else if(ch == ' ')
+        {
+            continue;
+        }
+        else if(ch == '-' || ch == ' ' || ch == ':' || ch == '\0')
+        {
+            date[field] = temp;
+            field++;
+            temp = 0;
+
+            if(ch == '\0')
+            {
+                printf("parse char success\n");
+                break;
+            }
+        }
+        else
+        {
+            printf("ch=%c,ch=%d,invalid char\n",ch,ch);
+            return -1;
+        }
+    }
+
+    if(date[0] < 1900
+        || date[1] < 1 || date[1] > 12
+        || date[2] < 1 || date[2] > 31
+        || date[3] < 0 || date[3] > 23
+        || date[4] < 0 || date[4] > 59
+        || date[5] < 0 || date[5] > 59
+         ) 
+     {
+         return -1;
+     }
+
+     t.tm_sec = date[5];
+     t.tm_min = date[4];
+     t.tm_hour = date[3];
+     t.tm_mday = date[2];
+     t.tm_mon = date[1] -1;
+     t.tm_year = date[0] - 1900;
+     t.tm_isdst = 0;
+
+     *msec = (uint64_t)1000 * (uint64_t)mktime(&t);
+     return 0;
+
+}
+
+static void item_ql_gnss_inject_utc_time(void)
+{
+    int err = QL_ERR_OK;
+    int input = 0;
+    uint64_t utc_time;
+    char buff[128]={0};
+    printf("Start ql_inject_utc_time : \n");
+    printf("Please Select Time:\n1-Current System time\n2-Input Time,Format:YYYY-MM-DD hh:mm:ss\n:");
+    scanf("%d",&input);
+    if(err !=0)
+    {
+        printf("Input error\n");
+        return ;
+    }
+    switch(input)
+    {
+        case 1:
+            utc_time=(uint64_t)time(NULL)*1000;
+            system("date");
+            break;
+        case 2:
+            err = t_get_string(buff, sizeof(buff));
+            if(err !=0)
+            {
+                printf("Input error\n");
+                return ;
+            }
+            convertUtcTimeMsec(buff,&utc_time);
+            break;
+            default:
+                printf("Not select!!!\n");
+                return ;
+    }
+    err = ql_gnss_inject_utc_time(utc_time);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to Inject Utc Time  %d\n",err);
+    }
+    else
+    {
+        printf("Successful!\n");
+    }
+}
+
+
+
+
+static void item_ql_gnss_suspend(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_suspend\n");
+    err = ql_gnss_suspend();
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set ql_gnss_suspend\n");
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+
+static void item_ql_gnss_resume(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_resume\n");
+    err = ql_gnss_resume();
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set ql_gnss_resume\n");
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+#endif
+
+static void item_ql_gnss_deinit(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_deinit\n");
+    err = ql_gnss_deinit();
+    if(err == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to ql_gnss_deinit, err=%d\n", err);
+    }
+}
+
+static t_item_t ql_gnss_items[] = 
+{
+    {"ql_gnss_init", item_ql_gnss_init},
+    {"ql_gnss_nmea_ind_cb", item_ql_gnss_set_ind_cb},
+//    {"ql_gnss_get_engine_state",item_ql_gnss_get_engine_state},
+    {"ql_gnss_start",item_ql_gnss_start},
+    {"ql_gnss_stop", item_ql_gnss_stop},
+//    {"ql_gnss_get_nmea_version",item_ql_gnss_get_nmea_version},
+//    {"ql_gnss_set_nmea_version",item_ql_gnss_set_nmea_version},
+//    {"ql_gnss_set_nmea_type",item_ql_gnss_set_nmea_type},
+//    {"ql_gnss_get_constellation",item_ql_gnss_get_constellation},
+//    {"ql_gnss_set_constellation",item_ql_gnss_set_constellation},  
+    {"ql_gnss_set_start_mode",item_ql_gnss_set_start_mode},
+    {"ql_gnss_set_agnss_mode",item_ql_gnss_set_agnss_mode},
+    {"ql_gnss_inject_agnss_data",item_ql_gnss_inject_agnss_data},
+//    {"ql_gnss_inject_utc_time",item_ql_gnss_inject_utc_time},
+//    {"ql_gnss_suspend", item_ql_gnss_suspend},
+//    {"ql_gnss_resume", item_ql_gnss_resume},
+//    {"ql_gnss_set_service_error_cb",item_ql_gnss_set_service_error_cb},
+    {"ql_gnss_deinit", item_ql_gnss_deinit},
+};
+
+t_module_t ql_gnss_module =
+{
+    "gnss",
+    T_ARRAY_SIZE(ql_gnss_items),
+    ql_gnss_items
+};
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a int value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int(int *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if(NULL == fgets(buf, sizeof(buf)-1, stdin))
+    {
+        return -1;
+    }
+#if 0    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+#endif
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 10);
+    if(ptr_end!=NULL && ptr_end[0]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = dat;
+    }
+
+    return 0;
+}
+
+void dump_items()
+{
+    int i;
+
+    printf("\n");
+    printf("The current module is: \n");
+
+    for(i=0; i< ql_gnss_module.item_len; i++)
+    {
+        printf("%d\t%s\n", i, ql_gnss_module.item_list[i].name);
+    }
+    printf("-1\texit\n");
+}
+
+int main(int argc, char *argv[])
+{
+    int ret;
+    int idx;
+
+    dump_items();
+
+    while(1)
+    {
+        printf("Please enter your choice: ");
+        ret = t_get_int(&idx);
+        printf("\n");
+        if(ret < 0)
+        {
+            printf("Invalid input\n");
+            continue;
+        }
+        else if(ret == 1)
+        {
+            dump_items();
+            continue;
+        }
+
+        if(idx == -1)
+        {
+            break;
+        }
+
+        if(idx<0 || idx>=ql_gnss_module.item_len)
+        {
+            printf("Not support idx: %d\n", idx);
+            continue;
+        }
+
+        printf("->Item : %s\n", ql_gnss_module.item_list[idx].name);
+        ql_gnss_module.item_list[idx].handle();
+    }
+
+    return 0;
+}
+
diff --git a/mbtk/test/libql_lib_v2/ql_gpio_test.c b/mbtk/test/libql_lib_v2/ql_gpio_test.c
new file mode 100755
index 0000000..6d68052
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_gpio_test.c
@@ -0,0 +1,172 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include "ql_gpio.h"
+#include "mbtk_log.h"
+
+int gpio_g = -1;
+
+int main(int argc, char *argv[])
+{
+    char operator[10];
+    int opt;
+    int ret;
+    int gpio;
+    int direction;
+    int value;
+//    int pullsel;
+
+	mbtk_log_init("radio", "GPIO_TEST");
+
+    printf("=========ql gpio main=========\n"
+        "\t0 exit\n"
+        "\t1 gpio init\n"
+		"\t2 gpio uninit\n"
+        "\t3 gpio set direction\n"
+        "\t4 gpio set level\n"
+        "\t5 gpio get level\n"
+        "operator: >> \n");
+
+    while(1)
+    {
+		memset(operator, 0, sizeof(operator));
+        if(NULL != fgets(operator, sizeof(operator), stdin))
+            break;
+        fflush(stdin);
+        opt = atoi(operator);
+        switch (opt)
+        {
+        case 0:
+            printf("main exit\n");
+            return 0;
+        case 1:
+            {
+				printf("INPUT gpio \n");
+				memset(operator, 0, sizeof(operator));
+				if(NULL == fgets(operator, sizeof(operator), stdin))
+                    break;
+				fflush(stdin);
+				gpio = atoi(operator);
+				printf("gpio is %d\n", gpio);
+				ret = ql_gpio_init(gpio, 1, 1, 0);
+				if(ret != 0)
+				{
+					printf("ql_gpio_init fail\n");
+				}
+				else
+				{
+					printf("ql_gpio_init success\n");
+					gpio_g = gpio;
+				}
+            }
+            break;
+        case 2:
+            {
+				printf(">>>>>gpio uninit\n");
+				if (gpio_g != -1)
+				{
+					ret = ql_gpio_uninit(gpio_g);
+					if(ret != 0)
+					{
+						printf("ql_gpio_uninit fail\n");
+						printf("ret=%d\n", ret);
+					}
+					else
+					{
+						printf("ql_gpio_uninit success\n");
+						gpio_g = -1;
+					}
+				}
+				else
+				{
+					printf(">>>>>pleas gpio init<<<<<\n");
+				}
+            }
+            break;
+        case 3:
+            {
+                printf(">>>>>Input set direction<<<<<\n");
+				memset(operator, 0, sizeof(operator));
+				if(NULL == fgets(operator, sizeof(operator), stdin))
+                    break;
+				fflush(stdin);
+				direction = atoi(operator);
+				if (gpio_g != -1)
+				{
+					ret = ql_gpio_set_direction(gpio_g, direction);
+					if(ret != 0)
+					{
+						printf("ql_gpio_set_direction fail\n");
+					}
+					else
+					{
+						printf("ql_gpio_set_direction success\n");
+					}
+				}
+				else
+				{
+					printf(">>>>>pleas gpio init<<<<<\n");
+				}
+            }
+            break;
+        case 4:
+            {
+                printf(">>>>>Input set level<<<<<\n");
+				memset(operator, 0, sizeof(operator));
+				if(NULL == fgets(operator, sizeof(operator), stdin))
+                    break;
+				fflush(stdin);
+				value = atoi(operator);
+				if (gpio_g != -1)
+				{
+					ret = ql_gpio_set_level(gpio_g, value);
+					if(ret < 0)
+					{
+						printf("ql_gpio_set_level fail\n");
+					}
+					else
+					{
+						printf("ql_gpio_set_level success\n");
+					}
+				}
+				else
+				{
+					printf(">>>>>pleas gpio init<<<<<\n");
+				}
+            }
+            break;
+        case 5:
+            {
+                printf(">>>>>Input get level<<<<<\n");
+				if (gpio_g != -1)
+				{
+					ret = ql_gpio_get_level(gpio_g);
+					if(ret < 0)
+					{
+						printf("ql_gpio_get_level fail\n");
+						printf("ret=%d\n", ret);
+					}
+					else
+					{
+						printf("ql_gpio_get_level success\n");
+						printf("ret=%d\n", ret);
+					}
+				}
+				else
+				{
+					printf(">>>>>pleas gpio init<<<<<\n");
+				}
+            }
+            break;
+
+
+        default:
+            break;
+        }
+
+    }
+
+    return 0;
+
+}
diff --git a/mbtk/test/libql_lib_v2/ql_gpio_v2_test.c b/mbtk/test/libql_lib_v2/ql_gpio_v2_test.c
new file mode 100755
index 0000000..9f2fb4d
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_gpio_v2_test.c
@@ -0,0 +1,73 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "ql_gpio.h"
+
+static ENUM_PINNAME m_gpio_pin_gpio = PINNAME_GPIO_120;
+
+void callback_onAlarm(int param)
+{
+	int lvl = ql_gpio_get_level(m_gpio_pin_gpio);
+	if (lvl < 0)
+	{
+		printf("< fail to read pin level >\n");
+		return;
+	}
+	if (1 == lvl)
+	{
+		ql_gpio_set_level(m_gpio_pin_gpio, PINLEVEL_LOW);
+		printf("< Pull pin level to low >\n");
+	}else{
+		ql_gpio_set_level(m_gpio_pin_gpio, PINLEVEL_HIGH);
+		printf("< Pull pin level to high >\n");
+	}
+
+	alarm(1);
+}
+
+void exit_sig(int param)
+{
+   //Exit to release gpio
+   ql_gpio_uninit(m_gpio_pin_gpio);
+
+   exit(1);
+}
+
+int main(int argc, char* argv[])
+{
+	int iRet;
+
+	printf("< OpenLinux: GPIO example >\n");
+#if 0
+	/*
+	 *Note:
+	 * When using gpio configure, you need to determine whether the function of pin is gpio function.
+	 * If it is not gpio function, the following gpio configure are invalid.
+	 * You can use the ql_set_gpio_function to setting.
+	 */
+	iRet = ql_check_pin_function_status(m_gpio_pin_gpio);
+	if(iRet == 0){
+		iRet = ql_set_gpio_function(m_gpio_pin_gpio,1);
+		printf("< Set gpio(%d) function iRet=%d status=%d>\n", m_gpio_pin_gpio,iRet,ql_check_pin_function_status(m_gpio_pin_gpio));
+	}
+#endif
+	/*
+	* Before using gpio init the application layer,you first need to determine whether it is used in the driver.
+	*/
+	iRet = ql_gpio_init(m_gpio_pin_gpio, PINDIRECTION_OUT, PINLEVEL_HIGH, PINPULLSEL_DISABLE);
+	printf("< Init GPIO: pin=%d, dir=%d, level=%d, iRet=%d >\n", m_gpio_pin_gpio, PINDIRECTION_OUT, PINLEVEL_HIGH, iRet);
+
+	signal(SIGALRM, callback_onAlarm);
+	alarm(2);
+
+    signal(SIGINT, exit_sig);
+    while (1)
+	{
+		sleep(1);
+	}
+
+    return 0;
+}
diff --git a/mbtk/test/libql_lib_v2/ql_nw_test.c b/mbtk/test/libql_lib_v2/ql_nw_test.c
new file mode 100755
index 0000000..409a966
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_nw_test.c
@@ -0,0 +1,1747 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_nw_test.c 
+  @brief nw test module 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "ql_test_utils.h"
+#include "ql_type.h"
+#include "ql_nw.h"
+
+
+#if 0
+static int internal_nw_get_nas_rat(int radio, char* buf, int buf_len);
+#endif
+static int internal_nw_get_net_status(QL_NW_NETWORK_STATUS_TYPE_E net, char* buf, int buf_len);
+static int internal_nw_get_radio_tech(QL_NW_RADIO_TECH_TYPE_E radio, char* buf, int buf_len);
+static int internal_nw_get_tech_domain(QL_NW_TECH_DOMAIN_TYPE_E domain, char* buf, int buf_len);
+static int internal_nw_get_signal_strength_level(QL_NW_SIGNAL_STRENGTH_LEVEL_E level, char* buf, int buf_len);
+static void internal_nw_get_mcc_mnc_value(char *plmn, int plmn_len, unsigned short *mcc, unsigned short *mnc);
+static void internal_nw_get_service_option(unsigned short so_mask, char *buf, int buf_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a uint32 value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_hex(uint32_t *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 16);
+    if(ptr_end!=NULL && ptr_end[0]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = dat;
+    }
+
+    return 0;
+}
+
+void nw_voice_reg_event_ind_cb(ql_nw_reg_status_info_t *ind)
+{
+    char domain_info[16] = {0};
+    char radio_info[16] = {0};
+    char svc_opt[128] = {0};
+
+    if(ind == NULL)
+    {
+        printf("recv voice reg ind event, param is null\n");
+        return;
+    }
+    printf("recv voice reg ind event, detail info:\n");
+
+    if(internal_nw_get_tech_domain(ind->tech_domain, domain_info, sizeof(domain_info)) == 0)
+    {
+        printf("\ttech_domain is unrecognized:%d, ", ind->tech_domain);
+    }
+    else
+    {
+        printf("\ttech_domain = %s, ", domain_info);
+    }
+
+    if(internal_nw_get_radio_tech(ind->radio_tech, radio_info, sizeof(radio_info)) == 0)
+    {
+        printf("radio_tech is unrecognized:%d, ", ind->radio_tech);
+    }
+    else
+    {
+        printf("radio_tech = %s, ", radio_info);
+    }
+
+    printf("roaming = %d, reg_status = %d, deny_reason = %d\n", 
+            ind->roaming, ind->reg_state, ind->deny_reason);
+
+    if(QL_NW_RADIO_TECH_NR5G != ind->radio_tech)
+    {
+        printf("\tmcc=%s, mnc=%s, forbidden=%d, cid=0x%X, lac=%d, psc=%d, tac=%d, endc_available=%d\n",
+                ind->mcc,
+                ind->mnc,
+                ind->forbidden,
+                ind->cid,
+                ind->lac,
+                ind->psc,
+                ind->tac,
+                ind->endc_available);
+
+        printf("\tinPRL=%d, css=%d, sid=%d, nid=%d, bsid=%d\n",
+                ind->inPRL,
+                ind->css,
+                ind->sid,
+                ind->nid,
+                ind->bsid);
+    }
+    else
+    { 
+        printf("\tmcc=%s, mnc=%s, forbidden=%d, cid=0x%llX, pci=%d, tac=%d\n",
+                ind->mcc,
+                ind->mnc,
+                ind->forbidden,
+                ind->nr5g_cid,
+                ind->nr5g_pci,
+                ind->nr5g_tac);
+
+        internal_nw_get_service_option(ind->nr5g_svc_opt, svc_opt, sizeof(svc_opt));
+        printf("\tsvc_opt(%d)=%s\n", ind->nr5g_svc_opt, svc_opt);
+    } 
+}
+
+#if 0
+void nw_data_reg_event_ind_cb(ql_nw_reg_status_info_t *ind)
+{
+    char domain_info[16] = {0};
+    char radio_info[16] = {0};
+    char svc_opt[128] = {0};
+    
+    if(ind == NULL)
+    {
+        printf("recv data reg ind event, param is null\n");
+        return;
+    }
+    printf("recv data reg ind event, detail info:\n");
+    
+    if(internal_nw_get_tech_domain(ind->tech_domain, domain_info, sizeof(domain_info)) == 0)
+    {
+        printf("\ttech_domain is unrecognized:%d, ", ind->tech_domain);
+    }
+    else
+    {
+        printf("\ttech_domain = %s, ", domain_info);
+    }
+
+    if(internal_nw_get_radio_tech(ind->radio_tech, radio_info, sizeof(radio_info)) == 0)
+    {
+        printf("radio_tech is unrecognized:%d, ", ind->radio_tech);
+    }
+    else
+    {
+        printf("radio_tech = %s, ", radio_info);
+    }
+
+    printf("roaming = %d, reg_status = %d, deny_reason = %d\n", 
+            ind->roaming, ind->reg_state, ind->deny_reason);
+
+    if(QL_NW_RADIO_TECH_NR5G != ind->radio_tech)
+    {
+        printf("\tmcc=%s, mnc=%s, forbidden=%d, cid=0x%X, lac=%d, psc=%d, tac=%d, endc_available=%d\n",
+                ind->mcc,
+                ind->mnc,
+                ind->forbidden,
+                ind->cid,
+                ind->lac,
+                ind->psc,
+                ind->tac,
+                ind->endc_available);
+
+        printf("\tinPRL=%d, css=%d, sid=%d, nid=%d, bsid=%d\n",
+                ind->inPRL,
+                ind->css,
+                ind->sid,
+                ind->nid,
+                ind->bsid);
+    }
+    else
+    { 
+        printf("\tmcc=%s, mnc=%s, forbidden=%d, cid=0x%llX, pci=%d, tac=%d\n",
+                ind->mcc,
+                ind->mnc,
+                ind->forbidden,
+                ind->nr5g_cid,
+                ind->nr5g_pci,
+                ind->nr5g_tac);
+
+        internal_nw_get_service_option(ind->nr5g_svc_opt, svc_opt, sizeof(svc_opt));
+        printf("\tsvc_opt(%d)=%s\n", ind->nr5g_svc_opt, svc_opt);
+    }
+}
+#endif
+
+void nw_signal_strength_event_ind_cb(ql_nw_signal_strength_info_t *ind, QL_NW_SIGNAL_STRENGTH_LEVEL_E level)
+{
+    char level_info[16] = {0};
+
+    if(ind == NULL)
+    {
+        printf("recv signal strength ind event, param is null\n");
+        return;
+    }
+
+    printf("recv event indication : signal strength event\n");
+
+    if(ind->has_gsm)
+    {
+        printf("gsm_sig_info: rssi=%d\n", ind->gsm.rssi);
+    } 
+
+    if(ind->has_wcdma)
+    {
+        printf("wcdma_sig_info: rssi=%d, ecio=%d\n", 
+                ind->wcdma.rssi, 
+                ind->wcdma.ecio); 
+    } 
+    if(ind->has_tdscdma)
+    {
+        printf("tdscdma_sig_info: rssi=%d, rscp=%d, ecio=%d, sinr=%d\n", 
+                ind->tdscdma.rssi, 
+                ind->tdscdma.rscp,
+                ind->tdscdma.ecio,
+                ind->tdscdma.sinr);
+    } 
+    if(ind->has_lte)
+    {
+        printf("lte_sig_info: rssi=%d, rsrq=%d, rsrp=%d, snr=%d\n", 
+                ind->lte.rssi, 
+                ind->lte.rsrq,
+                ind->lte.rsrp,
+                ind->lte.snr);
+    } 
+    if(ind->has_nr5g)
+    {
+        printf("nr5g_sig_info: rsrp=%hd, rsrq=%hd, snr=%hd\n",
+                ind->nr5g.rsrp,
+                ind->nr5g.rsrq,
+                ind->nr5g.snr);
+    }
+    if(ind->has_cdma)
+    {
+        printf("cdma_sig_info: rssi=%d, ecio=%d\n", 
+                ind->cdma.rssi, 
+                ind->cdma.ecio);
+    } 
+    if(ind->has_hdr)
+    {
+        printf("hdr_sig_info: rssi=%d, ecio=%d, sinr=%d, io=%d\n", 
+                ind->hdr.rssi, 
+                ind->hdr.ecio,
+                ind->hdr.sinr,
+                ind->hdr.io);
+    }
+    
+    if(internal_nw_get_signal_strength_level(level, level_info, sizeof(level_info)) == 0)
+    {
+        printf("signal strength level is %d, unrecognized\n", level);
+    }
+    else
+    {
+        printf("signal strength level is %s\n", level_info);
+    }
+}
+
+#if 0
+void nw_cell_access_status_event_ind_cb(QL_NW_CELL_ACCESS_STATE_TYPE_E status)
+{
+    printf("recv event indication : cell access status event\n");
+    printf("status = %d\n", status);
+}
+
+void nw_nitz_time_update_event_ind_cb(ql_nw_nitz_time_info_t *ind)
+{
+    if(ind == NULL)
+    {
+        printf("recv nitz time update ind event, param is null\n");
+        return;
+    }
+    printf("recv event indication : nitz time update event\n");
+    printf("nitz_time=%s, abs_time=%lld, leap_sec=%d\n",
+            ind->nitz_time, ind->abs_time, ind->leap_sec);
+}
+
+void nw_wea_alert_event_ind_cb(ql_nw_wea_alert_info_t *ind)
+{
+    if(ind == NULL)
+    {
+        printf("recv wea alert ind event, param is null\n");
+        return;
+    }
+    
+    printf("recv event indication : wea alert event, wea_alert_info_valid:[%d]\n", 
+            ind->wea_alert_info_valid);
+    if(ind->wea_alert_info_valid)
+    {
+        printf("wea alert info:[%s] \n",ind->wea_alert_info);
+    }
+}
+
+void nw_etws_alert_event_ind_cb(ql_nw_etws_alert_info_t *ind)
+{
+    if(ind == NULL)
+    {
+        printf("recv etws alert ind event, param is null\n");
+        return;
+    }
+    printf("recv event indication : etws alert event, etws_primary_info_valid:[%d] etws_secondary_info_valid:[%d]\n", 
+            ind->etws_primary_info_valid, ind->etws_secondary_info_valid);
+    if(ind->etws_primary_info_valid)
+    {
+        printf("etws primary alert info:[%s] \n", ind->etws_primary_info);
+    }
+    if(ind->etws_secondary_info_valid)
+    {
+        printf("etws secondary alert info:[%s] \n",
+            ind->etws_secondary_info);
+    }
+}
+
+void nw_network_scan_async_cb(int async_id, ql_nw_scan_result_list_info_t *info)
+{
+    int i = 0;
+    char net_info[16] = {0};
+    char radio_info[16] = {0};
+
+    printf("network scan async callback, async id is %d, list_len=%d, detail info:\n", async_id, info->entry_len);
+    for(i = 0; i < info->entry_len; i++)
+    {
+        memset(net_info, 0, sizeof(net_info));
+        memset(radio_info, 0, sizeof(radio_info));
+        printf("\t[%d]: long_eons=%s, short_eons=%s, mcc=%s, mnc=%s, ",
+               i,
+               info->entry[i].operator_name.long_eons,
+               info->entry[i].operator_name.short_eons,
+               info->entry[i].operator_name.mcc,
+               info->entry[i].operator_name.mnc);
+
+
+        if(internal_nw_get_net_status(info->entry[i].network_status, net_info, sizeof(net_info)) == 0)
+        {
+            printf("unrecognized network_status:%d, ", info->entry[i].network_status);
+        }
+        else
+        {
+            printf("network_status=%s, ", net_info);
+        }
+
+        if(internal_nw_get_radio_tech(info->entry[i].rat, radio_info, sizeof(radio_info)) == 0)
+        {
+            printf("unrecognized rat:%d\n ", info->entry[i].rat);
+        }
+        else
+        {
+            printf("radio_tech=%s\n", radio_info);
+        }
+    }
+}
+#endif
+
+void nw_service_error_cb(int error)
+{
+    printf("===== NW Service Abort =====\n");
+}
+
+void item_ql_nw_init(void)
+{
+    int ret = 0;
+    
+    printf("Start to ql_nw_init: ");
+    ret = ql_nw_init();
+    if(ret == QL_ERR_OK)
+    {
+        printf("nw init ok\n");
+    }
+    else
+    {
+        printf("failed, ret=%d\n", ret);
+    }
+}
+
+void item_ql_nw_deinit(void)
+{
+    int ret = 0;
+    
+    printf("Start to ql_nw_deinit: ");
+    ret = ql_nw_deinit();
+    if(ret == QL_ERR_OK)
+    {
+        printf("nw deinit ok\n");
+    }
+    else
+    {
+        printf("failed, ret=%d\n", ret);
+    }
+}
+
+#if 0
+void item_ql_nw_network_scan(void)
+{
+    int ret;
+    int async_id = 0;
+
+    ret = ql_nw_network_scan(&async_id, nw_network_scan_async_cb);
+    if(ret == QL_ERR_OK)
+    {
+        printf("async network scan succeed, token id is %d\n", async_id);
+    }
+    else
+    {
+        printf("async network scan failed, token id is %d, ret=%d", async_id, ret);
+    }
+}
+#endif
+
+void item_ql_nw_set_power_mode(void)
+{
+    int ret;
+    uint32_t mode = 0;
+
+    printf("please input power mode mask hex(VOICE | SMS | SIM | NETWORK | NORMAL): ");
+    ret = t_get_hex(&mode);
+    if(ret != 0)
+    {
+        printf("Invalid input\n");
+        return;
+    }
+    ret = ql_nw_set_power_mode(mode);
+    printf("ql_nw_set_lower_power_mode ret = %d\n", ret);
+}
+
+#if 0
+void item_ql_nw_set_pref_nwmode_roaming(void)
+{
+    int ret;
+    uint32_t mask = 0;
+    ql_nw_pref_nwmode_roaming_info_t t_info;
+
+    memset(&t_info, 0, sizeof(t_info));
+    printf("please input config mask hex(TDSCDMA | LTE | EVDO | CDMA | WCDMA | GSM): ");
+    ret = t_get_hex(&mask);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+    t_info.preferred_nw_mode = mask;
+
+#if 0
+    printf("please input roaming pref(0:off 1:on): ");
+    ret = t_get_int((int *)&mask);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+
+    t_info.preferred_roaming = mask;
+#endif
+    ret = ql_nw_set_pref_nwmode_roaming(&t_info);
+    printf("ql_nw_set_config ret = %d\n", ret);
+}
+
+void item_ql_nw_get_pref_nwmode_roaming(void)
+{
+    int ret;
+    ql_nw_pref_nwmode_roaming_info_t t_info;
+
+    memset(&t_info, 0, sizeof(t_info));
+    ret = ql_nw_get_pref_nwmode_roaming(&t_info);
+#if 0    
+    printf("ql_nw_get_config ret = %d\npreferred_nw_mode=%#llx, preferred_roaming=%d\n", 
+            ret, t_info.preferred_nw_mode, t_info.preferred_roaming);
+#else
+    printf("ql_nw_get_config ret = %d\npreferred_nw_mode=%#llx\n", 
+            ret, t_info.preferred_nw_mode);
+#endif            
+}
+
+void item_ql_nw_get_mobile_operator_name(void)
+{
+    int ret;
+    ql_nw_mobile_operator_name_info_t t_info;
+
+    memset(&t_info, 0, sizeof(t_info));
+    ret = ql_nw_get_mobile_operator_name(&t_info);
+    printf("ql_nw_get_operator_name ret = %d, long_eons=%s, short_eons=%s, mcc=%s, mnc=%s\n", 
+        ret,
+        t_info.long_eons, 
+        t_info.short_eons, 
+        t_info.mcc, 
+        t_info.mnc);
+}
+
+void item_ql_nw_get_cell_info(void)
+{
+    int i;
+    int ret;
+    unsigned short mcc;
+    unsigned short mnc;
+    ql_nw_cell_info_t t_info;
+
+    memset(&t_info, 0, sizeof(t_info));
+    ret = ql_nw_get_cell_info(&t_info);
+    printf("ql_nw_get_cell_info ret = %d, detail info:\n", ret);
+    
+    if(t_info.gsm_info_valid)
+    {
+        printf("gsm cell information:\n");
+        for(i = 0; i < t_info.gsm_info_len; i++)
+        {
+            printf("\tcid=%d,plmn=0x%02x 0x%02x 0x%02x,lac=%d,arfcn=%d,bsic=%d,rssi=%d,", 
+                    t_info.gsm_info[i].cid, 
+                    t_info.gsm_info[i].plmn[0], 
+                    t_info.gsm_info[i].plmn[1], 
+                    t_info.gsm_info[i].plmn[2], 
+                    t_info.gsm_info[i].lac, 
+                    t_info.gsm_info[i].arfcn, 
+                    t_info.gsm_info[i].bsic, 
+                    t_info.gsm_info[i].rssi);
+
+            internal_nw_get_mcc_mnc_value(t_info.gsm_info[i].plmn, 3, &mcc, &mnc);
+            printf("convert plmn to mcc=%d,mnc=%02d\n", mcc, mnc);
+        }
+    }
+
+    if(t_info.umts_info_valid)
+    {
+        printf("umts cell information:\n");
+        for(i = 0; i < t_info.umts_info_len; i++)
+        {
+            printf("\tcid=%d,lcid=%d,plmn=0x%02x 0x%02x 0x%02x,lac=%d,uarfcn=%d,psc=%d,rssi=%d,", 
+                    t_info.umts_info[i].cid,
+                    t_info.umts_info[i].lcid, 
+                    t_info.umts_info[i].plmn[0], 
+                    t_info.umts_info[i].plmn[1], 
+                    t_info.umts_info[i].plmn[2], 
+                    t_info.umts_info[i].lac, 
+                    t_info.umts_info[i].uarfcn, 
+                    t_info.umts_info[i].psc, 
+                    t_info.umts_info[i].rssi);
+            internal_nw_get_mcc_mnc_value(t_info.umts_info[i].plmn, 3, &mcc, &mnc);
+            printf("convert plmn to mcc=%d,mnc=%02d\n", mcc, mnc);
+        }
+    }
+
+    if(t_info.lte_info_valid)
+    {
+        printf("lte cell information:\n");
+        for(i = 0; i < t_info.lte_info_len; i++)
+        {
+            printf("\tcid=%d,plmn=0x%02x 0x%02x 0x%02x,tac=%d,pci=%d,earfcn=%d,rssi=%d,", 
+                    t_info.lte_info[i].cid, 
+                    t_info.lte_info[i].plmn[0], 
+                    t_info.lte_info[i].plmn[1], 
+                    t_info.lte_info[i].plmn[2], 
+                    t_info.lte_info[i].tac, 
+                    t_info.lte_info[i].pci, 
+                    t_info.lte_info[i].earfcn, 
+                    t_info.lte_info[i].rssi);
+            internal_nw_get_mcc_mnc_value(t_info.lte_info[i].plmn, 3, &mcc, &mnc);
+            printf("convert plmn to mcc=%d,mnc=%02d\n", mcc, mnc);
+        }
+    }
+  
+    if(t_info.nr5g_info_valid)
+    {
+        printf("nr5g cell information:\n");
+        printf("\tcid=%lld,plmn=0x%02x 0x%02x 0x%02x,tac=%d,pci=%d,arfcn=%d,rsrp=%d,rsrq=%d,snr=%d,", 
+                t_info.nr5g_info.cid, 
+                t_info.nr5g_info.plmn[0], 
+                t_info.nr5g_info.plmn[1], 
+                t_info.nr5g_info.plmn[2], 
+                t_info.nr5g_info.tac, 
+                t_info.nr5g_info.pci, 
+                t_info.nr5g_info.arfcn, 
+                t_info.nr5g_info.rsrp,
+                t_info.nr5g_info.rsrq,
+                t_info.nr5g_info.snr);
+        internal_nw_get_mcc_mnc_value(t_info.nr5g_info.plmn, 3, &mcc, &mnc);
+        printf("convert plmn to mcc=%d,mnc=%02d\n", mcc, mnc);
+    }
+
+    if(t_info.cdma_info_valid)
+    {
+        printf("cdma cell information:\n");
+        printf("\tsid=%d,nid=%d,bid=%d,refpn=%d,base_lat=%d,base_long=%d,rssi=%d\n", 
+                t_info.cdma_info.sid,
+                t_info.cdma_info.nid,
+                t_info.cdma_info.bid,
+                t_info.cdma_info.refpn,
+                t_info.cdma_info.base_lat,
+                t_info.cdma_info.base_long,
+                t_info.cdma_info.rssi);  
+    }
+}
+#endif
+
+void item_ql_nw_get_voice_reg_status(void)
+{
+    int ret;
+    char domain_info[16] = {0};
+    char radio_info[16] = {0};
+    char svc_opt[128] = {0};
+    ql_nw_reg_status_info_t t_info;
+
+    memset(&t_info, 0, sizeof(t_info));
+    ret = ql_nw_get_voice_reg_status(&t_info);
+
+    printf("ql_nw_get_voice_reg_status ret = %d, detail info:\n", ret);
+
+    if(internal_nw_get_tech_domain(t_info.tech_domain, domain_info, sizeof(domain_info)) == 0)
+    {
+        printf("\ttech_domain is unrecognized:%d, ", t_info.tech_domain);
+    }
+    else
+    {
+        printf("\ttech_domain = %s, ", domain_info);
+    }
+
+    if(internal_nw_get_radio_tech(t_info.radio_tech, radio_info, sizeof(radio_info)) == 0)
+    {
+        printf("radio_tech is unrecognized:%d, ", t_info.radio_tech);
+    }
+    else
+    {
+        printf("radio_tech = %s, ", radio_info);
+    }
+
+    printf("roaming = %d, reg_status = %d, deny_reason = %d\n", 
+            t_info.roaming, t_info.reg_state, t_info.deny_reason);
+
+    if(QL_NW_RADIO_TECH_NR5G != t_info.radio_tech)
+    {
+        printf("\tmcc=%s, mnc=%s, forbidden=%d, cid=0x%X, lac=%d, psc=%d, tac=%d, endc_available=%d\n",
+                t_info.mcc,
+                t_info.mnc,
+                t_info.forbidden,
+                t_info.cid,
+                t_info.lac,
+                t_info.psc,
+                t_info.tac,
+                t_info.endc_available);
+
+        printf("\tinPRL=%d, css=%d, sid=%d, nid=%d, bsid=%d\n",
+                t_info.inPRL,
+                t_info.css,
+                t_info.sid,
+                t_info.nid,
+                t_info.bsid);
+    }
+    else
+    { 
+        printf("\tmcc=%s, mnc=%s, forbidden=%d, cid=0x%llX, pci=%d, tac=%d\n",
+                t_info.mcc,
+                t_info.mnc,
+                t_info.forbidden,
+                t_info.nr5g_cid,
+                t_info.nr5g_pci,
+                t_info.nr5g_tac);
+
+        internal_nw_get_service_option(t_info.nr5g_svc_opt, svc_opt, sizeof(svc_opt));
+        printf("\tsvc_opt(%d)=%s\n", t_info.nr5g_svc_opt, svc_opt);
+    }
+}
+
+void item_ql_nw_get_data_reg_status(void)
+{
+    int ret;
+    char domain_info[16] = {0};
+    char radio_info[16] = {0};
+    char svc_opt[128] = {0};
+    ql_nw_reg_status_info_t t_info;
+
+    memset(&t_info, 0, sizeof(t_info));
+    ret = ql_nw_get_data_reg_status(&t_info);
+    
+    printf("ql_nw_get_data_reg_status ret = %d, detail info:\n", ret);
+    
+    if(internal_nw_get_tech_domain(t_info.tech_domain, domain_info, sizeof(domain_info)) == 0)
+    {
+        printf("\ttech_domain is unrecognized:%d, ", t_info.tech_domain);
+    }
+    else
+    {
+        printf("\ttech_domain = %s, ", domain_info);
+    }
+
+    if(internal_nw_get_radio_tech(t_info.radio_tech, radio_info, sizeof(radio_info)) == 0)
+    {
+        printf("radio_tech is unrecognized:%d, ", t_info.radio_tech);
+    }
+    else
+    {
+        printf("radio_tech = %s, ", radio_info);
+    }
+
+    printf("roaming = %d, reg_status = %d, deny_reason = %d\n", 
+            t_info.roaming, t_info.reg_state, t_info.deny_reason);
+
+    if(QL_NW_RADIO_TECH_NR5G != t_info.radio_tech)
+    {
+        printf("\tmcc=%s, mnc=%s, forbidden=%d, cid=0x%X, lac=%d, psc=%d, endc_available=%d\n",
+                t_info.mcc,
+                t_info.mnc,
+                t_info.forbidden,
+                t_info.cid,
+                t_info.lac,
+                t_info.psc,
+                //t_info.tac,  // tac not valid  in item_ql_nw_get_data_reg_status ,use item_ql_nw_get_cell_info
+                t_info.endc_available);
+
+        printf("\tinPRL=%d, css=%d, sid=%d, nid=%d, bsid=%d\n",
+                t_info.inPRL,
+                t_info.css,
+                t_info.sid,
+                t_info.nid,
+                t_info.bsid);
+    }
+    else
+    { 
+        printf("\tmcc=%s, mnc=%s, forbidden=%d, cid=0x%llX, pci=%d, tac=%d\n",
+                t_info.mcc,
+                t_info.mnc,
+                t_info.forbidden,
+                t_info.nr5g_cid,
+                t_info.nr5g_pci,
+                t_info.nr5g_tac);
+
+        internal_nw_get_service_option(t_info.nr5g_svc_opt, svc_opt, sizeof(svc_opt));
+        printf("\tsvc_opt(%d)=%s\n", t_info.nr5g_svc_opt, svc_opt);
+    }
+
+}
+
+void item_ql_nw_get_signal_strength(void)
+{
+    int ret;
+    char level_info[16] = {0};
+    ql_nw_signal_strength_info_t info;
+    QL_NW_SIGNAL_STRENGTH_LEVEL_E level = QL_NW_SIGNAL_STRENGTH_LEVEL_NONE;
+
+    memset(&info, 0, sizeof(info));
+    ret = ql_nw_get_signal_strength(&info, &level);
+    if (QL_ERR_OK != ret)
+    {
+        printf("failed, ret = %d\n", ret);
+        return;
+    }
+
+    if(info.has_gsm)
+    {
+        printf("gsm_sig_info: rssi=%hhd\n", info.gsm.rssi);
+    } 
+
+    if(info.has_wcdma)
+    {
+        printf("wcdma_sig_info: rssi=%hhd, ecio=%hd\n",
+                info.wcdma.rssi,
+                info.wcdma.ecio);
+    } 
+
+    if(info.has_tdscdma)
+    {
+        printf("tdscdma_sig_info: rssi=%hhd, rscp=%hhd, ecio=%hd, sinr=%hhd\n",
+                info.tdscdma.rssi,
+                info.tdscdma.rscp,
+                info.tdscdma.ecio,
+                info.tdscdma.sinr);
+    } 
+
+    if(info.has_lte)
+    {
+        printf("lte_sig_info: rssi=%hhd, rsrq=%hhd, rsrp=%hd, snr=%hd\n",
+                info.lte.rssi,
+                info.lte.rsrq,
+                info.lte.rsrp,
+                info.lte.snr);
+    } 
+    
+    if(info.has_nr5g)
+    {
+        printf("nr5g_sig_info: rsrp=%hd, rsrq=%hd, snr=%hd\n",
+                info.nr5g.rsrp,
+                info.nr5g.rsrq,
+                info.nr5g.snr);
+    }
+
+    if(info.has_cdma)
+    {
+        printf("cdma_sig_info: rssi=%hhd, ecio=%hd\n",
+                info.cdma.rssi,
+                info.cdma.ecio);
+    } 
+
+    if(info.has_hdr)
+    {
+        printf("hdr_sig_info: rssi=%hhd, ecio=%hd, sinr=%hd, io=%d\n",
+                info.hdr.rssi,
+                info.hdr.ecio,
+                info.hdr.sinr,
+                info.hdr.io);
+    }
+
+    if(internal_nw_get_signal_strength_level(level, level_info, sizeof(level_info)) == 0)
+    {
+        printf("signal strength level is %d, unrecognized\n", level);
+    }
+    else
+    {
+        printf("signal strength level is %s\n", level_info);
+    }
+}
+
+#if 0
+void item_ql_nw_get_cell_access_status(void)
+{
+    int ret;
+    QL_NW_CELL_ACCESS_STATE_TYPE_E e_state;
+
+    ret = ql_nw_get_cell_access_status(&e_state);
+    printf("ql_nw_get_cell_access_state ret = %d, e_state=%d\n", ret, e_state);
+}
+
+void item_ql_nw_get_nitz_time_info(void)
+{
+    int ret;
+    ql_nw_nitz_time_info_t t_info;
+
+    memset(&t_info, 0, sizeof(t_info));
+    ret = ql_nw_get_nitz_time_info(&t_info);
+    printf("ql_nw_get_nitz_time_info ret = %d\n nitz_time=%s, abs_time=%lld, leap_sec=%hhd\n", 
+        ret,
+        t_info.nitz_time, 
+        t_info.abs_time, 
+        t_info.leap_sec);
+}
+#endif
+
+void item_ql_nw_set_voice_reg_ind_cb(void)
+{
+    int ret = 0;
+    int reg_flag = 0;
+    
+    printf("please input voice reg option: (0: unreg, other: reg): ");
+    ret = t_get_int(&reg_flag);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+    if(reg_flag)
+    {
+        ret = ql_nw_set_voice_reg_ind_cb(nw_voice_reg_event_ind_cb);
+    }
+    else
+    {
+        ret = ql_nw_set_voice_reg_ind_cb(NULL);
+    }
+    printf("ql_nw_reg_voice_reg_event ret = %d\n", ret);
+}
+
+#if 0
+void item_ql_nw_set_data_reg_ind_cb(void)
+{
+    int ret = 0;
+    int reg_flag = 0;
+    
+    printf("please input data reg option: (0: unreg, other: reg): ");
+    ret = t_get_int(&reg_flag);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+    if(reg_flag)
+    {
+        ret = ql_nw_set_data_reg_ind_cb(nw_data_reg_event_ind_cb);
+    }
+    else
+    {
+        ret = ql_nw_set_data_reg_ind_cb(NULL);
+    }
+    printf("ql_nw_reg_data_reg_event ret = %d\n", ret);
+}
+#endif
+
+void item_ql_nw_set_signal_strength_chg_ind_cb(void)
+{
+    int ret = 0;
+    int reg_flag = 0;
+    
+    printf("please input signal strength change reg option: (0: unreg, other: reg): ");
+    ret = t_get_int(&reg_flag);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+    
+    if(reg_flag)
+    {
+        ret = ql_nw_set_signal_strength_ind_cb(nw_signal_strength_event_ind_cb);
+    }
+    else
+    {
+        ret = ql_nw_set_signal_strength_ind_cb(NULL);
+    }
+    printf("ql_nw_reg_signal_strength_chg_event ret = %d\n", ret);
+}
+
+#if 0
+void item_ql_nw_set_cell_access_status_chg_ind_cb(void)
+{
+    int ret = 0;
+    int reg_flag = 0;
+    
+    printf("please input cell access status change reg option: (0: unreg, other: reg): ");
+    ret = t_get_int(&reg_flag);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+    
+    if(reg_flag)
+    {
+        ret = ql_nw_set_cell_access_status_ind_cb(nw_cell_access_status_event_ind_cb);
+    }
+    else
+    {
+        ret = ql_nw_set_cell_access_status_ind_cb(NULL);
+    }
+    printf("ql_nw_reg_cell_access_status_event ret = %d\n", ret);
+}
+
+void item_ql_nw_set_nitz_time_update_ind_cb(void)
+{
+    int ret = 0;
+    int reg_flag = 0;
+    
+    printf("please input nitz time update reg option: (0: unreg, other: reg): ");
+    ret = t_get_int(&reg_flag);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(reg_flag)
+    {
+        ret = ql_nw_set_nitz_time_update_ind_cb(nw_nitz_time_update_event_ind_cb);
+    }
+    else
+    {
+        ret = ql_nw_set_nitz_time_update_ind_cb(NULL);
+    }
+    printf("ql_nw_reg_nitz_time_update_event ret = %d\n", ret);
+}
+
+void item_ql_nw_set_wea_alert_ind_cb(void)
+{
+    int ret = 0;
+    int reg_flag = 0;
+    
+    printf("please input wea alert reg option: (0: unreg, other: reg): ");
+    ret = t_get_int(&reg_flag);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(reg_flag)
+    {
+        ret = ql_nw_set_wea_alert_ind_cb(nw_wea_alert_event_ind_cb);
+    }
+    else
+    {
+        ret = ql_nw_set_wea_alert_ind_cb(NULL);
+    }
+    printf("ql_nw_set_wea_alert_ind_cb ret = %d\n", ret);
+}
+
+void item_ql_nw_set_etws_alert_ind_cb(void)
+{
+    int ret = 0;
+    int reg_flag = 0;
+    
+    printf("please input etws alert reg option: (0: unreg, other: reg): ");
+    ret = t_get_int(&reg_flag);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+
+    if(reg_flag)
+    {
+        ret = ql_nw_set_etws_alert_ind_cb(nw_etws_alert_event_ind_cb);
+    }
+    else
+    {
+        ret = ql_nw_set_etws_alert_ind_cb(NULL);
+    }
+    printf("ql_nw_set_etws_alert_ind_cb ret = %d\n", ret);
+}
+#endif
+
+static void internal_nw_get_mcc_mnc_value(char *plmn, int plmn_len, unsigned short *mcc, unsigned short *mnc)
+{
+    int mcc1 = 0, mcc2 = 0, mcc3 = 0;
+    int mnc1 = 0, mnc2 = 0, mnc3 = 0;
+    
+    if(plmn_len < 3 || plmn == NULL) {
+        printf("get mcc mnc from plmn fail, param is invalid\n");
+        return;
+    }
+
+    mcc1 = plmn[0] & 0X0F;
+    mcc2 = plmn[0] >> 4;
+    mcc3 = plmn[1] & 0x0F;
+    
+    mnc3 = plmn[1] >> 4;
+    mnc2 = plmn[2] >> 4;
+    mnc1 = plmn[2] & 0x0F;
+    
+    *mcc = mcc1 * 100 + mcc2 * 10 + mcc3;
+    
+    if(0X0F == mnc3) {
+        *mnc = mnc1 * 10 + mnc2;
+    }
+    else {
+        *mnc = mnc1 * 100 + mnc2 * 10 + mnc3;
+    }
+}
+
+static int internal_nw_get_net_status(QL_NW_NETWORK_STATUS_TYPE_E net, char* buf, int buf_len)
+{
+    int ret_val = 1;
+    
+    if(buf == NULL || buf_len < 2)
+    {
+        printf("param is valid\n");
+        return 0;
+    }
+
+    memset(buf, 0, buf_len);
+    
+    switch(net)
+    {
+        case QL_NW_NETWORK_STATUS_NONE:
+            strncpy(buf, "NONE", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_NETWORK_STATUS_CURRENT_SERVING:
+            strncpy(buf, "CURRENT_SERVING", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_NETWORK_STATUS_PREFERRED:
+            strncpy(buf, "PREFERED", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_NETWORK_STATUS_NOT_PREFERRED:
+            strncpy(buf, "NOT_PREFERRED", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_NETWORK_STATUS_AVAILABLE:
+            strncpy(buf, "AVAILABLE", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_NETWORK_STATUS_FORBIDDEN:
+            strncpy(buf, "FORBIDDEN", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        default:
+            ret_val = 0;
+            break;
+    }
+    return ret_val;
+}
+
+#if 0
+static int internal_nw_get_nas_rat(int radio, char* buf, int buf_len)
+{
+    int ret_val = 1;
+    
+    if(buf == NULL || buf_len < 2)
+    {
+        printf("param is valid\n");
+        return 0;
+    }
+
+    memset(buf, 0, buf_len);
+    
+    switch(radio)
+    {
+        case 0:
+            strncpy(buf, "UNKNOWN", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case 1:
+            strncpy(buf, "GSM", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case 2:
+            strncpy(buf, "WCDMA", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case 3:
+            strncpy(buf, "TDSCDMA", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case 4:
+            strncpy(buf, "LTE", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case 5:
+            strncpy(buf, "NR5G", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case 6:
+            strncpy(buf, "CDMA", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case 7:
+            strncpy(buf, "HDR", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        default:
+            ret_val = 0;
+            break;
+    }
+    return ret_val;
+}
+#endif
+
+static int internal_nw_get_radio_tech(QL_NW_RADIO_TECH_TYPE_E radio, char* buf, int buf_len)
+{
+    int ret_val = 1;
+    
+    if(buf == NULL || buf_len < 2)
+    {
+        printf("param is valid\n");
+        return 0;
+    }
+
+    memset(buf, 0, buf_len);
+    
+    switch(radio)
+    {
+        case QL_NW_RADIO_TECH_TD_SCDMA:
+            strncpy(buf, "TD_SCDMA", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_GSM:
+            strncpy(buf, "GSM", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_HSPAP:
+            strncpy(buf, "HSPAP", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_LTE:
+            strncpy(buf, "LTE", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_EHRPD:
+            strncpy(buf, "EHRPD", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_EVDO_B:
+            strncpy(buf, "EVDO_B", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_HSPA:
+            strncpy(buf, "HSPA", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_HSUPA:
+            strncpy(buf, "HSUPA", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_HSDPA:
+            strncpy(buf, "HSDPA", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_EVDO_A:
+            strncpy(buf, "EVDO_A", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_EVDO_0:
+            strncpy(buf, "EVDO_0", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_1xRTT:
+            strncpy(buf, "1xRTT", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_IS95B:
+            strncpy(buf, "IS95B", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_IS95A:
+            strncpy(buf, "IS95A", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_UMTS:
+            strncpy(buf, "UMTS", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_EDGE:
+            strncpy(buf, "EDGE", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_GPRS:
+            strncpy(buf, "GPRS", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_NR5G:
+            strncpy(buf, "NR5G", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_RADIO_TECH_NONE:
+            strncpy(buf, "NONE", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        default:
+            ret_val = 0;
+            break;
+    }
+    return ret_val;
+}
+
+static int internal_nw_get_tech_domain(QL_NW_TECH_DOMAIN_TYPE_E domain, char* buf, int buf_len)
+{
+    int ret_val = 1;
+    
+    if(buf == NULL || buf_len < 2)
+    {
+        printf("param is valid\n");
+        return 0;
+    }
+
+    memset(buf, 0, buf_len);
+    
+    switch(domain)
+    {
+        case QL_NW_TECH_DOMAIN_NONE:
+            strncpy(buf, "NONE", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_TECH_DOMAIN_3GPP:
+            strncpy(buf, "3GPP", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_TECH_DOMAIN_3GPP2:
+            strncpy(buf, "3GPP2", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        default:
+            ret_val = 0;
+            break;
+    }
+    return ret_val;
+}
+
+static int internal_nw_get_signal_strength_level(QL_NW_SIGNAL_STRENGTH_LEVEL_E level, char* buf, int buf_len)
+{
+    int ret_val = 1;
+    
+    if(buf == NULL || buf_len < 2)
+    {
+        printf("param is valid\n");
+        return 0;
+    }
+
+    memset(buf, 0, buf_len);
+    
+    switch(level)
+    {
+        case QL_NW_SIGNAL_STRENGTH_LEVEL_NONE:
+            strncpy(buf, "UNKNOWN", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_SIGNAL_STRENGTH_LEVEL_POOR:
+            strncpy(buf, "POOR", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_SIGNAL_STRENGTH_LEVEL_MODERATE:
+            strncpy(buf, "MODERATE", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_SIGNAL_STRENGTH_LEVEL_GOOD:
+            strncpy(buf, "GOOD", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        case QL_NW_SIGNAL_STRENGTH_LEVEL_GREAT:
+            strncpy(buf, "GREAT", buf_len - 1);
+            buf[buf_len - 1] = '\0';
+            break;
+        default:
+            ret_val = 0;
+            break;
+    }
+    return ret_val;
+}
+
+static void internal_nw_get_service_option(unsigned short so_mask, char *buf, int buf_len)
+{
+    int remain_len = buf_len;
+
+    if(NULL == buf || buf_len < 2)
+    {
+        printf("param is valid\n");
+        return;
+    }
+    memset(buf, 0, buf_len);
+
+    if(so_mask & QL_NW_NR5G_SO_TDD)
+    {
+        if(remain_len > strlen("NR5G_TDD|") + 1)
+        {
+            strcat(buf + (buf_len - remain_len), "NR5G_TDD|");
+            remain_len = buf_len - strlen("NR5G_TDD|");
+        }
+    }
+
+    if(so_mask & QL_NW_NR5G_SO_SUB6)
+    {
+        if(remain_len > strlen("NR5G_SUB6|") + 1)
+        {
+            strcat(buf + (buf_len - remain_len), "NR5G_SUB6|");
+            remain_len = buf_len - strlen("NR5G_SUB6|");
+        }
+    }
+
+    if(so_mask & QL_NW_NR5G_SO_MMWAVE)
+    {
+        if(remain_len > strlen("NR5G_MMWAVE|") + 1)
+        {
+            strcat(buf + (buf_len - remain_len), "NR5G_MMWAVE|");
+            remain_len = buf_len - strlen("NR5G_MMWAVE|");
+        }
+    }
+    
+    if(so_mask & QL_NW_NR5G_SO_NSA)
+    {
+        if(remain_len > strlen("NR5G_NSA|") + 1)
+        {
+            strcat(buf + (buf_len - remain_len), "NR5G_NSA|");
+            remain_len = buf_len - strlen("NR5G_NSA|");
+        }
+    }
+    
+    if(so_mask & QL_NW_NR5G_SO_SA)
+    {
+        if(remain_len > strlen("NR5G_SA|") + 1)
+        {
+            strcat(buf + (buf_len - remain_len), "NR5G_SA|");
+            remain_len = buf_len - strlen("NR5G_SA|");
+        }
+    }
+
+    if(strlen(buf) > 0)
+    {
+        buf[strlen(buf) - 1] = '\0';
+    }
+    return;
+}
+
+#if 0
+void item_ql_nw_wea_set_config(void)
+{
+    int ret = 0;
+    int choice = 0;
+    int item = 0;
+    ql_nw_wea_config_t config = {0};
+
+    printf("test ql_nw_wea_set_config: \n");
+    printf(" 1)Presidential_alert\n");
+    printf(" 2)Extreme_alert\n");
+    printf(" 3)Severe_alert\n");
+    printf(" 4)Amber_alert\n");
+    printf(" 5)PublicSafety_alert\n");
+    printf(" 6)StateLocalTest_alert\n");
+    printf(" 7)RMT_alert\n");
+    printf(" 8)Exercise_alert\n");
+    printf(" 9)CMSPDefined_alert\n");
+    printf("10)Spanish_alert\n");
+    printf("please enter item to config: ");
+    ret = t_get_int(&choice);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+    printf("\n");
+
+    switch (choice)
+    {
+        case 1:
+            item |= QL_NW_WEA_CONFIG_PRESIDENTIAL_ALERT;
+            printf("Presidential_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.Presidential_alert) != 1)
+            {
+                printf("Invalid input\n");
+                return;
+            }
+            break;
+        case 2:
+            item |= QL_NW_WEA_CONFIG_EXTREME_ALERT;
+            printf("Extreme_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.Extreme_alert) != 1)
+            {    
+                printf("Invalid input\n");
+                return;
+            }
+            break;
+        case 3:
+            item |= QL_NW_WEA_CONFIG_SEVERE_ALERT;
+            printf("Severe_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.Severe_alert) != 1)
+            {    
+                printf("Invalid input\n");
+                return;
+            }
+            break;
+        case 4:
+            item |= QL_NW_WEA_CONFIG_AMBER_ALERT;
+            printf("Amber_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.Amber_alert) != 1)
+            {    
+                printf("Invalid input\n");
+                return;
+            }   
+            break;
+        case 5:
+            item |= QL_NW_WEA_CONFIG_PUBLIC_SAFETY_ALERT;
+            printf("PublicSafety_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.PublicSafety_alert) != 1)
+            {    
+                printf("Invalid input\n");
+                return;
+            }
+            break;
+        case 6:
+            item |= QL_NW_WEA_CONFIG_STATE_LOCAL_TEST_ALERT;
+            printf("StateLocalTest_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.StateLocalTest_alert) != 1)
+            {    
+                printf("Invalid input\n");
+                return;
+            }
+            break;
+        case 7:
+            item |= QL_NW_WEA_CONFIG_RMT_ALERT;
+            printf("RMT_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.RMT_alert) != 1)
+            {    
+                printf("Invalid input\n");
+                return;
+            }
+            break;
+        case 8:
+            item |= QL_NW_WEA_CONFIG_EXERCISE_ALERT;
+            printf("Exercise_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.Exercise_alert) != 1)
+            {    
+                printf("Invalid input\n");
+                return;
+            }
+            break;
+        case 9:
+            item |= QL_NW_WEA_CONFIG_CMSP_DEFINED_ALERT;
+            printf("CMSPDefined_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.CMSPDefined_alert) != 1)
+            {    
+                printf("Invalid input\n");
+                return;
+            }
+            break;
+        case 10:
+            item |= QL_NW_WEA_CONFIG_SPANISH_ALERT;
+            printf("Spanish_alert: 0 - disable, 1 - enable:");
+            if(scanf("%hhu", &config.Spanish_alert) != 1)
+            {    
+                printf("Invalid input\n");
+                return;
+            }
+            break;
+        default:
+            printf("bad choice: %d\n", choice);
+            return;
+    }
+    ret = getchar();
+
+    ret = ql_nw_set_wea_config(item, &config);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_nw_wea_get_config(void)
+{
+    int ret = 0;
+    ql_nw_wea_config_t config = {0};
+
+    printf("test ql_nw_get_wea_config: \n");
+    ret = ql_nw_get_wea_config(&config);
+    if (ret == QL_ERR_OK)
+    {
+        printf("****** wea Config ******\n");
+        printf("Presidential_alert: %s\n", config.Presidential_alert ? "true" : "false");
+        printf("Extreme_alert: %s\n", config.Extreme_alert ? "true" : "false");
+        printf("Severe_alert: %s\n", config.Severe_alert ? "true" : "false");
+        printf("Amber_alert: %s\n", config.Amber_alert ? "true" : "false");
+        printf("PublicSafety_alert: %s\n", config.PublicSafety_alert ? "true" : "false");
+        printf("StateLocalTest_alert: %s\n", config.StateLocalTest_alert ? "true" : "false");
+        printf("RMT_alert: %s\n", config.RMT_alert ? "true" : "false");
+        printf("Exercise_alert: %s\n", config.Exercise_alert ? "true" : "false");
+        printf("CMSPDefined_alert: %s\n", config.CMSPDefined_alert ? "true" : "false");
+        printf("Spanish_alert: %s\n", config.Spanish_alert ? "true" : "false");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_nw_etws_set_config(void)
+{
+    int ret = 0;
+    int etws_enable = 0;
+
+    printf("please input etws config (0: disable,  1: enable): ");
+    ret = t_get_int(&etws_enable);
+    if(ret != 0)
+    {    
+        printf("Invalid input\n");
+        return;
+    }
+
+    ret = ql_nw_set_etws_config((unsigned char)etws_enable);
+    printf("item_ql_nw_etws_set_config ret = %d\n", ret);
+}
+
+void item_ql_nw_etws_get_config(void)
+{
+    int ret = 0;
+    unsigned char etws_enable = 0;
+
+    ret = ql_nw_get_etws_config(&etws_enable);
+    printf("ql_nw_get_etws_config ret = %d \t etws_enable=%d\n", 
+            ret, etws_enable);
+}
+#endif
+
+void item_ql_nw_set_service_error_cb(void)
+{
+    int ret = 0;
+
+    ret = ql_nw_set_service_error_cb(nw_service_error_cb);
+    if(ret != QL_ERR_OK)
+    {
+        printf("Failed to ql_nw_set_service_error_cb, ret=%d\n", ret);
+    }
+    else
+    {
+        printf("Sucessful\n");
+    }
+}
+
+
+static t_item_t ql_nw_items[] = 
+{
+      
+    {"ql_nw_init", item_ql_nw_init},
+//    {"ql_nw_network_scan", item_ql_nw_network_scan},
+    {"ql_nw_set_power_mode", item_ql_nw_set_power_mode},
+//    {"ql_nw_set_pref_nwmode_roaming", item_ql_nw_set_pref_nwmode_roaming},
+//    {"ql_nw_get_pref_nwmode_roaming", item_ql_nw_get_pref_nwmode_roaming},
+//    {"ql_nw_get_mobile_operator_name", item_ql_nw_get_mobile_operator_name},
+//    {"ql_nw_get_cell_info", item_ql_nw_get_cell_info},
+    {"ql_nw_get_voice_reg_status", item_ql_nw_get_voice_reg_status},
+    {"ql_nw_get_data_reg_status", item_ql_nw_get_data_reg_status},
+    {"ql_nw_get_signal_strength", item_ql_nw_get_signal_strength},
+//    {"ql_nw_get_cell_access_status", item_ql_nw_get_cell_access_status},
+//    {"ql_nw_get_nitz_time_info", item_ql_nw_get_nitz_time_info},
+    {"ql_nw_set_voice_reg_ind_cb", item_ql_nw_set_voice_reg_ind_cb},
+//    {"ql_nw_set_data_reg_ind_cb", item_ql_nw_set_data_reg_ind_cb},
+    {"ql_nw_set_signal_strength_chg_ind_cb", item_ql_nw_set_signal_strength_chg_ind_cb},
+//    {"ql_nw_set_cell_access_status_chg_ind_cb", item_ql_nw_set_cell_access_status_chg_ind_cb},
+//    {"ql_nw_set_nitz_time_update_ind_cb", item_ql_nw_set_nitz_time_update_ind_cb},
+//    {"ql_nw_set_wea_alert_ind_cb", item_ql_nw_set_wea_alert_ind_cb},
+//    {"ql_nw_wea_set_config", item_ql_nw_wea_set_config},
+//    {"ql_nw_wea_get_config", item_ql_nw_wea_get_config},
+//    {"ql_nw_set_etws_alert_ind_cb", item_ql_nw_set_etws_alert_ind_cb},
+//    {"ql_nw_etws_set_config", item_ql_nw_etws_set_config},
+//    {"ql_nw_etws_get_config", item_ql_nw_etws_get_config},
+    {"ql_nw_set_service_error_cb", item_ql_nw_set_service_error_cb},
+    {"ql_nw_deinit", item_ql_nw_deinit},
+};
+
+t_module_t ql_nw_module =
+{
+    "nw",
+    T_ARRAY_SIZE(ql_nw_items),
+    ql_nw_items
+};
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a int value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int(int *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if(NULL == fgets(buf, sizeof(buf)-1, stdin))
+    {
+        return -1;
+    }
+#if 0    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+#endif
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 10);
+    if(ptr_end!=NULL && ptr_end[0]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = dat;
+    }
+
+    return 0;
+}
+
+void dump_items()
+{
+    int i;
+
+    printf("\n");
+    printf("The current module is: \n");
+
+    for(i=0; i< ql_nw_module.item_len; i++)
+    {
+        printf("%d\t%s\n", i, ql_nw_module.item_list[i].name);
+    }
+    printf("-1\texit\n");
+}
+
+int main(int argc, char *argv[])
+{
+    int ret;
+    int idx;
+
+    dump_items();
+
+    while(1)
+    {
+        printf("Please enter your choice: ");
+        ret = t_get_int(&idx);
+        printf("\n");
+        if(ret < 0)
+        {
+            printf("Invalid input\n");
+            continue;
+        }
+        else if(ret == 1)
+        {
+            dump_items();
+            continue;
+        }
+
+        if(idx == -1)
+        {
+            break;
+        }
+
+        if(idx<0 || idx>=ql_nw_module.item_len)
+        {
+            printf("Not support idx: %d\n", idx);
+            continue;
+        }
+
+        printf("->Item : %s\n", ql_nw_module.item_list[idx].name);
+        ql_nw_module.item_list[idx].handle();
+    }
+
+    return 0;
+}
+
diff --git a/mbtk/test/libql_lib_v2/ql_sim_test.c b/mbtk/test/libql_lib_v2/ql_sim_test.c
new file mode 100755
index 0000000..f71d93e
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_sim_test.c
@@ -0,0 +1,1886 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_sim_test.h 
+  @brief SIM service API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "ql_type.h"
+#include "ql_sim.h"
+#include "ql_test_utils.h"
+
+
+static void item_ql_sim_init(void)
+{
+    int ret = 0;
+    
+    printf("test ql_sim_init: ");
+    ret = ql_sim_init();
+    if(ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_deinit(void)
+{
+    int ret = 0;
+
+    printf("test ql_sim_deinit: ");
+    ret = ql_sim_deinit();
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_get_imsi(void)
+{
+    int ret = 0;
+    char imsi[QL_SIM_IMSI_LENGTH+1] = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+
+    printf("test ql_sim_get_imsi: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+    
+    ret = ql_sim_get_imsi(slot, app_type, imsi, sizeof(imsi));
+    if (ret == QL_ERR_OK)
+    {
+        printf("IMSI: %s\n", imsi);
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_get_iccid(void)
+{
+    int ret = 0;
+    char iccid[QL_SIM_ICCID_LENGTH+1] = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+
+    printf("test ql_sim_get_iccid: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+    
+    ret = ql_sim_get_iccid(slot, iccid, sizeof(iccid));
+    if (ret == QL_ERR_OK)
+    {
+        printf("ICCID: %s\n", iccid);
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_get_phone_num(void)
+{
+    int ret = 0;
+    char num[QL_SIM_PHONE_NUMBER_MAX+1] = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+
+    printf("test ql_sim_get_phone_num: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+    
+    ret = ql_sim_get_phone_num(slot, app_type, num, sizeof(num));
+    if (ret == QL_ERR_OK)
+    {
+        printf("Phone number: %s\n", num);
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void print_ascii(char *prefix, char *postfix, char *ascii, int len)
+{
+    int i = 0;
+    printf("%s", prefix);
+    for (i = 0; i < len; i++)
+    {
+        putchar(ascii[i]);
+    }
+    printf("%s",  postfix);
+}
+
+static void item_ql_sim_get_operators(void)
+{
+    int ret = 0;
+    ql_sim_operator_list_t list = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+
+    printf("test ql_sim_get_operators: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+    
+    ret = ql_sim_get_operators(slot, &list);
+    if (ret == QL_ERR_OK)
+    {
+        if (0 == list.len)
+        {
+            printf("No operators found\n");
+        }
+        else
+        {
+            int i = 0;
+            printf("found %d opertators:\n", list.len);
+            for (i = 0; i < list.len; i++)
+            {
+                printf(" #%02d: ", i + 1);
+                print_ascii("MCC: ", "", list.operators[i].mcc, (int)sizeof(list.operators[i].mcc));
+                print_ascii(", MNC: ", "\n",list.operators[i].mnc, list.operators[i].mnc_len);
+            }
+        }
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_enable_pin(void)
+{
+    int ret = 0;
+    int len = 0;
+    char c;
+    char pin_value[QL_SIM_PIN_MAX*2] = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    QL_SIM_PIN_E pin;
+
+    printf("test ql_sim_enable_pin: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter pin(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        pin = QL_SIM_PIN_1;
+    }
+    else if (2 == input)
+    {
+        pin = QL_SIM_PIN_2;
+    }
+    else
+    {
+        printf("bad pin: %d\n", input);
+        return;
+    }
+
+    printf("please enter pin value(at most %d digit): ", QL_SIM_PIN_MAX);
+    if (NULL == fgets(pin_value, sizeof(pin_value), stdin))
+    {
+        printf("can not read pin value\n");
+        return;
+    }
+    len = strlen(pin_value);
+    if ('\n' == pin_value[len-1])
+    {
+        pin_value[len-1] = 0;
+        len--;
+    }
+    printf("pin value: %s\n", pin_value);
+    
+    printf("proceed? [y/n]: ");
+    c = getchar();
+    if ('\n' != c)
+    {
+        getchar();
+    }
+    if ('Y' != c && 'y' != c)
+    {
+        printf("abort\n");
+        return;
+    }
+    
+    ret = ql_sim_enable_pin(slot, app_type, pin, pin_value);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_disable_pin(void)
+{
+    int ret = 0;
+    int len = 0;
+    char c;
+    char pin_value[QL_SIM_PIN_MAX*2] = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    QL_SIM_PIN_E pin;
+
+    printf("test ql_sim_disable_pin: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter pin(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        pin = QL_SIM_PIN_1;
+    }
+    else if (2 == input)
+    {
+        pin = QL_SIM_PIN_2;
+    }
+    else
+    {
+        printf("bad pin: %d\n", input);
+        return;
+    }
+
+    printf("please enter pin value(at most %d digit): ", QL_SIM_PIN_MAX);
+    if (NULL == fgets(pin_value, sizeof(pin_value), stdin))
+    {
+        printf("can not read pin value\n");
+        return;
+    }
+    len = strlen(pin_value);
+    if ('\n' == pin_value[len-1])
+    {
+        pin_value[len-1] = 0;
+        len--;
+    }
+    printf("pin value: %s\n", pin_value);
+    
+    printf("proceed? [y/n]: ");
+    c = getchar();
+    if ('\n' != c)
+    {
+        getchar();
+    }
+    if ('Y' != c && 'y' != c)
+    {
+        printf("abort\n");
+        return;
+    }
+    
+    ret = ql_sim_disable_pin(slot, app_type, pin, pin_value);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_verify_pin(void)
+{
+    int ret = 0;
+    int len = 0;
+    char c;
+    char pin_value[QL_SIM_PIN_MAX*2] = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    QL_SIM_PIN_E pin;
+
+    printf("test ql_sim_verify_pin: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter pin(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        pin = QL_SIM_PIN_1;
+    }
+    else if (2 == input)
+    {
+        pin = QL_SIM_PIN_2;
+    }
+    else
+    {
+        printf("bad pin: %d\n", input);
+        return;
+    }
+
+    printf("please enter pin value(at most %d digit): ", QL_SIM_PIN_MAX);
+    if (NULL == fgets(pin_value, sizeof(pin_value), stdin))
+    {
+        printf("can not read pin value\n");
+        return;
+    }
+    len = strlen(pin_value);
+    if ('\n' == pin_value[len-1])
+    {
+        pin_value[len-1] = 0;
+        len--;
+    }
+    printf("pin value: %s\n", pin_value);
+    
+    printf("proceed? [y/n]: ");
+    c = getchar();
+    if ('\n' != c)
+    {
+        getchar();
+    }
+    if ('Y' != c && 'y' != c)
+    {
+        printf("abort\n");
+        return;
+    }
+    
+    ret = ql_sim_verify_pin(slot, app_type, pin, pin_value);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_change_pin(void)
+{
+    int ret = 0;
+    int old_len = 0;
+    int new_len = 0;
+    char c;
+    char old_pin_value[QL_SIM_PIN_MAX*2] = {0};
+    char new_pin_value[QL_SIM_PIN_MAX*2] = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    QL_SIM_PIN_E pin;
+
+    printf("test ql_sim_change_pin: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter pin(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        pin = QL_SIM_PIN_1;
+    }
+    else if (2 == input)
+    {
+        pin = QL_SIM_PIN_2;
+    }
+    else
+    {
+        printf("bad pin: %d\n", input);
+        return;
+    }
+
+    printf("please enter old pin value(at most %d digit): ", QL_SIM_PIN_MAX);
+    if (NULL == fgets(old_pin_value, sizeof(old_pin_value), stdin))
+    {
+        printf("can not read old pin value\n");
+        return;
+    }
+    old_len = strlen(old_pin_value);
+    if ('\n' == old_pin_value[old_len-1])
+    {
+        old_pin_value[old_len-1] = 0;
+        old_len--;
+    }
+
+    printf("please enter new pin value(at most %d digit): ", QL_SIM_PIN_MAX);
+    if (NULL == fgets(new_pin_value, sizeof(new_pin_value), stdin))
+    {
+        printf("can not read new pin value\n");
+        return;
+    }
+    new_len = strlen(new_pin_value);
+    if ('\n' == new_pin_value[new_len-1])
+    {
+        new_pin_value[new_len-1] = 0;
+        new_len--;
+    }
+    printf("old pin value: %s\n", old_pin_value);
+    printf("new pin value: %s\n", new_pin_value);
+    
+    printf("proceed? [y/n]: ");
+    c = getchar();
+    if ('\n' != c)
+    {
+        getchar();
+    }
+    if ('Y' != c && 'y' != c)
+    {
+        printf("abort\n");
+        return;
+    }
+    
+    ret = ql_sim_change_pin(slot, app_type, pin, old_pin_value, new_pin_value);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_unblock_pin(void)
+{
+    int ret = 0;
+    int len = 0;
+    int new_len = 0;
+    char c;
+    char puk_value[QL_SIM_PIN_MAX*2] = {0};
+    char new_pin_value[QL_SIM_PIN_MAX*2] = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    QL_SIM_PIN_E pin;
+
+    printf("test ql_sim_unblock_pin: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter pin(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        pin = QL_SIM_PIN_1;
+    }
+    else if (2 == input)
+    {
+        pin = QL_SIM_PIN_2;
+    }
+    else
+    {
+        printf("bad pin: %d\n", input);
+        return;
+    }
+
+    printf("please enter puk value(at most %d digit): ", QL_SIM_PIN_MAX);
+    if (NULL == fgets(puk_value, sizeof(puk_value), stdin))
+    {
+        printf("can not read old pin value\n");
+        return;
+    }
+    len = strlen(puk_value);
+    if ('\n' == puk_value[len-1])
+    {
+        puk_value[len-1] = 0;
+        len--;
+    }
+
+    printf("please enter new pin value(at most %d digit): ", QL_SIM_PIN_MAX);
+    if (NULL == fgets(new_pin_value, sizeof(new_pin_value), stdin))
+    {
+        printf("can not read new pin value\n");
+        return;
+    }
+    new_len = strlen(new_pin_value);
+    if ('\n' == new_pin_value[new_len-1])
+    {
+        new_pin_value[new_len-1] = 0;
+        new_len--;
+    }
+    printf("    puk value: %s\n", puk_value);
+    printf("new pin value: %s\n", new_pin_value);
+    
+    printf("proceed? [y/n]: ");
+    c = getchar();
+    if ('\n' != c)
+    {
+        getchar();
+    }
+    if ('Y' != c && 'y' != c)
+    {
+        printf("abort\n");
+        return;
+    }
+    
+    ret = ql_sim_unblock_pin(slot, app_type, pin, puk_value, new_pin_value);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static char *card_state_desc(QL_SIM_CARD_STATE_E state)
+{
+    switch (state)
+    {
+        case QL_SIM_CARD_STATE_UNKNOWN:
+            return "unknown";
+        case QL_SIM_CARD_STATE_ABSENT:
+            return "absent";
+        case QL_SIM_CARD_STATE_PRESENT:
+            return "present";
+        case QL_SIM_CARD_STATE_ERROR_UNKNOWN:
+            return "unknown error";
+        case QL_SIM_CARD_STATE_ERROR_POWER_DOWN:
+            return "power down";
+        case QL_SIM_CARD_STATE_ERROR_POLL_ERROR:
+            return "poll error";
+        case QL_SIM_CARD_STATE_ERROR_NO_ATR_RECEIVED:
+            return "failed to receive an answer to reset";
+        case QL_SIM_CARD_STATE_ERROR_VOLT_MISMATCH:
+            return "voltage mismatch";
+        case QL_SIM_CARD_STATE_ERROR_PARITY_ERROR:
+            return "parity error";
+        case QL_SIM_CARD_STATE_ERROR_SIM_TECHNICAL_PROBLEMS:
+            return "technical problems";
+        default:
+            return "N/A";
+    }
+}
+
+static char *card_type_desc(QL_SIM_CARD_TYPE_E type)
+{
+    switch (type)
+    {
+        case QL_SIM_CARD_TYPE_UNKNOWN:
+            return "unknown";
+        case QL_SIM_CARD_TYPE_ICC:
+            return "ICC";
+        case QL_SIM_CARD_TYPE_UICC:
+            return "UICC";
+        default: 
+            return "N/A";
+    }
+}
+
+static char *card_subscription_desc(QL_SIM_SUBSCRIPTION_E subscription)
+{
+    switch (subscription)
+    {
+        case QL_SIM_SUBSCRIPTION_NONE:
+            return "nonprovisioning";
+        case QL_SIM_SUBSCRIPTION_PRI:
+            return "primary provisioning subscription";
+        case QL_SIM_SUBSCRIPTION_SEC:
+            return "secondary provisioning subscription";
+        default:
+            return "N/A";
+    }
+}
+
+static char *card_app_state_desc(QL_SIM_APP_STATE_E state)
+{
+    switch (state)
+    {
+        case QL_SIM_APP_STATE_UNKNOWN:
+            return "unknown";
+        case QL_SIM_APP_STATE_DETECTED:
+            return "detected";
+        case QL_SIM_APP_STATE_PIN1_REQ:
+            return "PIN1 required";
+        case QL_SIM_APP_STATE_PUK1_REQ:
+            return "PUK1 required";
+        case QL_SIM_APP_STATE_INITALIZATING:
+            return "initializing";
+        case QL_SIM_APP_STATE_PERSO_CK_REQ:
+            return "personalization control key required";
+        case QL_SIM_APP_STATE_PERSO_PUK_REQ:
+            return "personalization unblock key required";
+        case QL_SIM_APP_STATE_PERSO_PERMANENTLY_BLOCKED:
+            return "personalization is permanently blocked";
+        case QL_SIM_APP_STATE_PIN1_PERM_BLOCKED:
+            return "PIN1 is permanently blocked";
+        case QL_SIM_APP_STATE_ILLEGAL:
+            return "illegal";
+        case QL_SIM_APP_STATE_READY:
+            return "ready";
+        default:
+            return "N/A";
+    }
+}
+
+static char *card_perso_feature_desc(QL_SIM_PERSO_FEATURE_E feature)
+{
+    switch (feature)
+    {
+        case QL_SIM_PERSO_FEATURE_UNKNOWN:
+            return "unknown";
+        case QL_SIM_PERSO_FEATURE_3GPP_NETWORK:
+            return "featurization based on 3GPP MCC and MNC";
+        case QL_SIM_PERSO_FEATURE_3GPP_NETWORK_SUBSET:
+            return "featurization based on 3GPP MCC, MNC, and IMSI digits 6 and 7";
+        case QL_SIM_PERSO_FEATURE_3GPP_SERVICE_PROVIDER:
+            return "featurization based on 3GPP MCC, MNC, and GID1";
+        case QL_SIM_PERSO_FEATURE_3GPP_CORPORATE:
+            return "featurization based on 3GPP MCC, MNC, GID1, and GID2";
+        case QL_SIM_PERSO_FEATURE_3GPP_SIM:
+            return "featurization based on the 3GPP IMSI";
+        case QL_SIM_PERSO_FEATURE_3GPP2_NETWORK_TYPE_1:
+            return "featurization based on 3GPP2 MCC and MNC";
+        case QL_SIM_PERSO_FEATURE_3GPP2_NETWORK_TYPE_2:
+            return "featurization based on 3GPP2 IRM code";
+        case QL_SIM_PERSO_FEATURE_3GPP2_RUIM:
+            return "featurization based on 3GPP2 IMSI_M";
+        default:
+            return "N/A";
+    }
+}
+
+static char *card_pin_state_desc(QL_SIM_PIN_STATE_E state)
+{
+    switch (state)
+    {
+        case QL_SIM_PIN_STATE_UNKNOWN:
+            return "unknown";
+        case QL_SIM_PIN_STATE_ENABLED_NOT_VERIFIED:
+            return "PIN required, but has not been verified";
+        case QL_SIM_PIN_STATE_ENABLED_VERIFIED:
+            return "PIN required and has been verified";
+        case QL_SIM_PIN_STATE_DISABLED:
+            return "PIN not required";
+        case QL_SIM_PIN_STATE_BLOCKED:
+            return "PIN verification has failed too many times and is blocked. "
+                   "Recoverable through PUK verification";
+        case QL_SIM_PIN_STATE_PERMANENTLY_BLOCKED:
+            return "PUK verification has failed too many times and is not recoverable";
+        default:
+            return "N/A";
+    }
+}
+
+
+static void item_ql_sim_get_card_info(void)
+{
+    int ret = 0;
+    ql_sim_card_info_t info = {0};
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+
+    printf("test ql_sim_get_card_info: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+    
+    ret = ql_sim_get_card_info(slot, &info);
+    if (ret != QL_ERR_OK)
+    {
+        printf("failed, ret = %d\n", ret);
+        return;
+    }
+    printf("========= CARD INFO =========\n");
+    printf("state: %s\n", card_state_desc(info.state));
+    printf("type: %s\n", card_type_desc(info.type));
+    printf("3gpp:\n");
+    printf(" app state: %s\n", card_app_state_desc(info.app_3gpp.app_state));
+    printf(" PIN 1 retries: %hhu\n", info.app_3gpp.pin1_num_retries);
+    printf(" PUK 1 retries: %hhu\n", info.app_3gpp.puk1_num_retries);
+    printf(" PIN 2 retries: %hhu\n", info.app_3gpp.pin2_num_retries);
+    printf(" PUK 2 retries: %hhu\n", info.app_3gpp.puk2_num_retries);
+    printf("3gpp2:\n");
+    printf(" app state: %s\n", card_app_state_desc(info.app_3gpp2.app_state));
+    printf(" PIN 1 retries: %hhu\n", info.app_3gpp2.pin1_num_retries);
+    printf(" PUK 1 retries: %hhu\n", info.app_3gpp2.puk1_num_retries);
+    printf(" PIN 2 retries: %hhu\n", info.app_3gpp2.pin2_num_retries);
+    printf(" PUK 2 retries: %hhu\n", info.app_3gpp2.puk2_num_retries);
+    printf("isim:\n");
+    printf(" app state: %s\n", card_app_state_desc(info.app_isim.app_state));
+    printf(" PIN 1 retries: %hhu\n", info.app_isim.pin1_num_retries);
+    printf(" PUK 1 retries: %hhu\n", info.app_isim.puk1_num_retries);
+    printf(" PIN 2 retries: %hhu\n", info.app_isim.pin2_num_retries);
+    printf(" PUK 2 retries: %hhu\n", info.app_isim.puk2_num_retries);
+}
+
+#if 0
+static void item_ql_sim_read_file(void)
+{
+    int ret = 0;
+    int input = 0;
+    int len = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    ql_sim_file_t file = {0};
+
+    printf("test ql_sim_read_file: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter file path(at most %d hex[0·9A-F], e.g 3F002FE2): ", QL_SIM_PATH_MAX);
+    if (NULL == fgets(file.path, QL_SIM_PATH_MAX, stdin))
+    {
+        printf("can not read file path\n");
+        return;
+    }
+    len = strlen(file.path);
+    if ('\n' == file.path[len-1])
+    {
+        file.path[len-1] = 0;
+        len--;
+    }
+    file.path_len = (uint32_t)len;
+
+    printf("please enter record index(0 for transparent access): ");
+    scanf("%hhu", (uint8_t *)&file.record_idx);
+    getchar();
+    
+    ret = ql_sim_read_file(slot, app_type, &file);
+    if (ret == QL_ERR_OK)
+    {
+        printf("data length: %u\n", file.data_len);
+        uint32_t i = 0;
+        printf("data: ");
+        for (i = 0; i < file.data_len; i++)
+        {
+            printf("%02x ", file.data[i]);
+        }
+        printf("\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_write_file(void)
+{
+    int ret = 0;
+    int input = 0;
+    int len = 0;
+    uint8_t v;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    ql_sim_file_t file = {0};
+
+    printf("test ql_sim_write_file: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter file path(at most %d hex[0·9A-F], e.g 3F002FE2): ", QL_SIM_PATH_MAX);
+    if (NULL == fgets(file.path, QL_SIM_PATH_MAX, stdin))
+    {
+        printf("can not read file path\n");
+        return;
+    }
+    len = strlen(file.path);
+    if ('\n' == file.path[len-1])
+    {
+        file.path[len-1] = 0;
+        len--;
+    }
+    file.path_len = (uint32_t)len;
+
+    printf("please enter record index(0 for transparent access): ");
+    scanf("%hhu", (uint8_t *)&file.record_idx);
+    getchar();
+
+    printf("please enter data(hex, end with `q'): ");
+    while (1 == scanf("%hhx", &v))
+    {
+        file.data[file.data_len++] = v;
+    }
+    getchar();  // read `q'
+    getchar();  // read '\n'
+    
+    printf("please enter data offset: ");
+    scanf("%hu", &file.offset);
+    getchar();
+    
+    ret = ql_sim_write_file(slot, app_type, &file);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static char *file_type_desc(QL_SIM_FILE_TYPE_E type)
+{
+    switch (type)
+    {
+        case QL_SIM_FILE_TYPE_UNKNOWN:
+            return "unknown";
+        case QL_SIM_FILE_TYPE_TRANSPARENT:
+            return "transparent";
+        case QL_SIM_FILE_TYPE_CYCLIC:
+            return "cyclic";
+        case QL_SIM_FILE_TYPE_LINEAR_FIXED:
+            return "linear fixed";
+        default: 
+            return "N/A";
+    }
+}
+
+static void item_ql_sim_get_file_info(void)
+{
+    int ret = 0;
+    int input = 0;
+    int len = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    ql_sim_file_info_t info = {0};
+
+    printf("test ql_sim_get_file_info: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter file path(at most %d hex[0·9A-F], e.g 3F002FE2): ", QL_SIM_PATH_MAX);
+    if (NULL == fgets(info.path, QL_SIM_PATH_MAX, stdin))
+    {
+        printf("can not read file path\n");
+        return;
+    }
+    len = strlen(info.path);
+    if ('\n' == info.path[len-1])
+    {
+        info.path[len-1] = 0;
+        len--;
+    }
+    info.path_len = (uint32_t)len;
+    
+    ret = ql_sim_get_file_info(slot, app_type, &info);
+    if (ret == QL_ERR_OK)
+    {
+        printf("========= FILE INFO =========\n");
+        printf("path: %s\n", info.path);
+        printf("type: %s\n", file_type_desc(info.file_type));
+        printf("file size: %hu\n", info.file_size);
+        printf("record size: %hu\n", info.record_size);
+        printf("record count: %hu\n", info.record_count);
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_read_phone_book(void)
+{
+    int ret = 0;
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    uint8_t record_idx = 0;
+    ql_sim_phone_book_record_t record;
+
+    memset(&record,0,sizeof(ql_sim_phone_book_record_t));
+    printf("test ql_sim_read_phone_book: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter record index: ");
+    scanf("%hhu", &record_idx);
+    getchar();
+    
+    
+    ret = ql_sim_read_phone_book(slot, app_type, QL_SIM_PB_DEFAULT_PATH, record_idx, &record);
+    if (ret == QL_ERR_OK)
+    {
+        printf("Name: %s\n", record.name);
+        printf("Number: %s\n", record.number);
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_write_phone_book(void)
+{
+    int ret = 0;
+    int input = 0;
+    int len = 0;
+    QL_SIM_SLOT_E slot;
+    QL_SIM_APP_TYPE_E app_type;
+    uint8_t record_idx = 0;
+    ql_sim_phone_book_record_t record;
+
+    memset(&record,0,sizeof(ql_sim_phone_book_record_t));
+    printf("test ql_sim_write_phone_book: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
+    scanf("%d", &input);
+    getchar();
+    switch (input)
+    {
+        case 0:
+            app_type = QL_SIM_APP_TYPE_UNKNOWN;
+            break;
+        case 1:
+            app_type = QL_SIM_APP_TYPE_3GPP;
+            break;
+        case 2:
+            app_type = QL_SIM_APP_TYPE_3GPP2;
+            break;
+        case 3:
+            app_type = QL_SIM_APP_TYPE_ISIM;
+            break;
+        default:
+            printf("bad app type: %d\n", input);
+            return;
+    }
+
+    printf("please enter record index: ");
+    scanf("%hhu", &record_idx);
+    getchar();
+
+    printf("please enter name(at most %d chars): ", QL_SIM_PHONE_BOOK_NAME_MAX - 1);
+    if (NULL == fgets(record.name, QL_SIM_PHONE_BOOK_NAME_MAX, stdin))
+    {
+        printf("\nname will be set to 0\n");
+    }
+    else
+    {
+        len = strlen(record.name);
+        if ('\n' == record.name[len-1])
+        {
+            record.name[len-1] = 0;
+        }
+    }
+    
+
+    printf("please enter number(at most %d digits): ", QL_SIM_PHONE_BOOK_NUMBER_MAX - 1);
+    if (NULL == fgets(record.number, QL_SIM_PHONE_BOOK_NUMBER_MAX, stdin))
+    {
+        printf("\nnumber will be set to 0\n");
+    }
+    else
+    {
+        len = strlen(record.number);
+        if ('\n' == record.number[len-1])
+        {
+            record.number[len-1] = 0;
+        }
+    }
+    
+    ret = ql_sim_write_phone_book(slot, app_type, QL_SIM_PB_DEFAULT_PATH, record_idx, &record);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_open_logical_channel(void)
+{
+    int ret = 0;
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    uint8_t channel_id = 0;
+
+    printf("test ql_sim_open_logical_channel: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+    
+    ret = ql_sim_open_logical_channel(slot, &channel_id);
+    if (ret == QL_ERR_OK)
+    {
+        printf("channel id: %hhu\n", channel_id);
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_close_logical_channel(void)
+{
+    int ret = 0;
+    int input = 0;
+    QL_SIM_SLOT_E slot;
+    uint8_t channel_id = 0;
+
+    printf("test ql_sim_close_logical_channel: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+
+    printf("please enter channel id: ");
+    scanf("%hhu", &channel_id);
+    getchar();
+    
+    ret = ql_sim_close_logical_channel(slot, channel_id);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+static void item_ql_sim_send_apdu(void)
+{
+    int ret = 0;
+    int input = 0;
+    uint8_t v = 0;
+    QL_SIM_SLOT_E slot;
+    ql_sim_apdu_t *p_apdu = NULL;
+    uint8_t channel_id = 0;
+
+    printf("test ql_sim_send_apdu: \n");
+
+    p_apdu = calloc(1, sizeof(*p_apdu));
+    if (NULL == p_apdu)
+    {
+        printf("run out of memory\n");
+        return;
+    }
+    
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        slot = QL_SIM_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        slot = QL_SIM_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        free(p_apdu);
+        p_apdu = NULL;
+        return;
+    }
+
+    printf("please enter channel id: ");
+    scanf("%hhu", &channel_id);
+    getchar();
+
+    printf("please enter apdu data(hex, end with `q'): ");
+    while (1 == scanf("%hhx", &v))
+    {
+        p_apdu->req_apdu[p_apdu->req_apdu_len++] = v;
+    }
+    getchar();  // read `q'
+    getchar();  // read '\n'
+    
+    ret = ql_sim_send_apdu(slot, channel_id, p_apdu);
+    if (ret == QL_ERR_OK)
+    {
+        uint32_t i = 0;
+        printf("repsonse apdu: ");
+        for (i = 0; i < p_apdu->resp_apdu_len; i++)
+        {
+            printf("%c", p_apdu->resp_apdu[i]);
+        }
+        printf("\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+    free(p_apdu);
+    p_apdu = NULL;
+}
+#endif
+
+static void sim_card_status_cb(int slot, ql_sim_card_info_t *p_info)
+{
+    printf("========= CARD STATUS =========\n");
+    switch (slot)
+    {
+        case 0:
+            printf("slot: invalid\n");
+            break;
+        case 1:
+            printf("slot: 1\n");
+            break;
+        case 2:
+            printf("slot: 2\n");
+            break;
+    }
+    
+    if (NULL == p_info)
+    {
+        printf("status: unavailable\n");
+        return;
+    }
+    
+    printf("state: %s\n", card_state_desc(p_info->state));
+    printf("type: %s\n", card_type_desc(p_info->type));
+    printf("3gpp:\n");
+    printf(" app state: %s\n", card_app_state_desc(p_info->app_3gpp.app_state));
+    printf(" PIN 1 retries: %hhu\n", p_info->app_3gpp.pin1_num_retries);
+    printf(" PUK 1 retries: %hhu\n", p_info->app_3gpp.puk1_num_retries);
+    printf(" PIN 2 retries: %hhu\n", p_info->app_3gpp.pin2_num_retries);
+    printf(" PUK 2 retries: %hhu\n", p_info->app_3gpp.puk2_num_retries);
+    printf("3gpp2:\n");
+    printf(" app state: %s\n", card_app_state_desc(p_info->app_3gpp2.app_state));
+    printf(" PIN 1 retries: %hhu\n", p_info->app_3gpp2.pin1_num_retries);
+    printf(" PUK 1 retries: %hhu\n", p_info->app_3gpp2.puk1_num_retries);
+    printf(" PIN 2 retries: %hhu\n", p_info->app_3gpp2.pin2_num_retries);
+    printf(" PUK 2 retries: %hhu\n", p_info->app_3gpp2.puk2_num_retries);
+    printf("isim:\n");
+    printf(" app state: %s\n", card_app_state_desc(p_info->app_isim.app_state));
+    printf(" PIN 1 retries: %hhu\n", p_info->app_isim.pin1_num_retries);
+    printf(" PUK 1 retries: %hhu\n", p_info->app_isim.puk1_num_retries);
+    printf(" PIN 2 retries: %hhu\n", p_info->app_isim.pin2_num_retries);
+    printf(" PUK 2 retries: %hhu\n", p_info->app_isim.puk2_num_retries);
+}
+
+static void item_ql_sim_set_card_status_cb(void)
+{
+    int ret = 0;
+
+    printf("test ql_sim_set_card_status_cb: ");
+    ret = ql_sim_set_card_status_cb((ql_sim_card_status_cb_f)sim_card_status_cb);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void sim_servicie_error_cb(int error)
+{
+    printf("===== SIM Service Abort =====\n");
+}
+
+void item_ql_sim_set_service_error_cb(void)
+{
+    int ret = 0;
+    printf("test ql_sim_set_service_error_cb: \n");
+
+    ret = ql_sim_set_service_error_cb(sim_servicie_error_cb);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+#if 0
+void item_ql_sim_switch_slot(void)
+{
+    int ret = 0;
+    int input = 0;
+    QL_SIM_PHY_SLOT_E phy_slot = 0;
+    printf("test item_ql_sim_switch_slot: \n");
+    printf("please enter slot(1 or 2): ");
+    scanf("%d", &input);
+    getchar();
+    if (1 == input)
+    {
+        phy_slot = QL_SIM_PHY_SLOT_1;
+    }
+    else if (2 == input)
+    {
+        phy_slot = QL_SIM_PHY_SLOT_2;
+    }
+    else
+    {
+        printf("bad slot: %d\n", input);
+        return;
+    }
+    ret = ql_sim_switch_slot(QL_SIM_SLOT_1, phy_slot);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+}
+
+void item_ql_sim_get_active_slots(void)
+{
+    int ret = 0;
+    ql_sim_active_slots_t *p_active_slots = (ql_sim_active_slots_t *)malloc(sizeof(ql_sim_active_slots_t));
+    if (p_active_slots == NULL) {  
+        printf("Memory allocation failed.\n");  
+        return -1;  
+    }
+    p_active_slots->active_slots_len = 0;
+    p_active_slots->active_slots[0] = 0;
+    printf("test item_ql_sim_get_active_slots: \n");
+    ret = ql_sim_get_active_slots(p_active_slots);
+    if (ret == QL_ERR_OK)
+    {
+        printf("ok\n");
+	printf("p_active_slots(QL_SIM_PHY_SLOT_1/2 = B01/B02) = %X \n",p_active_slots->active_slots[0]);
+    }
+    else
+    {
+        printf("failed, ret = %d\n", ret);
+    }
+    free(p_active_slots);
+}
+#endif
+
+static t_item_t ql_sim_items[] =
+{
+    {"ql_sim_init", item_ql_sim_init},
+    {"ql_sim_get_imsi", item_ql_sim_get_imsi},
+    {"ql_sim_get_iccid", item_ql_sim_get_iccid},
+    {"ql_sim_get_phone_num", item_ql_sim_get_phone_num},
+    {"ql_sim_get_operators", item_ql_sim_get_operators},
+    {"ql_sim_enable_pin", item_ql_sim_enable_pin},
+    {"ql_sim_disable_pin", item_ql_sim_disable_pin},
+    {"ql_sim_verify_pin", item_ql_sim_verify_pin},
+    {"ql_sim_change_pin", item_ql_sim_change_pin},
+    {"ql_sim_unblock_pin", item_ql_sim_unblock_pin},
+    {"ql_sim_get_card_info", item_ql_sim_get_card_info},
+//    {"ql_sim_read_file", item_ql_sim_read_file},
+//    {"ql_sim_write_file", item_ql_sim_write_file},
+//    {"ql_sim_get_file_info", item_ql_sim_get_file_info},
+//    {"ql_sim_read_phone_book", item_ql_sim_read_phone_book},
+//   {"ql_sim_write_phone_book", item_ql_sim_write_phone_book},
+//    {"ql_sim_open_logical_channel", item_ql_sim_open_logical_channel},
+//    {"ql_sim_close_logical_channel", item_ql_sim_close_logical_channel},
+//    {"ql_sim_send_apdu", item_ql_sim_send_apdu},
+    {"ql_sim_set_card_status_cb", item_ql_sim_set_card_status_cb},
+    {"ql_sim_set_service_error_cb", item_ql_sim_set_service_error_cb},
+//    {"ql_sim_switch_slot", item_ql_sim_switch_slot},
+//    {"ql_sim_get_active_slots", item_ql_sim_get_active_slots},
+    {"ql_sim_deinit", item_ql_sim_deinit},
+};
+
+t_module_t ql_sim_module =
+{
+    "sim",
+    T_ARRAY_SIZE(ql_sim_items),
+    ql_sim_items
+};
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a int value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int(int *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if(NULL == fgets(buf, sizeof(buf)-1, stdin))
+    {
+        return -1;
+    }
+#if 0    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+#endif
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 10);
+    if(ptr_end!=NULL && ptr_end[0]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = dat;
+    }
+
+    return 0;
+}
+
+void dump_items()
+{
+    int i;
+
+    printf("\n");
+    printf("The current module is: \n");
+
+    for(i=0; i< ql_sim_module.item_len; i++)
+    {
+        printf("%d\t%s\n", i, ql_sim_module.item_list[i].name);
+    }
+    printf("-1\texit\n");
+}
+
+int main(int argc, char *argv[])
+{
+    int ret;
+    int idx;
+
+    dump_items();
+
+    while(1)
+    {
+        printf("Please enter your choice: ");
+        ret = t_get_int(&idx);
+        printf("\n");
+        if(ret < 0)
+        {
+            printf("Invalid input\n");
+            continue;
+        }
+        else if(ret == 1)
+        {
+            dump_items();
+            continue;
+        }
+
+        if(idx == -1)
+        {
+            break;
+        }
+
+        if(idx<0 || idx>=ql_sim_module.item_len)
+        {
+            printf("Not support idx: %d\n", idx);
+            continue;
+        }
+
+        printf("->Item : %s\n", ql_sim_module.item_list[idx].name);
+        ql_sim_module.item_list[idx].handle();
+    }
+
+    return 0;
+}
+
+
+
diff --git a/mbtk/test/libql_lib_v2/ql_sleep_wakelock_test.c b/mbtk/test/libql_lib_v2/ql_sleep_wakelock_test.c
new file mode 100755
index 0000000..0303c72
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_sleep_wakelock_test.c
@@ -0,0 +1,157 @@
+#include "ql_sleep_wakelock.h"
+#include "ql_lpm.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stddef.h>
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+
+static void ql_lpm_handler(ql_lpm_edge_t edge_state)
+{
+    printf("this is ql_lpm_handler, edge_state=%d\n", edge_state);
+}
+
+int main(int argc, char *argv[])
+{
+    char operator[10];
+    int opt;
+    int lv_voll = 0;
+    int fd_t;
+    mbtk_log_init("radio", "SLEEP_TEST");
+
+    printf("=========ql sleep main=========\n"
+        "\t0 exit\n"
+        "\t1 autosuspend enable\n"
+        "\t2 wakelock create\n"
+        "\t3 wakelock lock\n"
+        "\t4 wakelock unlock\n"
+        "\t5 wakelock destroy\n"
+	    "\t6 lpm init\n"
+        "\t7 lpm deinit\n"	
+        "operator: >> \n");
+
+    while(1)
+    {
+        fgets(operator, sizeof(operator), stdin);
+        fflush(stdin);
+        opt = atoi(operator);
+        switch (opt)
+        {
+        case 0:
+            printf("main exit\n");
+            return 0;
+        case 1:
+            {
+                printf(">>>>>Input 0 or 1<<<<<\n");
+                char tmp_en[4]={0};
+                memset(tmp_en, 0x00, sizeof(tmp_en));
+                fgets(tmp_en, sizeof(tmp_en)-1, stdin);
+                fflush(stdin);
+
+                if (tmp_en[0] == '0' || tmp_en[0] == '1')
+                    ql_autosleep_enable(tmp_en[0]);
+                else
+                    printf(">>>>>re Input 0 or 1 error<<<<<\n");
+            }
+            break;
+        case 2:
+            {
+                printf(">>>>>Input name<<<<<\n");
+                char t_name[64]={0};
+                int len_name;
+                char tmp_c[64]={0};
+                memset(tmp_c, 0x00, sizeof(tmp_c));
+                fgets(tmp_c, sizeof(tmp_c)-1, stdin);
+                fflush(stdin);
+                len_name = strlen(tmp_c)-1;
+                strncpy(t_name, tmp_c, len_name);
+                printf(">>>>>name=[%s] name_len=[%d]<<<<<\n",t_name, len_name);
+
+                fd_t = ql_slp_wakelock_create(t_name, len_name);
+                if (fd_t == -1)
+                {
+                    printf(">>>>>Output error =[%d]<<<<<\n",fd_t);
+                }
+                else
+                {
+                    printf(">>>>>Output ID NUM =[%d]<<<<<\n",fd_t);
+                }
+            }
+            break;
+        case 3:
+            {
+                printf(">>>>>Input ID NUM<<<<<\n");
+                char tmp_l[127]={0};
+                fgets(tmp_l, sizeof(tmp_l), stdin);
+                fflush(stdin);
+                fd_t = atoi(tmp_l);
+                fd_t = ql_slp_wakelock_lock(fd_t);
+                if (fd_t == -1)
+                {
+                    printf(">>>>>Output error =[%d]<<<<<\n",fd_t);
+                }
+                else
+                {
+                    printf(">>>>>Output succuess<<<<<\n");
+                }
+            }
+            break;
+        case 4:
+            {
+                printf(">>>>>Input ID NUM<<<<<\n");
+                char tmp_ul[127]={0};
+                memset(tmp_ul, 0x00, sizeof(tmp_ul));
+                fgets(tmp_ul, sizeof(tmp_ul)-1, stdin);
+                fflush(stdin);
+                fd_t = atoi(tmp_ul);
+                fd_t = ql_slp_wakelock_unlock(fd_t);
+                if (fd_t == -1)
+                {
+                    printf(">>>>>Output error =[%d]<<<<<\n",fd_t);
+                }
+                else
+                {
+                    printf(">>>>>Output succuess<<<<<\n");
+                }
+            }
+            break;
+        case 5:
+            {
+                printf(">>>>>Input ID NUM<<<<<\n");
+                char tmp_d[127]={0};
+                memset(tmp_d, 0x00, sizeof(tmp_d));
+                fgets(tmp_d, sizeof(tmp_d)-1, stdin);
+                fflush(stdin);
+                fd_t = atoi(tmp_d);
+                fd_t = ql_slp_wakelock_destroy(fd_t);
+                if (fd_t == -1)
+                {
+                    printf(">>>>>Output error =[%d]<<<<<\n",fd_t);
+                }
+                else
+                {
+                    printf(">>>>>Output succuess<<<<<\n");
+                }
+            }
+            break;
+        case 6:
+            {
+				int ret;
+				ret = ql_lpm_init(ql_lpm_handler);
+				printf("ql lpm init, ret: %d\n", ret);		
+            }
+            break;
+        case 7:
+            ql_lpm_deinit();
+            break;
+			
+        default:
+            break;
+        }
+
+    }
+
+    return 0;
+}
+
diff --git a/mbtk/test/libql_lib_v2/ql_sms_test.c b/mbtk/test/libql_lib_v2/ql_sms_test.c
new file mode 100755
index 0000000..1ebdde2
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_sms_test.c
@@ -0,0 +1,162 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include "ql_sms.h"
+#include "mbtk_log.h"
+
+
+
+void sms_msg_recv_cb(ql_sms_msg_t *p_msg, ql_sms_timestamp_t *timestamp,
+                                             ql_sms_user_data_head_t *head)
+{
+    printf("sms_msg_recv_cb succeess!\n");
+    printf("format: %d, addr:%s, content_size:%d, content:%s\n", p_msg->format, p_msg->addr, p_msg->content_size, p_msg->content);
+    printf("timestamp: %d-%d-%d %d:%d:%d\n", timestamp->year, timestamp->month, timestamp->day, timestamp->hours, timestamp->minutes, timestamp->seconds);
+}
+
+void sms_servicie_error_cb(int error)
+{
+    printf("===== SMS Service Abort =====\n");
+}
+
+void sms_msg_async_cb_f(int id, int result)
+{
+    printf("===== sms_msg_recv_cb =====\n");
+}
+
+
+
+
+int main(int argc, char *argv[])
+{
+    char operator[10];
+    int opt;
+    int ret;
+//    int sms;
+//    int direction;
+//    int value;
+//    int pullsel;
+
+	mbtk_log_init("radio", "SMS_TEST");
+
+    printf("=========ql sms main=========\n"
+        "\t0 exit\n"
+        "\t1 sms init\n"
+		"\t2 sms deinit\n"
+        "\t3 sms set msg recv cb\n"
+        "\t4 sms set ser error cb\n"
+        "\t5 sms send msg async\n"
+        "operator: >> \n");
+
+    while(1)
+    {
+		memset(operator, 0, sizeof(operator));
+        if(NULL == fgets(operator, sizeof(operator), stdin))
+            break;
+        fflush(stdin);
+        opt = atoi(operator);
+        switch (opt)
+        {
+        case 0:
+            printf("main exit\n");
+            return 0;
+        case 1:
+            {
+                printf(">>>>>sms init\n");
+				ret = ql_sms_init();
+				if(ret != 0)
+				{
+					printf("ql_sms_init fail\n");
+				}
+				else
+				{
+					printf("ql_sms_init success\n");
+				}
+            }
+            break;
+        case 2:
+            {
+				printf(">>>>>sms uninit\n");
+
+				ret = ql_sms_deinit();
+				if(ret != 0)
+				{
+					printf("ql_sms_uninit fail\n");
+					printf("ret=%d\n", ret);
+				}
+				else
+				{
+					printf("ql_sms_uninit success\n");
+
+				}
+            }
+            break;
+        case 3:
+            {
+                printf(">>>>>Input set recv cb<<<<<\n");
+
+				ret = ql_sms_set_msg_recv_cb(sms_msg_recv_cb);
+				if(ret != 0)
+				{
+					printf("ql_sms_set_msg_recv_cb fail\n");
+				}
+				else
+				{
+					printf("ql_sms_set_msg_recv_cb success\n");
+				}
+
+            }
+            break;
+        case 4:
+            {
+                printf(">>>>>Input set ser cb<<<<<\n");
+
+			    ret = ql_sms_set_service_error_cb(sms_servicie_error_cb);
+				if(ret < 0)
+				{
+					printf("ql_sms_set_service_error_cb fail\n");
+				}
+				else
+				{
+					printf("ql_sms_set_service_error_cb success\n");
+				}
+
+            }
+            break;
+        case 5:
+            {
+                printf(">>>>>Input send msg<<<<<\n");
+
+                ql_sms_msg_t    sms_msg = {0};
+                int id = 0;
+                char addr[128] = "19130850401";
+                char content[128] = "hello";
+                sms_msg.format = 1;
+                memcpy(sms_msg.addr, addr, strlen(addr));
+                sms_msg.content_size = strlen(content);
+                memcpy(sms_msg.content, content, strlen(content));
+
+
+                ret = ql_sms_send_msg_async(&sms_msg, &id, sms_msg_async_cb_f);
+				if(ret < 0)
+				{
+					printf("ql_sms_send_msg_async fail\n");
+				}
+				else
+				{
+					printf("ql_sms_send_msg_async success\n");
+				}
+            }
+            break;
+
+
+        default:
+            break;
+        }
+
+    }
+
+    return 0;
+
+}
diff --git a/mbtk/test/libql_lib_v2/ql_test_abfota.c b/mbtk/test/libql_lib_v2/ql_test_abfota.c
new file mode 100755
index 0000000..04ef676
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_test_abfota.c
@@ -0,0 +1,570 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <time.h>
+#include <errno.h>
+#include <pthread.h>
+#include "ql_fota_api.h"
+#include "fota_info.h"
+#include "ql_fota.h"
+//#include "ql_fota_log.h"
+#include "ql_absys_api.h"
+//#include "test_utils.h"
+
+
+typedef void (*item_handler_f)(void);
+typedef int (*init_handler_f)(void);
+typedef int (*deinit_handler_f)(void);
+
+
+#define T_ARRAY_SIZE(items) (sizeof(items)/sizeof(items[0]))
+
+typedef struct
+{
+    const char *name;
+    item_handler_f handle;
+} t_item_t;
+
+typedef struct
+{
+    const char *name;
+    int item_len;
+    t_item_t *item_list;
+} t_module_t;
+
+typedef struct
+{
+    const char *name;
+    init_handler_f init_handle;
+    deinit_handler_f deinit_handle;
+} t_init_t;
+
+int t_get_int(int *val);
+int t_get_hex(uint32_t *val);
+int t_get_char(int *val);
+int t_get_string(char *str_buf, int str_len);
+int t_get_int_list(int *dat_buf, int *dat_len);
+int t_get_float_list(float *dat_buf, int *dat_len);
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a int value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int(int *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if(NULL == fgets(buf, sizeof(buf)-1, stdin))
+    {
+        return -1;
+    }
+    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 10);
+    if(ptr_end!=NULL && ptr_end[0]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = dat;
+    }
+
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a uint32 value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_hex(uint32_t *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 16);
+    if(ptr_end!=NULL && ptr_end[0]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = dat;
+    }
+
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a char value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_char(int *val)
+{
+    char buf[256] = {0};
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    if(buf[1]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = buf[0];
+    }
+
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a string value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_string(char *str_buf, int str_len)
+{
+    char *ptr;
+    char buf[256] = {0};
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+    
+    ptr = strchr(buf, '\n');
+    if(ptr)
+    {
+        ptr[0] = 0;
+    }
+    
+    strncpy(str_buf, buf, str_len-1);
+    
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a list of int values from stdin 
+  @param[out] val, Return read datas
+  @param[out&in] val, Input buffer length, output the number of read
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int_list(int *dat_buf, int *dat_len)
+{
+    int idx = 0;
+    int len;
+    int dat;
+    char *ptr, *ptr_save;
+    char *ptr_end;
+    char buf[256] = {0};
+
+    if(!dat_buf || !dat_len)
+    {
+        return -1;
+    }
+
+    len = dat_len[0];
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    for(ptr=strtok_r(buf, ",.: \t\r\n", &ptr_save); 
+            ptr!=NULL;
+            ptr=strtok_r(NULL, ",.: \t\r\n", &ptr_save))
+    {
+        dat = strtol(ptr, &ptr_end, 10);
+        if(ptr_end!=NULL && ptr_end[0]!=0)
+        {
+            return -1;
+        }
+        if(idx >= len)
+        {
+            return 0;
+        }
+
+        dat_buf[idx] = dat;
+        idx++;
+    }
+    
+    dat_len[0] = idx;
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a list of float values from stdin 
+  @param[out] val, Return read datas
+  @param[out&in] val, Input buffer length, output the number of read
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_float_list(float *dat_buf, int *dat_len)
+{
+    int idx = 0;
+    int len;
+    float dat;
+    char *ptr, *ptr_save;
+    char *ptr_end;
+    char buf[256] = {0};
+
+    if(!dat_buf || !dat_len)
+    {
+        return -1;
+    }
+
+    len = dat_len[0];
+
+    if(fgets(buf, sizeof(buf)-1, stdin) == NULL)
+    {
+        return -1;
+    }
+
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    for(ptr=strtok_r(buf, ",: \t\r\n", &ptr_save); 
+            ptr!=NULL;
+            ptr=strtok_r(NULL, ",: \t\r\n", &ptr_save))
+    {
+        dat = strtof(ptr, &ptr_end);
+        if(ptr_end!=NULL && ptr_end[0]!=0)
+        {
+            return -1;
+        }
+        if(idx >= len)
+        {
+            return 0;
+        }
+
+        dat_buf[idx] = dat;
+        idx++;
+    }
+    
+    dat_len[0] = idx;
+    return 0;
+}
+#if 0
+#define DEBUG_INFO
+#ifdef DEBUG_INFO
+#define LOG_DBG(fmt, ...) printf("[DBG][%s_%d][%ld] "fmt"\n", __FUNCTION__, __LINE__, time(NULL), ##__VA_ARGS__)
+#else
+#define LOG_DBG(fmt, ...)
+#endif
+#define LOG_ERR(fmt, ...) printf("[DBG][%s_%d][%ld] "fmt"\n", __FUNCTION__, __LINE__, time(NULL), ##__VA_ARGS__)
+#endif
+
+#define ITEM_NUM (sizeof(g_items)/sizeof(g_items[0]))
+
+void test_ota_api_start(void);
+void test_get_fota_upgrade_info(void);
+void test_ql_absys_switch(void);
+void test_ql_absys_get_cur_active_part(void);
+void test_ql_absys_sync(void);
+void test_ql_absys_getstatus(void);
+void test_ql_fota_fw_write_by_url(void);
+
+t_item_t g_items[] = {
+    {"API : ql_abfota_start_update", test_ota_api_start},
+    {"API : ql_abfota_get_update_status", test_get_fota_upgrade_info},
+	{"API : ql_absys_switch", test_ql_absys_switch},
+	{"API : ql_absys_sync", test_ql_absys_sync},
+	{"API : ql_absys_get_cur_active_part", test_ql_absys_get_cur_active_part},
+	{"API : ql_absys_getstatus", test_ql_absys_getstatus}
+};
+
+void dump_items(void)
+{
+    int i;
+
+    printf("\n");
+
+    for(i=0; i<ITEM_NUM; i++)
+    {
+        printf("%d\t%s\n", i, g_items[i].name);
+    }
+    printf("-1\texit\n");
+}
+
+int main(int argc, const char **argv)
+{
+	int ret = -1;
+    int idx = 0;
+
+    printf("Quectel OTA API test sample, version : v0.0.1\n");
+
+	dump_items();
+
+	while(1) {
+        printf("Please enter your choice: ");
+        ret = t_get_int(&idx);
+        printf("\n");
+        if(ret < 0) {
+            printf("Invalid input\n");
+            continue;
+        } else if(ret == 1) {
+            dump_items();
+            continue;
+        }
+
+        if(idx == -1) {
+            break;
+        }
+
+        if(idx<0 || idx>=ITEM_NUM) {
+            printf("Not support idx: %d\n", idx);
+            continue;
+        }
+
+        g_items[idx].handle();
+    }
+    return 0;
+}
+
+void test_ota_api_start(void)
+{
+    char package_file[128] = {0};
+    int ret = -1;
+
+    printf("please input the fota fbf package file dir: \n");
+	printf("eg: /user_data/\n");
+	//fota包同时已经放入该路径下
+	memset(package_file, 0x0, sizeof(package_file));
+	scanf("%s", package_file);
+	fflush(stdin);
+    ret = t_get_string((char*)package_file, sizeof(package_file));
+    if (ret < 0 || package_file[0] == 0) {
+        printf("Invalid package file\n");
+        return;
+    }
+
+    ret = ql_abfota_start_update((char*)package_file);
+
+    if (ret != 0) {
+        printf("run ql_abfota_start_update failed, api return: %d\n", ret);
+        return;
+    }
+
+    printf("Update in-active partition SUCCEED\n");
+    return;
+}
+
+void test_ql_absys_getstatus(void)
+{
+    int status = 0;
+//    char stat_buf[16] = {0};
+    sysstatus_t sys_state;
+    status = ql_absys_getstatus(&sys_state);
+    if (status < 0) {
+        printf("failed to get absys status!!!\n");
+        return;
+    }
+
+	if (sys_state.is_damaged == 0)
+	{
+		printf("absys partition status : succeed\n");
+	}
+	else
+	{
+		printf("absys partition status : damaged\n");
+		printf("absys partition damaged position : %s\n", sys_state.damaged_partname);
+		printf("absys needsync!!!\n");
+	}
+    return;
+}
+
+
+void test_get_fota_upgrade_info(void)
+{   
+    int ret = -1;
+    char stat_buf[16] = {0};
+    update_info_t update_info;
+    ret = ql_abfota_get_update_status(&update_info);
+    if ( ret != 0) {
+        printf("run ql_abfota_start_update failed, api return: %d\n", ret);
+        return;
+    }
+
+    memset(stat_buf, 0, sizeof(stat_buf));
+
+    switch (update_info.ota_state) {
+        case SUCCEED:
+            strncpy(stat_buf, "SUCCEED", strlen("SUCCEED")+1);
+        break;
+        case UPDATE:
+            strncpy(stat_buf, "UPDATE", strlen("UPDATE")+1);
+        break;
+        case BACKUP:
+            strncpy(stat_buf, "BACKUP", strlen("BACKUP")+1);
+        break;
+        case FAILED:
+            strncpy(stat_buf, "FAILED", strlen("FAILED")+1);
+        break;
+        case WRITEDONE:
+            strncpy(stat_buf, "WRITEDONE", strlen("WRITEDONE")+1);
+        break;
+        case NEEDSYNC:
+            strncpy(stat_buf, "NEEDSYNC", strlen("NEEDSYNC")+1);
+        break;
+        case UNKNOWN_STATUS:
+        default:
+            strncpy(stat_buf, "UNKNOWN_STATUS", strlen("UNKNOWN_STATUS")+1);
+        break;
+    }
+
+	printf("Current fota progress: %d\n", update_info.percentage);
+    printf("Current fota state: %s\n", stat_buf);
+    printf("Current fota exit code: %d\n", update_info.exit_code);
+
+    return;
+}
+
+void test_ql_absys_switch(void)
+{
+    int ret = -1;
+    ret = ql_absys_switch();
+    if (ret != 0) {           
+        printf("run ql_absys_switch failed, api return: %d\n", ret);
+        return;               
+    }  
+
+    printf("It is okay to swith AB part to run\n");
+    sleep(1);
+
+    system("reboot");
+    return;
+}
+
+
+void test_ql_absys_sync(void) 
+{
+    int ret = -1;             
+
+    ret = ql_absys_sync();    
+    if (ret != 0) {
+        printf("run ql_absys_sync failed, api return: %d\n", ret);
+        return;
+    }            
+
+    printf("do AB sync succeed\n");
+    return;
+}
+
+
+void test_ql_absys_get_cur_active_part(void)
+{
+    int ret = -1;
+    absystem_t cur_system;
+
+    ret = ql_absys_get_cur_active_part(&cur_system);
+    if (ret != 0) {
+        printf("run ql_absys_get_cur_active_part failed, api return: %d\n", ret);
+        return;
+    }
+
+    printf("Current active part is %c\n", (cur_system ? 'B': 'A'));
+    return;
+}
\ No newline at end of file
diff --git a/mbtk/test/libql_lib_v2/ql_test_utils.h b/mbtk/test/libql_lib_v2/ql_test_utils.h
new file mode 100755
index 0000000..2f6aa93
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_test_utils.h
@@ -0,0 +1,140 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_test_utils.h 
+  @brief Test related interface definition
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2018 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20190508   tyler.kuang  Created .
+-------------------------------------------------------------------------------------------------*/
+
+#ifndef __TEST_UTILS_H__
+#define  __TEST_UTILS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+typedef void (*item_handler_f)(void);
+typedef int (*init_handler_f)(void);
+typedef int (*deinit_handler_f)(void);
+
+
+#define T_ARRAY_SIZE(items) (sizeof(items)/sizeof(items[0]))
+
+typedef struct
+{
+    const char *name;
+    item_handler_f handle;
+} t_item_t;
+
+typedef struct
+{
+    const char *name;
+    int item_len;
+    t_item_t *item_list;
+} t_module_t;
+
+typedef struct
+{
+    const char *name;
+    init_handler_f init_handle;
+    deinit_handler_f deinit_handle;
+} t_init_t;
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a int value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int(int *val);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a uint32 value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int t_get_hex(uint32_t *val);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a char value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int t_get_char(int *val);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a string value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int t_get_string(char *str_buf, int str_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a list of int values from stdin 
+  @param[out] val, Return read datas
+  @param[out&in] val, Input buffer length, output the number of read
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int t_get_int_list(int *dat_buf, int *dat_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a list of float values from stdin 
+  @param[out] val, Return read datas
+  @param[out&in] val, Input buffer length, output the number of read
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int t_get_float_list(float *dat_buf, int *dat_len);
+
+
+#ifdef __cplusplus
+} 
+#endif
+
+#endif
+
diff --git a/mbtk/test/libql_lib_v2/ql_voice_test.c b/mbtk/test/libql_lib_v2/ql_voice_test.c
new file mode 100755
index 0000000..61a6cc3
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_voice_test.c
@@ -0,0 +1,236 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include "ql_voice.h"
+
+
+
+void voice_call_cb(ql_voice_record_array_t *p_arr)
+{
+
+    printf("len1-voice_call_cb-id:%d, number:%s, state:%d, tech:%d, dir:%d, end_reason:%d\n", p_arr->records[0].id, p_arr->records[0].number, p_arr->records[0].state, p_arr->records[0].tech,
+                     p_arr->records[0].dir, p_arr->records[0].end_reason);
+    if(2 == p_arr->len)
+    {
+    printf("len2-id:%d, number:%s, state:%d, tech:%d, dir:%d, end_reason:%d\n", p_arr->records[1].id, p_arr->records[1].number, p_arr->records[1].state, p_arr->records[1].tech,
+                                    p_arr->records[1].dir, p_arr->records[1].end_reason);
+    }
+}
+
+void voice_servicie_error_cb(int error)
+{
+    printf("===== voice Service Abort =====\n");
+}
+
+
+
+
+
+
+int main(int argc, char *argv[])
+{
+    char operator[10];
+    int opt;
+    int ret;
+    int voice;
+    int direction;
+    int value;
+    int pullsel;
+
+	mbtk_log_init("radio", "voice_TEST");
+
+    printf("=========ql voice main=========\n"
+        "\t0 exit\n"
+        "\t1 voice init\n"
+		"\t2 voice deinit\n"
+        "\t3 voice set call cb\n"
+        "\t4 voice set ser error cb\n"
+        "\t5 voice dial\n"
+        "\t6 voice hangup all\n"
+        "\t7 voice answer\n"
+        "\t8 voice get records\n"
+        "\t9 voice send dtmf char\n"
+        "operator: >> \n");
+
+    while(1)
+    {
+		memset(operator, 0, sizeof(operator));
+        fgets(operator, sizeof(operator), stdin);
+        fflush(stdin);
+        opt = atoi(operator);
+        switch (opt)
+        {
+        case 0:
+            printf("main exit\n");
+            return 0;
+        case 1:
+            {
+                printf(">>>>>voice init\n");
+				ret = ql_voice_init();
+				if(ret != 0)
+				{
+					printf("ql_voice_init fail\n");
+				}
+				else
+				{
+					printf("ql_voice_init success\n");
+				}
+            }
+            break;
+        case 2:
+            {
+				printf(">>>>>voice uninit\n");
+
+				ret = ql_voice_deinit();
+				if(ret != 0)
+				{
+					printf("ql_voice_uninit fail\n");
+					printf("ret=%d\n", ret);
+				}
+				else
+				{
+					printf("ql_voice_uninit success\n");
+
+				}
+            }
+            break;
+        case 3:
+            {
+                printf(">>>>>Input set recv cb<<<<<\n");
+
+				ret = ql_voice_set_call_cb(voice_call_cb);
+				if(ret != 0)
+				{
+					printf("ql_voice_set_msg_recv_cb fail\n");
+				}
+				else
+				{
+					printf("ql_voice_set_msg_recv_cb success\n");
+				}
+
+            }
+            break;
+        case 4:
+            {
+                printf(">>>>>Input set ser cb<<<<<\n");
+
+			    ret = ql_voice_set_service_error_cb(voice_servicie_error_cb);
+				if(ret < 0)
+				{
+					printf("ql_voice_set_service_error_cb fail\n");
+				}
+				else
+				{
+					printf("ql_voice_set_service_error_cb success\n");
+				}
+
+            }
+            break;
+        case 5:
+            {
+                printf(">>>>>Input ql_voice_dial<<<<<\n");
+
+                uint32_t id = 0;
+                ret = ql_voice_dial("13388257090", 11, &id);
+                printf("id:%d", id);
+				if(ret < 0)
+				{
+					printf("ql_voice_dial fail\n");
+				}
+				else
+				{
+					printf("ql_voice_dial success\n");
+				}
+            }
+            break;
+        case 6:
+            {
+                printf(">>>>>Input ql_voice_hangup_all<<<<<\n");
+
+                int id = 0;
+                ret = ql_voice_hangup_all();
+                if(ret < 0)
+                {
+                    printf("ql_voice_hangup_all fail\n");
+                }
+                else
+                {
+                    printf("ql_voice_hangup_all success\n");
+                }
+            }
+            break;
+        case 7:
+            {
+                printf(">>>>>Input ql_voice_answer<<<<<\n");
+
+                int id = 0;
+                ret = ql_voice_answer(1);
+				if(ret < 0)
+				{
+					printf("ql_voice_answer fail\n");
+				}
+				else
+				{
+					printf("ql_voice_answer success\n");
+				}
+            }
+            break;
+        case 8:
+            {
+                printf(">>>>>Input ql_voice_get_records<<<<<\n");
+
+                ql_voice_record_array_t arr;
+                ret = ql_voice_get_records(&arr);
+                printf("len1-id:%d, number:%s, state:%d, tech:%d, dir:%d, end_reason:%d\n", arr.records[0].id, arr.records[0].number, arr.records[0].state, arr.records[0].tech,
+                            arr.records[0].dir, arr.records[0].end_reason);
+                if(2 == arr.len)
+                {
+                    printf("len2-id:%d, number:%s, state:%d, tech:%d, dir:%d, end_reason:%d\n", arr.records[1].id, arr.records[1].number, arr.records[1].state, arr.records[1].tech,
+                        arr.records[1].dir, arr.records[1].end_reason);
+                }
+
+                if(ret < 0)
+                {
+                    printf("ql_voice_get_records fail\n");
+                }
+                else
+                {
+                    printf("ql_voice_get_records success\n");
+                }
+            }
+            break;
+         case 9:
+            {
+                printf(">>>>>Input ql_voice_send_dtmf_char<<<<<\n");
+
+
+                char inputChar;
+
+                printf("Enter set dtmf\n");
+                scanf(" %c", &inputChar);
+                printf("inputChar is %c\n", inputChar);
+
+                ret = ql_voice_send_dtmf_char(1, inputChar);
+				if(ret < 0)
+				{
+					printf("ql_voice_send_dtmf_char fail\n");
+				}
+				else
+				{
+					printf("ql_voice_send_dtmf_char success\n");
+				}
+            }
+            break;
+
+
+
+        default:
+            break;
+        }
+
+    }
+
+    return 0;
+
+}
diff --git a/mbtk/test/others/Makefile b/mbtk/test/others/Makefile
new file mode 100755
index 0000000..e6071fb
--- /dev/null
+++ b/mbtk/test/others/Makefile
@@ -0,0 +1,34 @@
+BUILD_ROOT = $(shell pwd)/../..
+include $(BUILD_ROOT)/Make.defines
+
+INC_DIR +=
+
+LIB_DIR +=
+
+LIBS +=  -lmbtk_lib -laudio-apu -lcutils -ltinyalsa -lacm -lubus -lubox
+
+CFLAGS = $(CFLAGS_TEST)
+
+DEFINE +=
+
+LOCAL_SRC_FILES = $(wildcard *.c) $(wildcard *.cpp)
+
+$(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES))
+
+OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(LOCAL_SRC_FILES)))
+BINS = $(patsubst %.o,%,$(OBJS))
+
+all: $(BINS)
+
+$(BINS):$(OBJS)
+	@echo "  BIN     $@"
+	$(CC) $(CFLAGS) $(LIB_DIR) $(LIBS) $@.o -o $(OUT_DIR)/bin/$@
+
+%.o:%.c
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+%.o:%.cpp
+	$(CC) $(CFLAGS) $(INC_DIR) $(DEFINE) -c $< -o $@
+
+clean:
+	rm -f $(OBJS)
diff --git a/mbtk/test/others/fb_demo.c b/mbtk/test/others/fb_demo.c
new file mode 100755
index 0000000..e160edf
--- /dev/null
+++ b/mbtk/test/others/fb_demo.c
@@ -0,0 +1,83 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "mbtk_log.h"
+#include "mbtk_type.h"
+
+// RGB565
+#define COLOR_BLACK 0x0000
+#define COLOR_WRITE 0xFFFF
+#define DEV_FB_PATH "/dev/fb0"
+#define SCREEN_WIDTH 320
+#define SCREEN_HEIGTH 240
+
+typedef struct {
+    int left;
+    int top;
+    int width;
+    int heigth;
+} rect_t;
+
+static uint16 fb_buffer[SCREEN_WIDTH * SCREEN_HEIGTH];
+
+static int fb_refresh(int fd)
+{
+    rect_t rect;
+    rect.width = SCREEN_WIDTH / 2;
+    rect.heigth = SCREEN_HEIGTH / 2;
+    rect.left = (SCREEN_WIDTH - rect.width) / 2;
+    rect.top = (SCREEN_HEIGTH - rect.heigth) / 2;
+    // Fill in buffer.
+    int x,y;
+    for(y = 0; y < SCREEN_HEIGTH; y++) {
+        for(x = 0; x < SCREEN_WIDTH; x++) {
+            if(x >= rect.left && x <= rect.left + rect.width
+                && y >= rect.top && y <= rect.top + rect.heigth)
+            {
+                fb_buffer[x * SCREEN_HEIGTH + y] = COLOR_WRITE;
+            } else {
+                fb_buffer[x * SCREEN_HEIGTH + y] = COLOR_BLACK;
+            }
+        }
+    }
+
+    int len = write(fd, fb_buffer, sizeof(fb_buffer));
+    LOGD("Write : %d/%d", len, sizeof(fb_buffer));
+    // Write buffer to framebuffer.
+    if(sizeof(fb_buffer) != len) {
+        LOGE("Write fail:%d", errno);
+        return -1;
+    }
+
+    return 0;
+}
+
+int main(int argc, char *argv[]) {
+    if(access(DEV_FB_PATH, F_OK) != 0) {
+        LOGE("no %s, quit.", DEV_FB_PATH);
+        return -1;
+    }
+
+    int fb_fd = open(DEV_FB_PATH, O_RDWR);
+    if(fb_fd < 0) {
+        LOGE("open() fail:%d", errno);
+        return -1;
+    }
+
+    // Fresh framebuffer
+    while(1) {
+        if(fb_refresh(fb_fd)) {
+            break;
+        }
+
+        usleep(33); // 1000 / 30
+    }
+
+    LOGD("Exit");
+    return 0;
+}
+
+
diff --git a/mbtk/test/others/framebuffer_demo.c b/mbtk/test/others/framebuffer_demo.c
new file mode 100755
index 0000000..bc35a07
--- /dev/null
+++ b/mbtk/test/others/framebuffer_demo.c
@@ -0,0 +1,285 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <linux/fb.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <math.h>
+
+#include "mbtk_utils.h"
+
+/**< \brief 根据实际情况修改,此处为unsigned short是565的屏,根据程序打印出的
+    bits_per_pixel的值可以判断出输出格式是565还是888 */
+// typedef unsigned int color_t;
+typedef unsigned short color_t;
+/**< \brief 定义每个像素点对应的位数,如果是565的屏则为16,如果是888的屏则为32 */
+// #define BITS_PER_PIXEL    32
+#define BITS_PER_PIXEL    16
+
+static struct fb_var_screeninfo __g_vinfo;    /* 显示信息 */
+color_t *__gp_frame;                    /* 虚拟屏幕首地址 */
+
+#pragma pack(2)
+typedef unsigned short WORD;
+typedef unsigned char BYTE;
+typedef unsigned int DWORD;
+typedef int LONG;
+
+typedef struct tagBITMAPFILEHEADER
+{
+    WORD bfType;        // 位图文件的类型,必须为BM
+    DWORD bfSize;       // 位图文件的大小,以字节为单位
+    WORD bfReserved1;   // 位图文件保留字,必须为0
+    WORD bfReserved2;   // 位图文件保留字,必须为0
+    DWORD bfOffBits;    // 位图数据的起始位置,以相对于位图
+                        // 文件头的偏移量表示,以字节为单位
+} BITMAPFILEHEADER;
+
+typedef struct tagBITMAPINFOHEADER
+{
+    DWORD biSize; // 本结构所占用字节数
+    LONG biWidth; // 位图的宽度,以像素为单位
+    LONG biHeight; // 位图的高度,以像素为单位
+    WORD biPlanes; // 目标设备的级别,必须为1
+    WORD biBitCount;// 每个像素所需的位数,必须是1(双色),
+         // 4(16色),8(256色)或24(真彩色)之一
+    DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
+        // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
+    DWORD biSizeImage; // 位图的大小,以字节为单位
+    LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
+    LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
+    DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
+    DWORD biClrImportant;// 位图显示过程中重要的颜色数
+} BITMAPINFOHEADER;
+#pragma pack(0)
+
+typedef WORD (*bmp_xx_to_16)(char *);
+
+//画点
+void draw_point(int x, int y, color_t color)
+{
+    color_t *p = __gp_frame;
+
+    p += __g_vinfo.xres * y + x;
+    *p = color;
+}
+
+WORD bmp_24_to_16(char *input)
+{
+    /* 如果使用的bmp图片的颜色深度是24位,适用于888的屏,但如果一定要在565的屏
+        上显示,则取红色的高5位,绿色的高6位和蓝色的高5位,拼成16位的数据
+        进行显示。这样做并不是最好的办法,更好的方法是将需要丢失的部分数
+        据进行进位或舍去。
+        */
+    WORD c;
+    char b, g, r;
+    r = *input >> 3;
+    input++;
+    g = *input >> 2;
+    input++;
+    b = *input >> 3;
+
+    c = (b << 11) | (g << 5) | r;
+
+    return c;
+}
+
+WORD bmp_16_to_16(char *input)
+{
+    WORD c;
+
+    c = *input;
+    input++;
+    c = (c << 8) | *input;
+    c = ((c >> 8) & 0x00ff) | ((c & 0x00ff) << 8);
+
+    return c;
+}
+
+//功能:在指定坐标显示指定BPM24位图
+//参数:(x , y)坐标
+//        pic:24位BMP图像
+void Show_BMP(int x , int y , const char *pic)
+{
+    int fd = 0;
+    color_t c;
+    BITMAPFILEHEADER filehead;
+    BITMAPINFOHEADER infohead;
+    int i,j;
+    unsigned char pixel_byte;
+    unsigned char *p = NULL , *p_data = NULL;
+    int width_error = 0;
+    short* t_data = NULL;
+    bmp_xx_to_16 transform_func = NULL;
+    int index = 0;
+
+    printf("%s: %s\n", __FUNCTION__, pic);
+    fd = open(pic , O_RDONLY);
+    if(fd == -1) {
+        printf("fail to open\n");
+        return;
+    }
+
+    mbtk_read(fd , &filehead , sizeof(filehead));
+    mbtk_read(fd , &infohead , sizeof(infohead));
+    printf("bfType: 0x%x, bfSize: %d, bfOffBits: 0x%x\n", filehead.bfType, filehead.bfSize, filehead.bfOffBits);
+
+    printf("biSize: %d, biWidth: %d, biHeight: %d\n", infohead.biSize, infohead.biWidth, infohead.biHeight);
+    printf("biPlanes: %d, biBitCount: %d, biCompression: %d\n", infohead.biPlanes, infohead.biBitCount, infohead.biCompression);
+    printf("biSizeImage: %d, biXPelsPerMeter: %d, biYPelsPerMeter: %d\n", infohead.biSizeImage, infohead.biXPelsPerMeter, infohead.biYPelsPerMeter);
+
+    width_error = (4 - infohead.biWidth * 3 % 4) % 4;
+    pixel_byte = infohead.biBitCount / 8;
+
+    if (16 == infohead.biBitCount) {
+        transform_func = bmp_16_to_16;
+    } else if (24 == infohead.biBitCount) {
+        transform_func = bmp_24_to_16;
+    } else {
+        printf("Not Suppurt %d bmp\n", infohead.biBitCount);
+        close(fd);
+        return;
+    }
+
+    t_data = malloc(__g_vinfo.xres_virtual * __g_vinfo.yres_virtual * __g_vinfo.bits_per_pixel / 8);
+
+    if(t_data == NULL) {
+        perror("fail to malloc");
+    }
+
+    p_data = malloc(infohead.biSizeImage);
+    if(p_data == NULL) {
+        perror("fail to malloc");
+    }
+
+    printf("biSizeImage:%d, width_error: %d\n", infohead.biSizeImage, width_error);
+    mbtk_read(fd , p_data , infohead.biSizeImage);
+    p = p_data;
+
+    int ret;
+    char data[100] = {0};
+    int debug_fd = open("/data/debug_fb", O_RDWR|O_CREAT|O_TRUNC, 0644);
+    if (debug_fd < 0) {
+        printf("debug_fb open error\n");
+        return;
+    }
+    printf("height:%d, width:%d\n", infohead.biHeight, infohead.biWidth);
+    for(j = infohead.biHeight - 1; j >= 0; j--) {
+        for(i = 0; i < infohead.biWidth; i++) {
+            c = transform_func((char*)p);
+            // c = *p;
+            p += pixel_byte;
+            // c = ((c >> 8) & 0x00ff) | ((c & 0x00ff) << 8);
+            t_data[__g_vinfo.xres * (y + j) + (x + i)] = c;
+            // draw_point(x + i, y + j, c);
+            index++;
+
+            sprintf(data, "index:%d, i:%d, j:%d\n", index, i, j);
+            ret = write(debug_fd, data, strlen(data));
+            if (ret < 0) {
+                printf("%s write error\n", __FUNCTION__);
+            }
+        }
+        p += width_error;
+    }
+    close(debug_fd);
+    printf("%s: %d\n", __FUNCTION__, infohead.biHeight * infohead.biWidth * __g_vinfo.bits_per_pixel / 8);
+    memcpy(__gp_frame, t_data,
+           infohead.biHeight * infohead.biWidth * __g_vinfo.bits_per_pixel / 8);
+    printf("%s: %d\n", __FUNCTION__, index);
+    free(p_data);
+    free(t_data);
+    close(fd);
+}
+
+/**
+ * \brief 填充整屏
+ */
+void full_screen (color_t color)
+{
+    int i;
+    color_t *p = __gp_frame;
+
+    for (i = 0; i < __g_vinfo.xres_virtual * __g_vinfo.yres_virtual; i++) {
+        *p++ = color;
+    }
+}
+
+/**
+ * \brief 清屏
+ */
+void clear()
+{
+    full_screen(0);
+}
+
+/* framebuffer初始化 */
+int framebuffer_init (void)
+{
+    int fd = 0;
+
+    fd = open("/dev/fb0", O_RDWR);
+    if (fd == -1) {
+        perror("fail to open /dev/fb0\n");
+        return -1;
+    }
+
+    /* 获取显示信息 */
+    ioctl(fd, FBIOGET_VSCREENINFO, &__g_vinfo);                     /* 获取显示信息 */
+    printf("bits_per_pixel = %d\n", __g_vinfo.bits_per_pixel);      /* 得到一个像素点对应的位数 */
+    printf("xres_virtual = %d\n", __g_vinfo.xres_virtual);            /* 打印虚拟屏幕列数 */
+    printf("yres_virtual = %d\n", __g_vinfo.yres_virtual);            /* 打印虚拟屏幕行数 */
+    printf("xres = %d\n", __g_vinfo.xres);                            /* 打印屏幕列数 */
+    printf("yres = %d\n", __g_vinfo.yres);                            /* 打印屏幕行数 */
+
+    int len = __g_vinfo.xres_virtual * __g_vinfo.yres_virtual * __g_vinfo.bits_per_pixel / 8;    /* 映射区大小 */
+
+    printf("fb size = %d\n", len);
+    __gp_frame = mmap(NULL,                             /* 映射区的开始地址,为NULL表示由系统决定映射区的起始地址 */
+                      len,
+                      PROT_WRITE | PROT_READ,            /* 内存保护标志(可读可写) */
+                      MAP_SHARED,                        /* 映射对象类型(与其他进程共享) */
+                      fd,                                /* 有效的文件描述符 */
+                      0);                                /* 被映射内容的偏移量 */
+    if (__gp_frame == NULL) {
+        perror("fail to mmap\n");
+        return -1;
+    }
+
+    return fd;
+}
+
+
+int main(int argc, const char *argv[])
+{
+    int fd;
+
+    if (argc < 2) {
+        printf("%s \" img \"", argv[0]);
+        exit(1);
+    }
+
+    fd = framebuffer_init();
+    if (fd < 0) {
+        printf("framebuffer_init error\n");
+        return 0;
+    }
+
+    printf("framebuffer_init Success.\n");
+    /* 清屏 */
+    clear();
+
+    printf("clear Success.\n");
+
+    // full_screen(0xF800);  // 显示红色
+
+    Show_BMP(0 , 0 , argv[1]);
+
+    close(fd);
+
+    return 0;
+}
diff --git a/mbtk/test/others/fs_full.c b/mbtk/test/others/fs_full.c
new file mode 100755
index 0000000..cb53e49
--- /dev/null
+++ b/mbtk/test/others/fs_full.c
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#define BUFF_SIZE 4096
+
+int main(int argc, char *argv[])
+{
+    int fd = open("/test.data", O_WRONLY | O_CREAT | O_APPEND, 0666);
+    if(fd < 0) {
+        printf("open() fail:%d", errno);
+        return -1;
+    }
+
+    char buff[BUFF_SIZE];
+    while(1) {
+        if(write(fd, buff, BUFF_SIZE) < 0) {
+            printf("write() fail:%d", errno);
+            break;
+        }
+    }
+
+    close(fd);
+    return 0;
+}
+
diff --git a/mbtk/test/others/iconv_demo.cc b/mbtk/test/others/iconv_demo.cc
new file mode 100755
index 0000000..de95454
--- /dev/null
+++ b/mbtk/test/others/iconv_demo.cc
@@ -0,0 +1,204 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <iconv.h>
+#include <errno.h>
+#include <stddef.h>
+
+struct outbuf
+{
+    struct outbuf *next;
+    char *outptr;
+    size_t outbytesleft;
+    char buf[256];
+};
+
+char *eazyiconv(const char *to, const char *from,
+                char *str, size_t str_blen, size_t str_elemsize, size_t out_tailzero_blen, size_t *out_size,
+                const char *replchr)
+{
+    char *retstr = NULL;
+    struct outbuf *outhead = NULL;
+    struct outbuf *outtail = NULL;
+    struct outbuf *outiter = NULL;
+    iconv_t cd = NULL;
+    char *inptr = str;
+    size_t inbytesleft = str_blen;
+    int retval = 0;
+    int err = 0;
+    size_t blocksize = 0;
+    size_t totalsize = 0;
+    char *retiter = NULL;
+    unsigned int chrval = 0;
+    iconv_t cdreplchr = NULL;
+    char replchrfmtbuf[256] = "";
+    char replchrbuf[256] = "";
+    char *replchrfmtptr = replchrfmtbuf;
+    size_t replchrfmtleft = sizeof replchrfmtbuf;
+    char *replchrptr = replchrbuf;
+    size_t replchrleft = sizeof replchrbuf;
+    int replchr_blen = 0;
+
+    cd = iconv_open(to, from);
+    if (cd == (iconv_t)-1)
+    {
+        goto noclean;
+    }
+
+    outhead = outtail = calloc(1, sizeof(struct outbuf));
+    if (outtail == NULL)
+    {
+        goto clean_cd;
+    }
+    outtail->next = NULL;
+    outtail->outptr = outtail->buf;
+    outtail->outbytesleft = sizeof outtail->buf;
+    memset(outtail->buf, 0, sizeof outtail->buf);
+
+    while (1)
+    {
+        retval = iconv(cd, &inptr, &inbytesleft, &outtail->outptr, &outtail->outbytesleft);
+        if (retval == -1)
+            err = errno;
+        else
+            err = 0;
+        switch (err)
+        {
+            case 0:
+                outiter = calloc(1, sizeof(struct outbuf));
+                if (outiter == NULL)
+                {
+                    goto clean_outbufs;
+                }
+                if (inptr == NULL) // succeeded cleanup iconv
+                {
+                    goto succeeded;
+                }
+                else // fully succeeded iconv
+                {
+                    inptr = NULL; // do cleanup iconv
+                    inbytesleft = 0;
+                }
+                break;
+            case EINVAL: // incomplete tail sequence
+            case EILSEQ: // invalid sequence
+                chrval = 0;
+                memcpy(&chrval, inptr, str_elemsize > sizeof chrval ? sizeof chrval : str_elemsize);
+                snprintf(replchrfmtbuf, sizeof replchrfmtbuf, replchr, chrval);
+                inptr += str_elemsize;
+                inbytesleft -= str_elemsize;
+
+                cdreplchr = iconv_open(to, "UTF-8");
+                if (cdreplchr == (iconv_t)-1)
+                {
+                    goto clean_outbufs;
+                }
+                replchrfmtptr = replchrfmtbuf;
+                replchrfmtleft = strlen(replchrfmtbuf);
+                replchrptr = replchrbuf;
+                replchrleft = sizeof replchrbuf;
+                iconv(cdreplchr, &replchrfmtptr, &replchrfmtleft, &replchrptr, &replchrleft);
+                iconv(cdreplchr, NULL, NULL, &replchrptr, &replchrleft);
+                iconv_close(cdreplchr);
+                replchr_blen = replchrptr - replchrbuf;
+
+                if (outtail->outbytesleft < replchr_blen)
+                {
+                    outiter = calloc(1, sizeof(struct outbuf));
+                    if (outiter == NULL)
+                    {
+                        goto clean_outbufs;
+                    }
+                    outtail->next = outiter;
+                    outtail = outiter;
+                    outtail->next = NULL;
+                    outtail->outptr = outtail->buf;
+                    outtail->outbytesleft = sizeof outtail->buf;
+                    memset(outtail->buf, 0, sizeof outtail->buf);
+                }
+                memcpy(outtail->outptr, replchrbuf, replchr_blen);
+                outtail->outptr += replchr_blen;
+                outtail->outbytesleft -= replchr_blen;
+                break;
+            case E2BIG: // no enough space
+                outiter = calloc(1, sizeof(struct outbuf));
+                if (outiter == NULL)
+                {
+                    goto clean_outbufs;
+                }
+                outtail->next = outiter;
+                outtail = outiter;
+                outtail->next = NULL;
+                outtail->outptr = outtail->buf;
+                outtail->outbytesleft = sizeof outtail->buf;
+                memset(outtail->buf, 0, sizeof outtail->buf);
+                break;
+            default:
+                break;
+        }
+    }
+
+succeeded:
+    totalsize = 0;
+    for (outiter = outhead; outiter != NULL; outiter = outiter->next)
+    {
+        blocksize = outiter->outptr - outiter->buf;
+        totalsize += blocksize;
+    }
+    retstr = calloc(totalsize + out_tailzero_blen, 1);
+    if (retstr == NULL)
+    {
+        goto clean_outbufs;
+    }
+    retiter = retstr;
+    for (outiter = outhead; outiter != NULL; outiter = outiter->next)
+    {
+        blocksize = outiter->outptr - outiter->buf;
+        memcpy(retiter, outiter->buf, blocksize);
+        retiter += blocksize;
+    }
+    memset(retiter, 0, out_tailzero_blen);
+    *out_size = totalsize;
+
+clean_outbufs:
+    while (outhead != NULL)
+    {
+        outiter = outhead;
+        outhead = outhead->next;
+        free(outiter);
+    }
+    outtail = NULL;
+clean_cd:
+    iconv_close(cd);
+noclean:
+    return retstr;
+}
+
+int main(int argc, char **argv)
+{
+    if (argc < 7)
+    {
+        printf("usage: eiconv_test from_charset from_elemsize to_charset to_elemsize from_file to_file (no utf-16/32)\n");
+        return 0;
+    }
+    FILE *from_file = fopen(argv[5], "rb");
+    fseek(from_file, 0, SEEK_END);
+    off_t fsize = ftell(from_file);
+    fseek(from_file, 0, SEEK_SET);
+    char *from_str = malloc(fsize + 1);
+    fread(from_str, 1, fsize, from_file);
+    fclose(from_file);
+
+    size_t out_size = 0;
+    char *to_str = eazyiconv(argv[3], argv[1],
+                             from_str, fsize, atoi(argv[2]), atoi(argv[4]), &out_size,
+                             "<0x%02X>");
+
+    FILE *to_file = fopen(argv[6], "wb");
+    fwrite(to_str, 1, out_size, to_file);
+    free(to_str);
+    fclose(to_file);
+    return 0;
+}
+
+
diff --git a/mbtk/test/others/mbtk_debug_test.c b/mbtk/test/others/mbtk_debug_test.c
new file mode 100755
index 0000000..39c8105
--- /dev/null
+++ b/mbtk/test/others/mbtk_debug_test.c
@@ -0,0 +1,55 @@
+#include <stdio.h>
+#include <pthread.h>
+
+#include "mbtk_log.h"
+#include "mbtk_utils.h"
+
+
+void test3()
+{
+    printf("%s start\n", __FUNCTION__);
+    char *ptr = (char*)10;
+    *ptr = 'a';
+    printf("%s end\n", __FUNCTION__);
+}
+
+void test2()
+{
+    printf("%s start\n", __FUNCTION__);
+    mbtk_get_kernel_cmdline(NULL, 1024);
+    // test3();
+    printf("%s end\n", __FUNCTION__);
+}
+
+void test1()
+{
+    printf("%s start\n", __FUNCTION__);
+    test2();
+    printf("%s end\n", __FUNCTION__);
+}
+
+void* thread_function(void* arg) {
+    // 模拟一个导致SIGSEGV的操作
+    int* invalid_pointer = NULL;
+    *invalid_pointer = 0; // 尝试写入一个无效的指针,将触发SIGSEGV
+    return NULL;
+}
+
+int main(int argc, char *argv[])
+{
+
+#ifdef MBTK_DUMP_SUPPORT
+    mbtk_debug_open(NULL, TRUE);
+#endif
+
+    test1();
+
+    pthread_t thread;
+    pthread_create(&thread, NULL, &thread_function, NULL);
+    pthread_join(thread, NULL);
+
+    printf("Exit.\n");
+
+    return 0;
+}
+
diff --git a/mbtk/test/others/mbtk_gnss_cli.c b/mbtk/test/others/mbtk_gnss_cli.c
new file mode 100755
index 0000000..825d501
--- /dev/null
+++ b/mbtk/test/others/mbtk_gnss_cli.c
@@ -0,0 +1,181 @@
+/*
+*    gnss_ipc.c
+*
+*    MBTK GNSS IPC service source.
+*
+*/
+/******************************************************************************
+
+                          EDIT HISTORY FOR FILE
+
+  WHEN        WHO       WHAT,WHERE,WHY
+--------    --------    -------------------------------------------------------
+2024/6/15     LiuBin      Initial version
+
+******************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/in.h>
+#include <pthread.h>
+#include <sys/epoll.h>
+
+#include "mbtk_log.h"
+#include "mbtk_type.h"
+#include "mbtk_gnss.h"
+#include "mbtk_utils.h"
+
+#define GNSS_SOCK_PATH "/tmp/mbtk_gnss_sock"
+
+static int sock_listen_fd = -1;
+
+typedef enum {
+    GNSS_CMD_INIT = 0,
+    GNSS_CMD_DEINIT,
+    GNSS_CMD_SETTING,
+    GNSS_CMD_DL
+} gnss_cmd_enum;
+
+static void help()
+{
+    printf("gnss_cli gnss_init <0-15>\n");
+    printf("gnss_cli gnss_deinit\n");
+    printf("gnss_cli gnss_setting cmd\n");
+    printf("gnss_cli gnss_dl fw_name\n");
+}
+
+static int cmd_process(gnss_cmd_enum cmd, void *arg)
+{
+    if(sock_listen_fd < 0) {
+        sock_listen_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
+        if(sock_listen_fd < 0)
+        {
+            printf("socket() fail[%d].\n", errno);
+            return -1;
+        }
+
+        struct sockaddr_un cli_addr;
+        memset(&cli_addr, 0, sizeof(cli_addr));
+        cli_addr.sun_family = AF_LOCAL;
+        strcpy(cli_addr.sun_path, GNSS_SOCK_PATH);
+        if(connect(sock_listen_fd, (struct sockaddr *)&cli_addr, sizeof(cli_addr)))
+        {
+            printf("connect() fail[%d].\n", errno);
+            close(sock_listen_fd);
+            sock_listen_fd = -1;
+            return -1;
+        }
+    }
+
+    char buff[100] = {0};
+    if(cmd == GNSS_CMD_INIT) {
+        if(arg) {
+            int type = atoi((char*)arg);
+            sprintf(buff, "gnss_init:%d", type);
+        } else {
+            return -1;
+        }
+    } else if(cmd == GNSS_CMD_DEINIT) {
+        sprintf(buff, "gnss_deinit");
+    } else if(cmd == GNSS_CMD_SETTING) {
+        sprintf(buff, "gnss_setting:%s", (char*)arg);
+    } else if(cmd == GNSS_CMD_DL) {
+        sprintf(buff, "gnss_dl:%s", (char*)arg);
+    } else {
+        printf("Unknown cmd.\n");
+        return -1;
+    }
+
+    mbtk_write(sock_listen_fd, buff, strlen(buff));
+
+    int len = 0;
+    char *rsp = NULL;
+    while(1) {
+        memset(buff, 0, sizeof(buff));
+        len = read(sock_listen_fd, buff, sizeof(buff));
+        if(len > 0) {
+            rsp = buff;
+            if(rsp[len - 1] == MBTK_IND_END_FLAG) {
+                rsp[len - 1] = '\0';
+            }
+            if(rsp[0] == MBTK_IND_START_FLAG) {
+                rsp++;
+            }
+            printf("RSP : %s\n", rsp);
+            if(cmd == GNSS_CMD_INIT) {
+                if(memcmp(rsp, "gnss_init", 9) == 0) {
+                    return atoi(rsp + 10);
+                } else {
+                    printf("gnss_init response error.\n");
+                    return -1;
+                }
+            } else if(cmd == GNSS_CMD_DEINIT) {
+                if(memcmp(rsp, "gnss_deinit", 11) == 0) {
+                    return atoi(rsp + 12);
+                } else {
+                    printf("gnss_deinit response error.\n");
+                    return -1;
+                }
+            } else if(cmd == GNSS_CMD_SETTING) {
+                if(memcmp(rsp, "gnss_setting", 12) == 0) {
+                    return atoi(rsp + 13);
+                } else {
+                    printf("gnss_setting response error.\n");
+                    return -1;
+                }
+            } else if(cmd == GNSS_CMD_DL) {
+                if(memcmp(rsp, "gnss_dl", 7) == 0) {
+                    return atoi(rsp + 8);
+                } else {
+                    printf("gnss_dl response error.\n");
+                    return -1;
+                }
+            } else {
+                printf("Unknown response.\n");
+                return -1;
+            }
+        } else if(len == 0) {
+            printf("RSP is null.\n");
+            return -1;
+        } else {
+            printf("read = %d:errno = %d\n", len, errno);
+        }
+    }
+}
+
+int main(int argc, char *argv[])
+{
+    int ret = 0;
+    if(argc == 2) {
+        if(strcmp(argv[1], "gnss_deinit")) {
+            help();
+            return -1;
+        }
+
+        ret = cmd_process(GNSS_CMD_DEINIT, NULL);
+    } else if(argc == 3) {
+        if(strcmp(argv[1], "gnss_init") == 0) {
+            ret = cmd_process(GNSS_CMD_INIT, argv[2]);
+        } else if(strcmp(argv[1], "gnss_setting") == 0) {
+            ret = cmd_process(GNSS_CMD_SETTING, argv[2]);
+        } else if(strcmp(argv[1], "gnss_dl") == 0) {
+            ret = cmd_process(GNSS_CMD_DL, argv[2]);
+        } else {
+            help();
+            return -1;
+        }
+    } else {
+        help();
+        return -1;
+    }
+
+    // printf("Error:%s\n", strerror(EBADF));
+
+    printf("Result : %d\n", ret);
+    return 0;
+}
+
diff --git a/mbtk/test/others/mbtk_mbedtls_demo.c b/mbtk/test/others/mbtk_mbedtls_demo.c
new file mode 100755
index 0000000..45909ae
--- /dev/null
+++ b/mbtk/test/others/mbtk_mbedtls_demo.c
@@ -0,0 +1,162 @@
+/*-----------------------------------------------------------------------------------------------*/

+/**

+  @file NULL

+  @brief libmbedtls.so.3.6.2 function test

+*/

+/*-----------------------------------------------------------------------------------------------*/

+

+/*-------------------------------------------------------------------------------------------------

+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.

+  mobiletek Wireless Solution Proprietary and Confidential.

+-------------------------------------------------------------------------------------------------*/

+

+/*-------------------------------------------------------------------------------------------------

+  EDIT HISTORY

+  This section contains comments describing changes made to the file.

+  Notice that changes are listed in reverse chronological order.

+  $Header: $

+  when       who          what, where, why

+  --------   ---------    -----------------------------------------------------------------

+  20241022    yq.wang      Created .

+-------------------------------------------------------------------------------------------------*/

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <unistd.h>

+#include <stdbool.h>

+#include <arpa/inet.h>

+#include <sys/socket.h>

+

+#ifdef MBTK_MBEDTLS_V3_6_2_SUPPORT

+#include "mbtk_mbedtls.h"

+

+#define BUFFER_SIZE 1024

+

+static int tcp_connect_init(int *client_fd, int port, char *ip)

+{

+    int ret = -1;

+    struct sockaddr_in server_addr;

+

+    if(port < 1 || port > 65535)

+    {

+        printf("[%s] Invalid port number\n", __func__);

+        goto error;

+    }

+

+    *client_fd = socket(AF_INET, SOCK_STREAM, 0);

+    if(*client_fd < 0)

+    {

+        printf("[%s] socket creation failed\n", __func__);

+        goto error;

+    }

+

+    server_addr.sin_family = AF_INET;

+    server_addr.sin_port = htons(port);

+    ret = inet_pton(AF_INET, ip, &server_addr.sin_addr);

+    if(ret <= 0)

+    {

+        perror("invalid address");

+        goto error;

+    }

+

+    ret = connect(*client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));

+    if(ret< 0)

+    {

+        perror("connection failed");

+        goto error;

+    }

+

+    printf("[%s] Connected to %s:%d\n", __func__, ip, port);

+    return 0;

+error:

+    if(*client_fd >= 0)

+    {

+        close(*client_fd);

+        *client_fd = -1;

+    }

+    return -1;

+}

+    

+int main(int argc, char *argv[])

+{

+    if(argc != 3)

+    {

+        printf("Usage: %s <IP> <PORT>\n", argv[0]);

+        exit(EXIT_FAILURE);

+    }

+

+    int ret = -1;

+    int client_fd = -1;

+    ssize_t bytes_recv = 0;

+    char buffer[BUFFER_SIZE] = {0};

+    mbtk_mbedtls_ssl_result_e mbtk_ssl_ret = MBTK_MBEDTLS_SSL_RESULT_SUCCESS;

+    mbtk_mbedtls_ssl_info_s inter_info = {0};

+    mbtk_mbedtls_ssl_options_s opt = {0};

+

+    ret = tcp_connect_init(&client_fd, atoi(argv[2]), argv[1]);

+    if(ret < 0)

+    {

+        printf("tcp_connect_init() fail\n");

+        exit(EXIT_FAILURE);

+    }

+

+    mbtk_mbedtls_ssl_options_default(&opt);

+    opt.load_cert = true;

+    opt.ca_file = "/ca.crt";

+    opt.crt_file = "/client.crt";

+    opt.key_file = "/client.key";

+    opt.auth_mode = MBTK_MBEDTLS_SSL_VERIFY_REQUIRED;

+    opt.allowed_mds |= MBTK_MBEDTLS_SSL_MD_SHA1;

+    memset(&inter_info, 0x00, sizeof(mbtk_mbedtls_ssl_info_s));

+    mbtk_ssl_ret = mbtk_mbedtls_ssl_init(client_fd, &opt, &inter_info);

+    if(mbtk_ssl_ret != MBTK_MBEDTLS_SSL_RESULT_SUCCESS)

+    {

+        printf("mbtk_mbedtls_ssl_init() fail\n");

+        close(client_fd);

+        client_fd = -1;

+        exit(EXIT_FAILURE);

+    }

+

+    while(1) 

+    {

+        printf("Enter message: \n");

+        fgets(buffer, BUFFER_SIZE, stdin);

+

+        if(memcmp(buffer, "exit", 4) == 0)

+        {

+            printf("process exit\n");

+            break;

+        }

+        

+        ret = mbtk_mbedtls_ssl_write(inter_info.ssl, (const unsigned char*)buffer, strlen(buffer));

+        if(ret < 0)

+        {

+            perror("send failed");

+            break;

+        }

+        

+        bytes_recv = mbtk_mbedtls_ssl_read(inter_info.ssl, (unsigned char*)buffer, BUFFER_SIZE-1);

+        if (bytes_recv <= 0)

+        {

+            bytes_recv == 0 ? printf("Connection closed\n") : perror("recv failed");

+            break;

+        }

+        buffer[bytes_recv] = '\0';

+        printf("Server response: %s\n", buffer);

+    }

+

+    mbtk_mbedtls_ssl_deinit(&inter_info);

+    close(client_fd);

+    client_fd = -1;

+    

+    return 0;

+}

+

+#else

+int main(int argc, char *argv[])

+{

+	printf("No support polarssl.\n");

+	return 0;

+}

+#endif

+

diff --git a/mbtk/test/others/mbtk_mdio_demo.c b/mbtk/test/others/mbtk_mdio_demo.c
new file mode 100755
index 0000000..1a129fb
--- /dev/null
+++ b/mbtk/test/others/mbtk_mdio_demo.c
@@ -0,0 +1,201 @@
+
+//mdio eth0 1          	读取phy寄存器1的数值
+//mdio eth0 0 0x1120      将0x1120写入 phy寄存器1
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <linux/mii.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <linux/sockios.h>
+#include <linux/types.h>
+#include <netinet/in.h>
+#include <unistd.h>
+#include <string.h>
+
+
+#define reteck(ret)     \
+        if(ret < 0){    \
+            printf("%m! \"%s\" : line: %d\n", __func__, __LINE__);   \
+            goto lab;   \
+        }
+
+#define help() \
+    printf("For example:\n");            \
+    printf("mbtk_mdio_demo eth0\n");             \
+    exit(0);
+
+int sockfd;
+
+int main(int argc, char *argv[])
+{
+    int err, value;
+    int cmdIdx = 0;
+    int ret = 0;
+    int i = 0;
+    char operator[10];
+    int opt = 0;
+
+    struct mii_ioctl_data *mii = NULL;
+    struct ifreq ifr;
+
+    if(argc == 1 || !strcmp(argv[1], "-h")){
+        help();
+    }
+
+    memset(&ifr, 0, sizeof(ifr));
+    strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
+
+    sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
+    reteck(sockfd);
+
+    //get phy address in smi bus
+    ret = ioctl(sockfd, SIOCGMIIPHY, &ifr);
+    reteck(ret);
+
+    mii = (struct mii_ioctl_data*)&ifr.ifr_data;
+
+    while(1)
+    {
+
+        printf("=========EX:Jl3103========\n"
+            "\t 0: Set the slave mode\n"
+            "\t 1: Set the master mode\n"
+            "\t 2: indicates setting SQI value view mode\n"
+            "\t 3: Set the VCT value view mode\n"
+            "\t 4: Get slave/master mode\n"
+            "\t 5 EXIT \n"
+            "=========================\n");
+        
+        fflush(stdin);
+        fgets(operator, sizeof(operator), stdin);
+        opt = atoi(operator);
+
+        switch(opt)
+        {
+            case 0://"Set the slave mode"
+            {
+                int val = 0;
+                mii->reg_num = 0x0834;
+                ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
+                reteck(ret);
+
+                printf("read phy addr: 0x%x  reg: 0x%x   value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
+                val = mii->val_out;
+
+                mii->reg_num    = 0x0834;
+                mii->val_in     = val & 0xBFFF;// set bit[14] = 0
+
+                ret = ioctl(sockfd, SIOCSMIIREG, &ifr);
+                reteck(ret);
+
+                printf("write phy addr: 0x%x  reg: 0x%x  value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_in);
+
+                break;
+            }
+            case 1://"Set the master mode"
+            {
+                int val = 0;
+                mii->reg_num = 0x0834;
+                ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
+                reteck(ret);
+
+                printf("read phy addr: 0x%x  reg: 0x%x   value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
+                val = mii->val_out;
+
+                mii->reg_num    = 0x0834;
+                mii->val_in     = val | 0x4000;//set bit[14] = 1
+
+                ret = ioctl(sockfd, SIOCSMIIREG, &ifr);
+                reteck(ret);
+
+                printf("write phy addr: 0x%x  reg: 0x%x  value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_in);
+                break;
+            }
+            case 2://"indicates setting SQI value view mode\"
+            {
+                mii->reg_num = 0x8B10;
+
+                ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
+                reteck(ret);
+
+                printf("read phy addr: 0x%x  reg: 0x%x   value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
+                printf("[Jl3103] SQI is 0x%x\n", mii->val_out);
+                break;
+            }
+            case 3://"Set the VCT value view mode"
+            {
+                mii->reg_num = 0x8B00;
+                ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
+                reteck(ret);
+
+                printf("read phy addr: 0x%x  reg: 0x%x   value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
+
+                //--TDR Enable
+                mii->reg_num    = 0x8B00;
+                mii->val_in     = 0x4000;
+
+                ret = ioctl(sockfd, SIOCSMIIREG, &ifr);
+                reteck(ret);
+
+                printf("write phy addr: 0x%x  reg: 0x%x  value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_in);
+                usleep(200000);
+                //--TDR Start
+                mii->reg_num    = 0x8B00;
+                mii->val_in     = 0x5000;
+
+                ret = ioctl(sockfd, SIOCSMIIREG, &ifr);
+                reteck(ret);
+
+                printf("write phy addr: 0x%x  reg: 0x%x  value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_in);
+                usleep(20000);
+                //--Read VCT
+                mii->reg_num = 0x8B02;
+                ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
+                reteck(ret);
+
+                printf("read phy addr: 0x%x  reg: 0x%x   value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
+                printf("[Jl3103] Open status: %s - Short status: %s\n", (mii->val_out & 0x0002) ? "Open" : "Normal",  (mii->val_out & 0x0001) ? "Short" : "Normal");
+
+                mii->reg_num = 0x8B01;
+                ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
+                reteck(ret);
+
+                printf("read phy addr: 0x%x  reg: 0x%x   value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
+                printf("[Jl3103] Distance status is 0x%x\n", mii->val_out % 0x200);//bits[9:0]
+                //--TDR Disable
+                mii->reg_num    = 0x8B00;
+                mii->val_in     = 0;
+
+                ret = ioctl(sockfd, SIOCSMIIREG, &ifr);
+                reteck(ret);
+
+                printf("write phy addr: 0x%x  reg: 0x%x  value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_in);
+                break;
+            }
+            case 4://4: Get slave/master mode
+            {
+                int val = 0;
+                mii->reg_num = 0x0834;
+                ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
+                reteck(ret);
+
+                printf("read phy addr: 0x%x  reg: 0x%x   value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
+                printf("[Jl3103] mode: %s\n", (mii->val_out & 0x4000) ? "master" : "slave");
+                break;
+            }
+            default://EXIT
+            {
+                printf("break\n");
+                close(sockfd);
+                return 0;
+            }
+        }
+    }
+lab:
+    close(sockfd);
+    return 0;
+}
\ No newline at end of file
diff --git a/mbtk/test/others/mbtk_openssl_demo.c b/mbtk/test/others/mbtk_openssl_demo.c
new file mode 100755
index 0000000..08ff7b8
--- /dev/null
+++ b/mbtk/test/others/mbtk_openssl_demo.c
@@ -0,0 +1,190 @@
+/*-----------------------------------------------------------------------------------------------*/

+/**

+  @file NULL

+  @brief libssl.so.3 function test

+*/

+/*-----------------------------------------------------------------------------------------------*/

+

+/*-------------------------------------------------------------------------------------------------

+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.

+  mobiletek Wireless Solution Proprietary and Confidential.

+-------------------------------------------------------------------------------------------------*/

+

+/*-------------------------------------------------------------------------------------------------

+  EDIT HISTORY

+  This section contains comments describing changes made to the file.

+  Notice that changes are listed in reverse chronological order.

+  $Header: $

+  when       who          what, where, why

+  --------   ---------    -----------------------------------------------------------------

+  20250409    yq.wang      Created .

+-------------------------------------------------------------------------------------------------*/

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <unistd.h>

+#include <pthread.h>

+#include <sys/socket.h>

+#include <netinet/in.h>

+#include <arpa/inet.h>

+

+#ifdef MBTK_OPENSSL_V3_0_0_SUPPORT

+#include "mbtk_openssl.h"

+

+#define BUFFER_SIZE 1024

+    

+void* recv_thread(void *arg)

+{

+    mbtk_openssl_info_s *inter_info = (mbtk_openssl_info_s *)(intptr_t)arg;

+    char buffer[BUFFER_SIZE + 1] = {0};

+    

+    while(1)

+    {

+        memset(buffer, 0x00, BUFFER_SIZE + 1);

+        ssize_t len = mbtk_openssl_read(inter_info->ssl, buffer, BUFFER_SIZE);

+        if(len <= 0)

+        {

+            if(len == 0)

+            {

+                printf("Connection closed by server\n");

+            }

+            else

+            {

+                printf("mbtk_openssl_read() fail.[%d]\n", len);

+            }

+            break;

+        }

+        buffer[len] = '\0';

+        printf("\nReceived: %s\n", buffer);

+    }

+    

+    return NULL;

+}

+

+static int tcp_connect_init(int *client_fd, int port, char *ip)

+{

+    int ret = -1;

+    struct sockaddr_in server_addr;

+

+    if(port < 1 || port > 65535)

+    {

+        printf("[%s] Invalid port number\n", __func__);

+        goto error;

+    }

+

+    *client_fd = socket(AF_INET, SOCK_STREAM, 0);

+    if(*client_fd < 0)

+    {

+        printf("[%s] socket creation failed\n", __func__);

+        goto error;

+    }

+

+    server_addr.sin_family = AF_INET;

+    server_addr.sin_port = htons(port);

+    ret = inet_pton(AF_INET, ip, &server_addr.sin_addr);

+    if(ret <= 0)

+    {

+        perror("invalid address");

+        goto error;

+    }

+

+    ret = connect(*client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));

+    if(ret< 0)

+    {

+        perror("connection failed");

+        goto error;

+    }

+

+    printf("[%s] Connected to %s:%d\n", __func__, ip, port);

+    return 0;

+error:

+    if(*client_fd >= 0)

+    {

+        close(*client_fd);

+        *client_fd = -1;

+    }

+    return -1;

+}

+    

+int main(int argc, char *argv[])

+{

+    if(argc != 3)

+    {

+        printf("Usage: %s <IP> <PORT>\n", argv[0]);

+        exit(EXIT_FAILURE);

+    }

+

+    int ret = -1;

+    int client_fd = -1;

+    ssize_t bytes_recv = 0;

+    char buffer[BUFFER_SIZE + 1] = {0};

+    mbtk_openssl_result_e mbtk_ret = MBTK_OPENSSL_RESULT_SUCCESS;

+    mbtk_openssl_info_s inter_info = {0};

+    mbtk_openssl_options_s opt = {0};

+    

+    pthread_t tid;

+

+    ret = tcp_connect_init(&client_fd, atoi(argv[2]), argv[1]);

+    if(ret < 0)

+    {

+        printf("tcp_connect_init() fail\n");

+        exit(EXIT_FAILURE);

+    }

+

+    mbtk_openssl_options_default(&opt);

+    opt.load_cert = true;

+    opt.ca_file = "/ca.crt";

+    opt.crt_file = "/client.crt";

+    opt.key_file = "/client.key";

+    opt.safety_level = MBTK_OPENSSL_SAFETY_LEVEL_0;//Use level 0 for testing only

+    mbtk_ret = mbtk_openssl_init(client_fd, &opt, &inter_info);

+    if(mbtk_ret != MBTK_OPENSSL_RESULT_SUCCESS)

+    {

+        printf("mbtk_openssl_init() fail\n");

+        close(client_fd);

+        client_fd =-1;

+        exit(EXIT_FAILURE);

+    }

+    

+    ret = pthread_create(&tid, NULL, recv_thread, (void*)(intptr_t)&inter_info);

+    if(ret != 0)

+    {

+        perror("thread creation failed");

+        close(client_fd);

+        client_fd = -1;

+        exit(EXIT_FAILURE);

+    }

+

+    while(1) 

+    {

+        printf("Enter message: \n");

+        memset(buffer, 0x00, BUFFER_SIZE);

+        fgets(buffer, BUFFER_SIZE, stdin);

+

+        if(memcmp(buffer, "exit", 4) == 0)

+        {

+            printf("process exit\n");

+            break;

+        }

+        

+        ret = mbtk_openssl_write(inter_info.ssl, buffer, strlen(buffer));

+        if(ret < 0)

+        {

+            printf("mbtk_openssl_write() fail.[%d]\n", ret);

+            break;

+        }

+    }

+

+    mbtk_openssl_deinit(&inter_info);

+    close(client_fd);

+    client_fd = -1;

+    

+    return 0;

+}

+#else

+int main(int argc, char *argv[])

+{

+	printf("No support openssl.\n");

+	return 0;

+}

+#endif
\ No newline at end of file
diff --git a/mbtk/test/others/mbtk_rtp_udp_cli.c b/mbtk/test/others/mbtk_rtp_udp_cli.c
new file mode 100755
index 0000000..92c19cf
--- /dev/null
+++ b/mbtk/test/others/mbtk_rtp_udp_cli.c
@@ -0,0 +1,373 @@
+#include <stdio.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/in.h>
+#include <sys/epoll.h>
+#include <arpa/inet.h>
+#include <sys/ioctl.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <sys/stat.h>
+
+//#include "mbtk_log.h"
+//#include "mbtk_utils.h"
+// #include "audio_if_api.h"
+//#include "mbtk_audio2.h"
+
+#define RTP_UDP_SER_PORT_DEFAULT 53248
+#define RTP_UDP_CLI_PORT_DEFAULT 55555
+
+
+#define BUFF_SIZE 4096
+
+#define ID_RIFF 0x46464952
+#define ID_WAVE 0x45564157
+#define ID_FMT  0x20746d66
+#define ID_DATA 0x61746164
+#define FORMAT_PCM 1
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef UNUSED
+#define UNUSED(a)    (void)(a)
+#endif
+
+typedef unsigned int uint32; /* Unsigned 32 bit value */
+
+struct riff_wave_header {
+	unsigned int riff_id;
+	unsigned int riff_sz;
+	unsigned int wave_id;
+};
+
+struct chunk_header {
+	unsigned int id;
+	unsigned int sz;
+};
+
+struct chunk_fmt {
+	unsigned short audio_format;
+	unsigned short num_channels;
+	unsigned int sample_rate;
+	unsigned int byte_rate;
+	unsigned short block_align;
+	unsigned short bits_per_sample;
+};
+
+struct wav_header {
+	unsigned int riff_id;
+	unsigned int riff_sz;
+	unsigned int riff_fmt;
+	unsigned int fmt_id;
+	unsigned int fmt_sz;
+	unsigned short audio_format;
+	unsigned short num_channels;
+	unsigned int sample_rate;
+	unsigned int byte_rate;
+	unsigned short block_align;
+	unsigned short bits_per_sample;
+	unsigned int data_id;
+	unsigned int data_sz;
+};
+
+
+#define PCM_WB_BUF_SIZE     640
+#define PCM_NARROW_BUF_SIZE 320
+
+static int record_fd = -1;
+static int send_fd = -1;
+static bool running = FALSE;
+
+
+static void voip_playback_run(void *arg)
+{
+    int rc, len, fd, frames = 0;
+    int pack_size = 320;
+    //char buf[MBTK_PCM_WB_BUF_SIZE];
+    char buf[BUFF_SIZE];
+    char *path = "/data/voip_playback.wav";
+    struct stat st;
+    struct riff_wave_header riff_wave_header;
+    struct chunk_header chunk_header;
+    struct chunk_fmt chunk_fmt = {0};
+    unsigned int more_chunks = 1;
+    uint32 header[4];
+
+    if(send_fd < 0) {
+        printf("Client socket not open.");
+        return;
+    }
+
+    /* Check and open source file */
+    if (access(path, F_OK) || stat(path, &st)) {
+        printf("%s: error reading from file %s\n", __FUNCTION__, path);
+        return;
+    }
+
+    if (!st.st_size) {
+        printf("%s: empty file %s\n", __FUNCTION__, path);
+        return;
+    }
+
+    fd = open(path, O_RDONLY);
+    if (fd < 0) {
+        printf("%s: error opening file %s\n", __FUNCTION__, path);
+        return;
+    }
+
+    lseek(fd, sizeof(struct wav_header), SEEK_SET);
+    uint32 sequence = 1;
+    uint32 timestamp = 0;
+    while (running) {
+        /* Playback loop */
+        memset(buf, 0x00, sizeof(buf));
+        len = read(fd, buf + 16, pack_size);
+        if (len == -1) {
+            printf("%s: error reading from file\n", __FUNCTION__);
+            break;
+        }
+
+        if (len == 0) {
+            /* reached EOF */
+            printf("%s: nothing to read\n", __FUNCTION__);
+            break;
+        }
+
+
+        header[0] = htonl(((uint32_t) 2 << 30) | ((uint32_t) 1 << 24) | ((uint32_t) 0x60 << 16) | ((uint32_t) sequence));
+        header[1] = htonl(timestamp);
+        header[2] = htonl(0xFFFF0000);
+        header[3] = htonl(0xFFFF0000);
+        memcpy(buf, &header, sizeof(header));
+
+        if((rc = sendto(send_fd, buf, len + 16, 0, NULL, 0)) < len + 16) {
+            printf("Send data fail: %d/%d\n", rc, len);
+            break;
+        } else {
+            printf("SEND : %d / %d\n", rc, len);
+        }
+
+        sequence++;
+        timestamp += len / 2;
+
+        ++frames;
+        //printf("%s: No.%d frame playback[len - %d]\n", __FUNCTION__, ++frames, len);
+        usleep(21000);
+    }
+
+    printf("playback_thread exit.\n");
+}
+
+static void sig_handler(int sig)
+{
+    running = FALSE;
+
+    printf("Success exit by signal...\n");
+
+    sleep(1);
+
+    exit(0);
+}
+
+static int rtp_udp_ser_open(const char *local_addr, int local_port)
+{
+    // No set local addr.
+    UNUSED(local_addr);
+
+    int fd = socket(AF_INET, SOCK_DGRAM, 0);
+    if(fd < 0){
+        printf("socket() fail.[%d]\n", errno);
+        return -1;
+    }
+
+    struct sockaddr_in servaddr;
+    memset(&servaddr, 0, sizeof(servaddr));
+    servaddr.sin_family = AF_INET;
+    servaddr.sin_port = htons(local_port);
+    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
+
+    if (bind(fd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr_in)) < 0) {
+        printf("bind() failed: %d\n", errno);
+        goto result_fail_with_close;
+    }
+
+    return fd;
+result_fail_with_close:
+    close(fd);
+    fd = -1;
+    printf("mbtk_sock_open() end:fail\n");
+    return -1;
+}
+
+static int rtp_udp_cli_open(const char *remote_addr, int remote_port)
+{
+    struct sockaddr_in dst_sa4, src_sa4;
+    if (inet_pton(AF_INET, "0.0.0.0", &src_sa4.sin_addr) > 0) {
+        src_sa4.sin_family = AF_INET;
+        src_sa4.sin_port = htons(0);
+        memset(&src_sa4.sin_zero, 0, sizeof(src_sa4.sin_zero));
+    } else {
+        printf("Set src addr fail.\n");
+        return -1;
+    }
+
+    if (inet_pton(AF_INET, remote_addr, &dst_sa4.sin_addr) > 0) {
+        dst_sa4.sin_family = AF_INET;
+        dst_sa4.sin_port = htons(remote_port);
+        memset(&dst_sa4.sin_zero, 0, sizeof(dst_sa4.sin_zero));
+    } else {
+        printf("Set dst addr fail.\n");
+        return -1;
+    }
+
+    int fd = socket(AF_INET, SOCK_DGRAM, 0);
+    if(fd < 0){
+        printf("socket() fail.[%d]\n", errno);
+        return -1;
+    }
+
+    if (bind(fd, (struct sockaddr*) &src_sa4, sizeof(src_sa4)) < 0) {
+        printf("bind() failed: %d\n", errno);
+        goto result_fail_with_close;
+    }
+
+    if (connect(fd, (struct sockaddr*) &dst_sa4, sizeof(dst_sa4)) < 0) {
+        printf("connect() failed: %d\n", errno);
+        goto result_fail_with_close;
+    }
+
+#if 0
+    if(socket_noblock(fd)) {
+        goto result_fail_with_close;
+    }
+#endif
+
+    return fd;
+result_fail_with_close:
+    close(fd);
+    fd = -1;
+    printf("mbtk_sock_open() end:fail\n");
+    return -1;
+}
+
+int main(int argc, char *argv[])
+{
+    if(argc != 2) {
+        printf("mbtk_rtp_udp_cli <IP>\n");
+        return -1;
+    }
+
+    // mbtk_log_init("radio", "RTP_TEST");
+
+    signal(SIGINT, sig_handler);
+    signal(SIGTERM, sig_handler);
+
+
+    int ser_fd = rtp_udp_ser_open(NULL, RTP_UDP_SER_PORT_DEFAULT);
+    if(ser_fd < 0) {
+        printf("rtp_udp_ser_open() fail.\n");
+        return -1;
+    }
+
+    send_fd = rtp_udp_cli_open(argv[1], RTP_UDP_CLI_PORT_DEFAULT);
+    if(send_fd < 0) {
+        printf("rtp_udp_cli_open() fail.\n");
+        // return -1;
+    }
+
+    struct wav_header header;
+    int rc = 0;
+    char *path = "/data/voip_record.wav";
+
+    header.riff_id = ID_RIFF;
+    header.riff_sz = 0;
+    header.riff_fmt = ID_WAVE;
+    header.fmt_id = ID_FMT;
+    header.fmt_sz = 16;
+    header.audio_format = 1;        //FORMAT_PCM;
+    header.num_channels = 1;        //Modem ONLY support mono recording
+    header.sample_rate = 8000;
+    header.bits_per_sample = 16;    //PCM_SAMPLEBITS_S16_LE;
+    header.byte_rate = (header.bits_per_sample / 8) * header.num_channels * header.sample_rate;
+    header.block_align = header.num_channels * (header.bits_per_sample / 8);
+    header.data_id = ID_DATA;
+
+    record_fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+    if (record_fd < 0) {
+        printf("%s: error opening file %s!\n", __FUNCTION__, path);
+        return -1;
+    }
+
+    lseek(record_fd, 0, SEEK_SET);
+    write(record_fd, &header, sizeof(struct wav_header));
+
+    //leave enough room for header
+    lseek(record_fd, sizeof(struct wav_header), SEEK_SET);
+
+    char buff[2048];
+    int len_recv;
+    int len_send;
+    running = TRUE;
+    bool is_first = TRUE;
+    while(running) {
+        len_recv = recvfrom(ser_fd, buff, sizeof(buff), 0, NULL, NULL);
+        if(len_recv < 0) {
+            printf("recvfrom() ret is %d,errno - %d\n", len_recv, errno);
+            continue;
+        } else if(len_recv == 0) {
+            printf("ret is 0\n");
+        } else if(len_recv > 16){
+            printf("RECV:len - %d\n", len_recv);
+            write(record_fd, buff + 16, len_recv - 16);
+
+            if(is_first) {
+                pthread_t playabck_thread/*, record_thread*/;
+                rc = pthread_create(&playabck_thread, NULL, (void *)&voip_playback_run, NULL);
+                if (rc < 0) {
+                    printf("error creating thread_start!");
+                    break;
+                }
+                is_first = FALSE;
+            }
+
+#if 0
+            if(cli_fd < 0) {
+                cli_fd = rtp_udp_cli_open(argv[1], RTP_UDP_CLI_PORT_DEFAULT);
+                if(cli_fd < 0) {
+                    printf("rtp_udp_cli_open() fail.\n");
+                    // return -1;
+                } else {
+                    printf("rtp_udp_cli_open() success.\n");
+                }
+            }
+
+            if(cli_fd > 0) {
+                len_send = sendto(cli_fd, buff, len_recv, 0, NULL, 0);
+                printf("SEND : %d / %d\n", len_send, len_recv);
+            }
+#endif
+        } else {
+            printf("RTP Header error.\n");
+        }
+    }
+
+    close(record_fd);
+
+    close(ser_fd);
+
+    return 0;
+}
+
+
diff --git a/mbtk/test/others/mbtk_spi_write.c b/mbtk/test/others/mbtk_spi_write.c
new file mode 100755
index 0000000..be15742
--- /dev/null
+++ b/mbtk/test/others/mbtk_spi_write.c
@@ -0,0 +1,320 @@
+#include <stdint.h>

+#include <unistd.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <stdarg.h>

+#include <getopt.h>

+#include <fcntl.h>

+#include <sys/ioctl.h>

+#include <linux/types.h>

+#include <linux/spi/spidev.h>

+ 

+#define 	SPI_DEBUG 1

+#define     DEBUG_SWITCH    1        /* 打开调试信息打印功能 */

+#define     ERR_DEBUG_SWITCH    1    /* 打印错误信息打印功能 */

+ 

+/**

+* 简单打印调试信息

+*/

+#if    DEBUG_SWITCH

+#define pr_debug(fmt,args...) printf(fmt, ##args)

+#else

+#define pr_debug(fmt,args...) /*do nothing */

+#endif

+ 

+/**

+* 错误信息打印

+* 自动打印发生错误时代码所在的位置

+*/

+#if    ERR_DEBUG_SWITCH

+#define pr_err(fmt,args...) printf("\nError:\nFile:<%s> Fun:[%s] Line:%d\n "fmt, __FILE__, __FUNCTION__, __LINE__, ##args)

+#else

+#define pr_err(fmt,args...) /*do nothing */

+#endif

+ 

+ 

+/*

+* 说明:SPI通讯实现

+*           方式一: 同时发送与接收实现函数: SPI_Transfer()

+*           方式二:发送与接收分开来实现

+*           SPI_Write() 只发送

+*           SPI_Read()  只接收

+*           两种方式不同之处:方式一,在发的过程中也在接收,第二种方式,收与发单独进行

+*  Created on: 2013-5-28

+*      Author: lzy

+*/

+static char device[64] = {0};

+static uint8_t mode = 0; /* SPI通信使用全双工,设置CPOL=0,CPHA=0。 */

+static uint8_t bits = 8; /* 8bits读写,MSB first。*/

+static uint32_t speed = 12 * 1000 * 1000;/* 设置12M传输速度 */

+static uint16_t delay = 0;

+static int g_SPI_Fd = 0;

+ 

+static void pabort(const char *s)

+{

+    perror(s);

+    abort();

+}

+ 

+/**

+*  功 能:同步数据传输

+* 入口参数 :

+*             TxBuf -> 发送数据首地址

+*             len -> 交换数据的长度

+* 出口参数:

+*             RxBuf -> 接收数据缓冲区

+* 返回值:0 成功

+* 开发人员:Lzy 2013-5-22

+*/

+int SPI_Transfer(const uint8_t *TxBuf, uint8_t *RxBuf, int len)

+{

+    int ret;

+    int fd = g_SPI_Fd;

+ 

+    struct spi_ioc_transfer tr =    {

+            .tx_buf = (unsigned long) TxBuf,

+            .rx_buf = (unsigned long) RxBuf,

+            .len =    len,

+            .delay_usecs = delay,

+    };

+ 

+    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);

+    if (ret < 1)

+        pr_err("can't send spi message");

+    else

+    {

+#if SPI_DEBUG

+        int i;

+        pr_debug("\nmbtk: send spi message Succeed");

+        pr_debug("\nmbtk: SPI Send [Len:%d]: ", len);

+        for (i = 0; i < len; i++)

+        {

+            if (i % 8 == 0)

+            printf("\n\t");

+            printf("0x%02X ", TxBuf[i]);

+        }

+        printf("\n");

+ 

+        pr_debug("mbtk: SPI Receive [len:%d]:", len);

+        for (i = 0; i < len; i++)

+        {

+            if (i % 8 == 0)

+            printf("\n\t");

+            printf("0x%02X ", RxBuf[i]);

+        }

+        printf("\n");

+#endif

+    }

+    return ret;

+}

+ 

+/**

+* 功 能:发送数据

+* 入口参数 :

+*             TxBuf -> 发送数据首地址

+*            len ->  发送与长度

+*返回值:0 成功

+* 开发人员:Lzy 2013-5-22

+*/

+int SPI_Write(uint8_t *TxBuf, int len)

+{

+    int ret;

+    int fd = g_SPI_Fd;

+ 

+    ret = write(fd, TxBuf, len);

+    if (ret < 0)

+        pr_err("SPI Write error\n");

+    else

+    {

+#if SPI_DEBUG

+        int i;

+        pr_debug("\nSPI Write [Len:%d]: ", len);

+        for (i = 0; i < len; i++)

+        {

+            if (i % 8 == 0)

+            printf("\n\t");

+            printf("0x%02X ", TxBuf[i]);

+        }

+        printf("\n");

+ 

+#endif

+    }

+ 

+    return ret;

+}

+ 

+/**

+* 功 能:接收数据

+* 出口参数:

+*         RxBuf -> 接收数据缓冲区

+*         rtn -> 接收到的长度

+* 返回值:>=0 成功

+* 开发人员:Lzy 2013-5-22

+*/

+int SPI_Read(uint8_t *RxBuf, int len)

+{

+    int ret;

+    int fd = g_SPI_Fd;

+    ret = read(fd, RxBuf, len);

+    if (ret < 0)

+        pr_err("SPI Read error\n");

+    else

+    {

+#if SPI_DEBUG

+        int i;

+        pr_debug("SPI Read [len:%d]:", len);

+        for (i = 0; i < len; i++)

+        {

+            if (i % 8 == 0)

+            printf("\n\t");

+            printf("0x%02X ", RxBuf[i]);

+        }

+        printf("\n");

+#endif

+    }

+ 

+    return ret;

+}

+ 

+/**

+* 功 能:打开设备  并初始化设备

+* 入口参数 :

+* 出口参数:

+* 返回值:0 表示已打开  0XF1 表示SPI已打开 其它出错

+* 开发人员:Lzy 2013-5-22

+*/

+int SPI_Open(void)

+{

+    int fd;

+    int ret = 0;

+ 

+    if (g_SPI_Fd != 0) /* 设备已打开 */

+        return 0xF1;

+ 

+    fd = open(device, O_RDWR);

+    if (fd < 0)

+        pabort("can't open device");

+    else

+        pr_debug("SPI - Open Succeed. Start Init SPI...\n");

+ 

+    g_SPI_Fd = fd;

+    /*

+     * spi mode

+     */

+    ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);

+    if (ret == -1)

+        pabort("can't set spi mode");

+ 

+    ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);

+    if (ret == -1)

+        pabort("can't get spi mode");

+ 

+    /*

+     * bits per word

+     */

+    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);

+    if (ret == -1)

+        pabort("can't set bits per word");

+ 

+    ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);

+    if (ret == -1)

+        pabort("can't get bits per word");

+ 

+    /*

+     * max speed hz

+     */

+    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);

+    if (ret == -1)

+        pabort("can't set max speed hz");

+ 

+    ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);

+    if (ret == -1)

+        pabort("can't get max speed hz");

+ 

+    pr_debug("spi mode: %d\n", mode);

+    pr_debug("bits per word: %d\n", bits);

+    pr_debug("max speed: %d KHz (%d MHz)\n", speed / 1000, speed / 1000 / 1000);

+ 

+    return ret;

+}

+ 

+/**

+* 功 能:关闭SPI模块

+*/

+int SPI_Close(void)

+{

+    int fd = g_SPI_Fd;

+ 

+    if (fd == 0) /* SPI是否已经打开*/

+        return 0;

+    close(fd);

+    g_SPI_Fd = 0;

+ 

+    return 0;

+}

+ 

+/**

+* 功 能:自发自收测试程序

+*         接收到的数据与发送的数据如果不一样 ,则失败

+* 说明:

+*         在硬件上需要把输入与输出引脚短跑

+* 开发人员:Lzy 2013-5-22

+*/

+int SPI_LookBackTest(void)

+{

+    int ret, i;

+    const int BufSize = 16;

+    uint8_t tx[BufSize], rx[BufSize];

+ 

+    bzero(rx, sizeof(rx));

+    for (i = 0; i < BufSize; i++)

+        tx[i] = i;

+ 

+    pr_debug("\nSPI - LookBack Mode Test...\n");

+    ret = SPI_Transfer(tx, rx, BufSize);

+    if (ret > 1)

+    {

+        ret = memcmp(tx, rx, BufSize);

+        if (ret != 0)

+        {

+            pr_err("LookBack Mode Test error\n");

+//            pabort("error");

+        }

+        else

+            pr_debug("SPI - LookBack Mode  OK\n");

+    }

+ 

+    return ret;

+}

+ 

+int main(int argc, char *argv[])

+{

+    int ret = 0;

+

+    if(argc == 2)

+    {

+        memset(device, 0x0, 64);

+        memcpy(device, argv[1], strlen(argv[1]));

+        printf("device: %s\n", device);

+    }

+    else

+    {

+        printf("format: mbtk_spi_write <dev>\n");

+        return -1;

+    }

+    ret = SPI_Open();

+    if (ret)

+        return ret;

+ 

+    SPI_LookBackTest();

+ 

+//    unsigned char buf[10];

+//    SPI_Write(buf, 10);

+//    SPI_Read(buf, 10);

+ 

+    SPI_Close();

+ 

+return 0;

+}

+

diff --git a/mbtk/test/others/partition_write_demo.c b/mbtk/test/others/partition_write_demo.c
new file mode 100755
index 0000000..5edfa2d
--- /dev/null
+++ b/mbtk/test/others/partition_write_demo.c
@@ -0,0 +1,56 @@
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+int main(int argc, char *argv[])
+{
+
+#if 1
+    // 100K
+    char buffer[102400];
+    long len = -1;
+    long count = 0;
+    int fd = open("/etc/file.temp", O_CREAT | O_WRONLY | O_TRUNC, 0666);
+    if(fd < 0) {
+        printf("Open file error:%d\n", errno);
+        return -1;
+    }
+
+    while((len = write(fd, buffer, sizeof(buffer))) > 0){
+        count += len;
+        printf("write : %ld\n", count);
+        //usleep(1000);
+    }
+
+    printf("Write complete,len = %ld, errno = %d\n", len, errno);
+
+    close(fd);
+#else
+    // 100K
+    int buffer = 1;
+    long len = -1;
+    long count = 0;
+
+    FILE *file = fopen("/etc/file.temp", "w");
+    if(file == NULL) {
+        printf("Open file error:%d\n", errno);
+        return -1;
+    }
+
+    while((len = fwrite(&buffer, sizeof(int), 1,file)) > 0){
+        buffer++;
+
+        // printf("write : %d\n", buffer);
+        //usleep(1000);
+    }
+
+    printf("Write complete,len = %d, errno = %d\n", len, errno);
+
+    fclose(file);
+#endif
+    return 0;
+}
+
diff --git a/mbtk/test/others/polarssl_demo.c b/mbtk/test/others/polarssl_demo.c
new file mode 100755
index 0000000..1405fdb
--- /dev/null
+++ b/mbtk/test/others/polarssl_demo.c
@@ -0,0 +1,488 @@
+#include <stdio.h>
+
+#ifdef MBTK_POLARSSL_SUPPORT
+#include "mbtk_log.h"
+#include "ql/ql_mcm_sim.h"
+#include <sys/socket.h>
+#include <polarssl/net.h>
+#include <polarssl/ssl.h>
+#include <polarssl/entropy.h>
+#include <polarssl/ctr_drbg.h>
+#include <polarssl/certs.h>
+#include <polarssl/x509.h>
+#include <polarssl/error.h>
+#include <polarssl/debug.h>
+#include <polarssl/config.h>
+
+#define DFL_SERVER_NAME         "asr"
+#define DFL_SERVER_ADDR         NULL
+#define DFL_SERVER_PORT         4433
+#define DFL_REQUEST_PAGE        "/"
+#define DFL_REQUEST_SIZE        -1
+#define DFL_DEBUG_LEVEL         0
+#define DFL_NBIO                0
+#define DFL_CA_FILE             "/ca.crt"
+#define DFL_CA_PATH             "/ca.crt"
+#define DFL_CRT_FILE            "/client.crt"
+#define DFL_KEY_FILE            "/client.key"
+#define DFL_PSK                 ""
+#define DFL_PSK_IDENTITY        "Client_identity"
+#define DFL_FORCE_CIPHER        0
+#define DFL_RENEGOTIATION       SSL_RENEGOTIATION_DISABLED
+#define DFL_ALLOW_LEGACY        SSL_LEGACY_NO_RENEGOTIATION
+#define DFL_RENEGOTIATE         0
+#define DFL_EXCHANGES           1
+#define DFL_MIN_VERSION         SSL_MINOR_VERSION_3
+#define DFL_MAX_VERSION         SSL_MINOR_VERSION_3
+#define DFL_AUTH_MODE           SSL_VERIFY_REQUIRED
+#define DFL_MFL_CODE            SSL_MAX_FRAG_LEN_NONE
+#define DFL_TRUNC_HMAC          0
+#define DFL_RECONNECT           0
+#define DFL_RECO_DELAY          0
+#define DFL_TICKETS             SSL_SESSION_TICKETS_ENABLED
+#define DFL_ALPN_STRING         NULL
+
+#define GET_REQUEST "GET %s HTTP/1.0\r\nExtra-header: "
+#define GET_REQUEST_END "\r\n\r\n"
+
+#define  CA_CERT \
+"-----BEGIN CERTIFICATE-----\r\n" \
+"MIIDKjCCAhICCQCOewfZiRCiNjANBgkqhkiG9w0BAQUFADBXMQswCQYDVQQGEwJD\r\n" \
+"TjEQMA4GA1UECBMHU2lDaHVhbjEVMBMGA1UEChMMTU9CSUxFVEVLLkNBMQswCQYD\r\n" \
+"VQQLEwJJVDESMBAGA1UEAxMJTU9CSUxFVEVLMB4XDTE4MDkxODA4MDUzMloXDTMz\r\n" \
+"MDkxOTA4MDUzMlowVzELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB1NpQ2h1YW4xFTAT\r\n" \
+"BgNVBAoTDE1PQklMRVRFSy5DQTELMAkGA1UECxMCSVQxEjAQBgNVBAMTCU1PQklM\r\n" \
+"RVRFSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOkdYJF1h1xjKbY0\r\n" \
+"ipbl88G653PiCh8ZMjmIUYeiDKC8+0wtXZtHvQIl6AncOzBy9XHVOctbKn34exC8\r\n" \
+"SEotMuo2T49vs9VtE8GYu2pOrf3m42NpLRnYAxfm9qw53CMHx+Jn7Oa9fnxa8haA\r\n" \
+"pRc2BTVadWGoS8EEwoZFk0eNb7Z2Gc7U0c+GhISI4oVTTocGvGgMzkvduu5JJbbc\r\n" \
+"BOcNFrii9sRO9vtOYQtqOEg01Uum2Dwp/o2bDLXNJEqAIh4WACiM4iPmmlRHWT2y\r\n" \
+"NjQ3vcbEdrFwbHRtO46+Vw54HnSyCoFb3uCHMNMvXObZ/8AU9E3Cgat4j0sgEeB0\r\n" \
+"hqA4MiMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAtEAjf0CjsLgG9ROdmp1qXYft\r\n" \
+"+ndIT5l82KRK57ZQsfdFbnJOvALeF/ICKU0M2TXgJNiGOA5RxDi00YYdMbOIPwVZ\r\n" \
+"JH4b87J/LYdLAGf+Q+kVI6gWH3hPm4Jzfzq/40KVrf3mpa54yWz6ZYtwfxBjrMgr\r\n" \
+"IVe0O5SIJ99lsddgzgUkqYN2vWJW2zZ50xuXOAyo+pOnjzX0wuOcaBT3JCHWJRAb\r\n" \
+"VhJCf9JbswDgnddJerqFtB8pnpAOdGokLCOoM06q3s3P9mhGX+72HXdX7G8CSAuG\r\n" \
+"PVCGf6RaF0/G4B9R1c3du3lZRlQWfx2pxyU0LS86iFQFWqzqcWEXIcULVdcErQ==\r\n" \
+"-----END CERTIFICATE-----\r\n"
+
+const char ca1_cert[]= CA_CERT;
+
+
+struct options
+{
+    const char *server_name;    /* hostname of the server (client only)     */
+    const char *server_addr;    /* address of the server (client only)      */
+    int server_port;            /* port on which the ssl service runs       */
+    int debug_level;            /* level of debugging                       */
+    int nbio;                   /* should I/O be blocking?                  */
+    const char *request_page;   /* page on server to request                */
+    int request_size;           /* pad request with header to requested size */
+    const char *ca_file;        /* the file with the CA certificate(s)      */
+    const char *ca_path;        /* the path with the CA certificate(s) reside */
+    const char *crt_file;       /* the file with the client certificate     */
+    const char *key_file;       /* the file with the client key             */
+    const char *psk;            /* the pre-shared key                       */
+    const char *psk_identity;   /* the pre-shared key identity              */
+    int force_ciphersuite[2];   /* protocol/ciphersuite to use, or all      */
+    int renegotiation;          /* enable / disable renegotiation           */
+    int allow_legacy;           /* allow legacy renegotiation               */
+    int renegotiate;            /* attempt renegotiation?                   */
+    int renego_delay;           /* delay before enforcing renegotiation     */
+    int exchanges;              /* number of data exchanges                 */
+    int min_version;            /* minimum protocol version accepted        */
+    int max_version;            /* maximum protocol version accepted        */
+    int auth_mode;              /* verify mode for connection               */
+    unsigned char mfl_code;     /* code for maximum fragment length         */
+    int trunc_hmac;             /* negotiate truncated hmac or not          */
+    int reconnect;              /* attempt to resume session                */
+    int reco_delay;             /* delay in seconds before resuming session */
+    int tickets;                /* enable / disable session tickets         */
+    const char *alpn_string;    /* ALPN supported protocols                 */
+} opt;
+
+
+static sim_client_handle_type cli_handle;
+int server_fd = -1;
+
+static void my_debug( void *ctx, int level, const char *str )
+{
+    ((void) level);
+
+    fprintf( (FILE *) ctx, "%s", str );
+    fflush(  (FILE *) ctx  );
+}
+
+
+static int ssl_client_init()
+{
+    int ret = 0, len, tail_len, i, written, frags;
+    unsigned char buf[SSL_MAX_CONTENT_LEN + 1];
+    const char *pers = "ssl_client";
+
+    entropy_context entropy;
+    ctr_drbg_context ctr_drbg;
+    ssl_context ssl;
+    ssl_session saved_session;
+    x509_crt cacert;
+    x509_crt clicert;
+    pk_context pkey;
+
+    memset( &ssl, 0, sizeof( ssl_context ) );
+    memset( &saved_session, 0, sizeof( ssl_session ) );
+    x509_crt_init( &cacert );
+    x509_crt_init( &clicert );
+    pk_init( &pkey );
+
+    fflush( stdout );
+
+     /*
+     * 0. Initialize the RNG and the session data
+     */
+
+    entropy_init( &entropy );
+    if( ( ret = ctr_drbg_init( &ctr_drbg, entropy_func, &entropy,
+                               (const unsigned char *) pers,
+                               strlen( pers ) ) ) != 0 )
+    {
+        printf( " failed\n  ! ctr_drbg_init returned -0x%x\n", -ret );
+        goto exit;
+    }
+
+    printf( " ok\n" );
+
+     /*
+     * 1.1. Load the trusted CA
+     */
+    //ret = x509_crt_parse(&cacert,ca1_cert,strlen(ca1_cert));
+    ret = x509_crt_parse_file( &cacert, opt.ca_path );
+    if( ret < 0 )
+    {
+        printf( " failed\n  !  ca x509_crt_parse returned -0x%x\n\n", -ret );
+        goto exit;
+    }
+    printf( " ok\n" );
+
+     /*
+     * 1.2. Load own certificate and private key
+     *
+     * (can be skipped if client authentication is not required)
+     */
+
+    ret = x509_crt_parse_file( &clicert, opt.crt_file );
+    if( ret != 0 )
+    {
+        printf( " failed\n  !  crt x509_crt_parse returned -0x%x\n\n", -ret );
+        goto exit;
+    }
+
+    ret = pk_parse_keyfile( &pkey, opt.key_file, NULL);
+    if( ret != 0 )
+    {
+        printf( " failed\n  !  key x509_crt_parse returned -0x%x\n\n", -ret );
+        goto exit;
+    }
+
+    printf( " ok\n" );
+
+     /*
+     * 2. Setup stuff
+     */
+    printf( "  . Setting up the SSL/TLS structure..." );
+    fflush( stdout );
+
+    if( ( ret = ssl_init( &ssl ) ) != 0 )
+    {
+        printf( " failed\n  ! ssl_init returned -0x%x\n\n", -ret );
+        goto exit;
+    }
+
+    ssl_set_endpoint( &ssl, SSL_IS_CLIENT );
+    ssl_set_authmode( &ssl, opt.auth_mode );
+
+    ssl_set_rng( &ssl, ctr_drbg_random, &ctr_drbg );
+    ssl_set_dbg( &ssl, my_debug, stdout );
+
+    ssl_set_bio( &ssl, net_recv, &server_fd, net_send, &server_fd );
+
+    ssl_set_renegotiation( &ssl, opt.renegotiation );
+    ssl_legacy_renegotiation( &ssl, opt.allow_legacy );
+
+    ssl_set_ca_chain( &ssl, &cacert, NULL, NULL );
+
+    if( ( ret = ssl_set_own_cert( &ssl, &clicert, &pkey ) ) != 0 )
+        {
+            printf( " failed\n  ! ssl_set_own_cert returned %d\n\n", ret );
+            goto exit;
+        }
+    if( opt.min_version != -1 )
+        ssl_set_min_version( &ssl, SSL_MAJOR_VERSION_3, opt.min_version );
+    if( opt.max_version != -1 )
+        ssl_set_max_version( &ssl, SSL_MAJOR_VERSION_3, opt.max_version );
+    printf( " ok\n" );
+    /*
+     * 3. Handshake
+     */
+    printf( "  . Performing the SSL/TLS handshake..." );
+    fflush( stdout );
+
+    while( ( ret = ssl_handshake( &ssl ) ) != 0 )
+    {
+        if( ret != POLARSSL_ERR_NET_WANT_READ && ret != POLARSSL_ERR_NET_WANT_WRITE )
+        {
+            printf( " failed\n  ! ssl_handshake returned -0x%x\n", -ret );
+            if( ret == POLARSSL_ERR_X509_CERT_VERIFY_FAILED )
+                printf(
+                    "    Unable to verify the server's certificate. "
+                        "Either it is invalid,\n"
+                    "    or you didn't set ca_file or ca_path "
+                        "to an appropriate value.\n"
+                    "    Alternatively, you may want to use "
+                        "auth_mode=optional for testing purposes.\n" );
+            printf( "\n" );
+            goto exit;
+        }
+    }
+
+    printf( " ok\n    [ Protocol is %s ]\n    [ Ciphersuite is %s ]\n",
+            ssl_get_version( &ssl ), ssl_get_ciphersuite( &ssl ) );
+
+    /*
+     * 4. Verify the server certificate
+     */
+    printf( "  . Verifying peer X.509 certificate..." );
+
+    if( ( ret = ssl_get_verify_result( &ssl ) ) != 0 )
+    {
+        printf( " failed\n" );
+
+        if( ( ret & BADCERT_EXPIRED ) != 0 )
+            printf( "  ! server certificate has expired\n" );
+
+        if( ( ret & BADCERT_REVOKED ) != 0 )
+            printf( "  ! server certificate has been revoked\n" );
+
+        if( ( ret & BADCERT_CN_MISMATCH ) != 0 )
+            printf( "  ! CN mismatch (expected CN=%s)\n", opt.server_name );
+
+        if( ( ret & BADCERT_NOT_TRUSTED ) != 0 )
+            printf( "  ! self-signed or not signed by a trusted CA\n" );
+
+        printf( "\n" );
+    }
+    else
+        printf( " ok\n" );
+
+    if( ssl_get_peer_cert( &ssl ) != NULL )
+    {
+        printf( "  . Peer certificate information    ...\n" );
+        x509_crt_info( (char *) buf, sizeof( buf ) - 1, "      ",
+                       ssl_get_peer_cert( &ssl ) );
+        printf( "%s\n", buf );
+    }
+    /*
+     * 5. Write the GET request
+     */
+    printf( "  > Write to server:" );
+    fflush( stdout );
+
+    len = snprintf( (char *) buf, sizeof(buf) - 1, GET_REQUEST,
+                    opt.request_page );
+    tail_len = strlen( GET_REQUEST_END );
+
+    /* Add padding to GET request to reach opt.request_size in length */
+    if( opt.request_size != DFL_REQUEST_SIZE &&
+        len + tail_len < opt.request_size )
+    {
+        memset( buf + len, 'A', opt.request_size - len - tail_len );
+        len += opt.request_size - len - tail_len;
+    }
+
+    strncpy( (char *) buf + len, GET_REQUEST_END, sizeof(buf) - len - 1 );
+    len += tail_len;
+
+    /* Truncate if request size is smaller than the "natural" size */
+    if( opt.request_size != DFL_REQUEST_SIZE &&
+        len > opt.request_size )
+    {
+        len = opt.request_size;
+
+        /* Still end with \r\n unless that's really not possible */
+        if( len >= 2 ) buf[len - 2] = '\r';
+        if( len >= 1 ) buf[len - 1] = '\n';
+    }
+
+    for( written = 0, frags = 0; written < len; written += ret, frags++ )
+    {
+        while( ( ret = ssl_write( &ssl, buf + written, len - written ) ) <= 0 )
+        {
+            if( ret != POLARSSL_ERR_NET_WANT_READ && ret != POLARSSL_ERR_NET_WANT_WRITE )
+            {
+                printf( " failed\n  ! ssl_write returned -0x%x\n\n", -ret );
+                goto exit;
+            }
+        }
+    }
+
+    buf[written] = '\0';
+    printf( " %d bytes written in %d fragments\n\n%s\n", written, frags, (char *) buf );
+
+    /*
+     * 6. Read the HTTP response
+     */
+    printf( "  < Read from server:" );
+    fflush( stdout );
+
+    do
+    {
+        len = sizeof( buf ) - 1;
+        memset( buf, 0, sizeof( buf ) );
+        ret = ssl_read( &ssl, buf, len );
+
+        if( ret == POLARSSL_ERR_NET_WANT_READ ||
+            ret == POLARSSL_ERR_NET_WANT_WRITE )
+            continue;
+
+        if( ret <= 0 )
+        {
+            switch( ret )
+            {
+                case POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY:
+                    printf( " connection was closed gracefully\n" );
+                    ret = 0;
+                    goto close_notify;
+
+                case 0:
+                case POLARSSL_ERR_NET_CONN_RESET:
+                    printf( " connection was reset by peer\n" );
+                    ret = 0;
+                    goto exit;
+
+                default:
+                    printf( " ssl_read returned -0x%x\n", -ret );
+                    goto exit;
+            }
+        }
+
+        len = ret;
+        buf[len] = '\0';
+        printf( " %d bytes read\n\n%s", len, (char *) buf );
+
+        /* End of message should be detected according to the syntax of the
+         * application protocol (eg HTTP), just use a dummy test here. */
+        if( ret > 0 && buf[len-1] == '\n' )
+        {
+            ret = 0;
+            break;
+        }
+    }
+    while( 1 );
+
+    /*
+     * 7. Done, cleanly close the connection
+     */
+close_notify:
+        printf( "  . Closing the connection..." );
+
+        while( ( ret = ssl_close_notify( &ssl ) ) < 0 )
+        {
+            if( ret == POLARSSL_ERR_NET_CONN_RESET )
+            {
+                printf( " ok (already closed by peer)\n" );
+                ret = 0;
+                goto exit;
+            }
+
+            if( ret != POLARSSL_ERR_NET_WANT_READ &&
+                ret != POLARSSL_ERR_NET_WANT_WRITE )
+            {
+                printf( " failed\n  ! ssl_close_notify returned %d\n\n", ret );
+                goto exit;
+            }
+        }
+
+        printf( " ok\n" );
+exit:
+    if( server_fd )
+        net_close( server_fd );
+
+    x509_crt_free( &clicert );
+    x509_crt_free( &cacert );
+    pk_free( &pkey );
+    ssl_session_free( &saved_session );
+    ssl_free( &ssl );
+    ctr_drbg_free( &ctr_drbg );
+    entropy_free( &entropy );
+
+    printf( " ok end\n" );
+    return 0;
+}
+
+int main(int argc, char *argv[])
+{
+    printf("Start!\n");
+
+    opt.server_name         = DFL_SERVER_NAME;
+    opt.server_addr         = DFL_SERVER_ADDR;
+    opt.server_port         = DFL_SERVER_PORT;
+    opt.debug_level         = DFL_DEBUG_LEVEL;
+    opt.nbio                = DFL_NBIO;
+    opt.request_page        = DFL_REQUEST_PAGE;
+    opt.request_size        = DFL_REQUEST_SIZE;
+    opt.ca_file             = DFL_CA_FILE;
+    opt.ca_path             = DFL_CA_PATH;
+    opt.crt_file            = DFL_CRT_FILE;
+    opt.key_file            = DFL_KEY_FILE;
+    opt.psk                 = DFL_PSK;
+    opt.psk_identity        = DFL_PSK_IDENTITY;
+    opt.force_ciphersuite[0]= DFL_FORCE_CIPHER;
+    opt.renegotiation       = DFL_RENEGOTIATION;
+    opt.allow_legacy        = DFL_ALLOW_LEGACY;
+    opt.renegotiate         = DFL_RENEGOTIATE;
+    opt.exchanges           = DFL_EXCHANGES;
+    opt.min_version         = DFL_MIN_VERSION;
+    opt.max_version         = DFL_MAX_VERSION;
+    opt.auth_mode           = DFL_AUTH_MODE;
+    opt.mfl_code            = DFL_MFL_CODE;
+    opt.trunc_hmac          = DFL_TRUNC_HMAC;
+    opt.reconnect           = DFL_RECONNECT;
+    opt.reco_delay          = DFL_RECO_DELAY;
+    opt.tickets             = DFL_TICKETS;
+    opt.alpn_string         = DFL_ALPN_STRING;
+
+
+    if(argc < 3)
+    {
+        printf("input error \n example: mbtk_test ip prot\n");
+        return -1;
+    }
+    opt.server_addr = argv[1];
+    opt.server_port = atoi(argv[2]);
+
+    int ret = -1;
+    if( ( ret = net_connect( &server_fd, opt.server_addr,
+                                         opt.server_port ) ) != 0 )
+    {
+        printf( " failed\n  ! net_connect returned -0x%x\n\n", -ret );
+        return -1;
+    }
+
+    ret = net_set_nonblock( server_fd );
+    if( ret != 0 )
+    {
+        printf( " failed\n  ! net_set_(non)block() returned -0x%x\n\n", -ret );
+        return -1;
+    }
+    printf( " ok\n" );
+    ret = ssl_client_init();
+    printf("ret is %d\n",ret);
+    printf("End!\n");
+    return 0;
+}
+#else
+int main(int argc, char *argv[])
+{
+	printf("No support polarssl.\n");
+	return 0;
+}
+#endif
\ No newline at end of file
diff --git a/mbtk/test/others/proc_demo.c b/mbtk/test/others/proc_demo.c
new file mode 100755
index 0000000..929984c
--- /dev/null
+++ b/mbtk/test/others/proc_demo.c
@@ -0,0 +1,42 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int pub_int_d = 4;
+char *str = "abc";
+int bss_1;
+
+//int bss_1;
+//static int static_bss_2;
+
+void test(int c)
+{
+//    int d = 10;
+    //printf("函数参数:test_c = %p, 局部变量:d = %p\n", &c, &d);
+}
+
+int main(int argc, char *argv[])
+{
+    printf("[栈]函数参数:argc = %p, argv = %p\n", &argc, argv);
+
+    int int_a;
+    static int static_int_b;
+    char *temp_malloc = (char*)malloc(10);
+    const char temp[10];
+
+    printf("[栈]局部变量:int_a[%d] = %p, [BSS]局部静态变量:static_int_b[%d] = %p\n", int_a, &int_a, static_int_b, &static_int_b);
+    printf("[DATA]全局变量:pub_int_d[%d] = %p\n", pub_int_d, &pub_int_d);
+    printf("常量:str = %p, 堆空间:temp_malloc = %p\n", str, temp_malloc);
+    printf("函数:test_func = %p\n", test);
+    printf("const_str = %p, &(temp[3]) = %p\n", temp, &(temp[3]));
+    printf("BSS : %d, %p\n", bss_1, &bss_1);
+
+    test(5);
+
+    while(1) {
+        sleep(24 * 60 * 60);
+    }
+
+    return 0;
+}
+
diff --git a/mbtk/test/others/touch_ev_demo.c b/mbtk/test/others/touch_ev_demo.c
new file mode 100755
index 0000000..133384b
--- /dev/null
+++ b/mbtk/test/others/touch_ev_demo.c
@@ -0,0 +1,376 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <linux/input.h>
+#include <unistd.h>
+#include <linux/fb.h>
+#include <sys/mman.h>
+#include <time.h>
+#include <pthread.h>
+#include <sys/poll.h>
+#include <dirent.h>
+#include <stdbool.h>
+
+// #include "mbtk_log.h"
+
+#ifndef TRUE
+#define TRUE   1   /* Boolean true value. */
+#endif
+
+#ifndef true
+#define true   1   /* Boolean true value. */
+#endif
+
+#ifndef FALSE
+#define FALSE  0   /* Boolean false value. */
+#endif
+
+#ifndef false
+#define false  0   /* Boolean false value. */
+#endif
+
+
+#ifndef NULL
+#define NULL  0
+#endif
+
+
+#ifndef null
+#define null  0
+#endif
+
+#define LOGI printf
+#define LOGE printf
+
+/**
+ * Compiler-digit : 16
+ * char : 1     (%c)
+ * char* : 2
+ * short int : 2
+ * int : 2      (%d)
+ * unsigned int : 2  (%u)
+ * float : 4    (%f)
+ * double : 8   (%f)
+ * long : 4
+ * unsigned long : 4
+ * long long : 8
+ * unsigned long long : 8
+ *
+ *
+ * Compiler-digit : 32
+ * char : 1
+ * char* : 4
+ * short int : 2
+ * int : 4
+ * unsigned int : 4
+ * float : 4
+ * double : 8
+ * long : 4
+ * unsigned long : 4
+ * long long : 8
+ * unsigned long long : 8
+ *
+ *
+ * Compiler-digit : 64
+ * char : 1
+ * char* : 8
+ * short int : 2
+ * int : 4
+ * unsigned int : 4
+ * float : 4
+ * double : 8
+ * long : 8
+ * unsigned long : 8
+ * long long : 8
+ * unsigned long long : 8
+ */
+typedef unsigned char boolean; /* Boolean value type. */
+// typedef unsigned char bool; /* Boolean value type. */
+typedef unsigned long long uint64; /* Unsigned 64 bit value */
+typedef unsigned long long uint64_t; /* Unsigned 64 bit value */
+typedef unsigned int uint32; /* Unsigned 32 bit value */
+typedef unsigned int uint32_t; /* Unsigned 32 bit value */
+typedef unsigned short uint16; /* Unsigned 16 bit value */
+typedef unsigned short uint16_t;
+typedef unsigned char uint8; /* Unsigned 8  bit value */
+typedef unsigned char uint8_t;
+typedef signed long long int64; /* Signed 64 bit value */
+typedef signed long long sint64; /* Signed 64 bit value */
+typedef signed int int32; /* Signed 32 bit value */
+typedef signed int sint32; /* Signed 32 bit value */
+typedef signed short int16; /* Signed 16 bit value */
+typedef signed short sint16; /* Signed 16 bit value */
+typedef signed char int8; /* Signed 8  bit value */
+typedef signed char sint8; /* Signed 8  bit value */
+typedef unsigned char byte; /* byte type */
+
+//#include "mbtk_type.h"
+//#include "mbtk_log.h"
+
+typedef int (*ev_callback)(int fd, uint32_t epevents, void *data);
+
+typedef enum {
+    ACTION_DOWN,
+    ACTION_MOVE,
+    ACTION_UP,
+    ACTION_CANCEL
+} touch_event_action_enum;
+
+typedef struct {
+    touch_event_action_enum action;
+    int x;
+    int y;
+} touch_event;
+
+static int move_x;
+static touch_event event_pre;
+static bool action_down_get = false;
+static bool action_touched = false;
+
+#define MAX_DEVICES 16
+#define MAX_MISC_FDS 16
+
+#define BITS_PER_LONG (sizeof(unsigned long) * 8)
+#define BITS_TO_LONGS(x) (((x) + BITS_PER_LONG - 1) / BITS_PER_LONG)
+
+#define test_bit(bit, array) \
+    ((array)[(bit)/BITS_PER_LONG] & (1 << ((bit) % BITS_PER_LONG)))
+
+struct fd_info {
+    ev_callback cb;
+    void *data;
+};
+
+static struct pollfd ev_fds[MAX_DEVICES + MAX_MISC_FDS];
+static struct fd_info ev_fdinfo[MAX_DEVICES + MAX_MISC_FDS];
+
+static unsigned ev_count = 0;
+static unsigned ev_dev_count = 0;
+static unsigned ev_misc_count = 0;
+
+int ev_get_input(int fd, short revents, struct input_event *ev);
+bool event_process(struct input_event ev);
+
+int ev_cb(int fd, uint32_t epevents, void *data)
+{
+    struct input_event ev;
+
+    int retval = ev_get_input(fd, epevents, &ev);
+    if(retval < 0) return -1;
+
+    if(!event_process(ev)) return 0;
+
+    return 0;
+}
+
+int ev_init(void *data)
+{
+    DIR *dir;
+    struct dirent *de;
+    int fd;
+
+    dir = opendir("/dev/input");
+    if(dir != 0) {
+        while((de = readdir(dir))) {
+            unsigned long ev_bits[BITS_TO_LONGS(EV_MAX)];
+
+//            fprintf(stderr,"/dev/input/%s\n", de->d_name);
+            if(strncmp(de->d_name,"event",5)) continue;
+            fd = openat(dirfd(dir), de->d_name, O_RDONLY);
+            if(fd < 0) continue;
+
+            /* read the evbits of the input device */
+            if (ioctl(fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits) < 0) {
+                close(fd);
+                continue;
+            }
+
+            /* TODO: add ability to specify event masks. For now, just assume
+             * that only EV_KEY and EV_REL event types are ever needed. */
+            if (!test_bit(EV_KEY, ev_bits) && !test_bit(EV_REL, ev_bits)) {
+                close(fd);
+                continue;
+            }
+
+            ev_fds[ev_count].fd = fd;
+            ev_fds[ev_count].events = POLLIN;
+            ev_fdinfo[ev_count].cb = ev_cb;
+            ev_fdinfo[ev_count].data = data;
+            ev_count++;
+            ev_dev_count++;
+            if(ev_dev_count == MAX_DEVICES) break;
+        }
+    }
+
+    return 0;
+}
+
+void ev_exit(void)
+{
+    while (ev_count > 0) {
+        close(ev_fds[--ev_count].fd);
+    }
+    ev_misc_count = 0;
+    ev_dev_count = 0;
+}
+
+int ev_wait(int timeout)
+{
+    int r;
+
+    r = poll(ev_fds, ev_count, timeout);
+    if (r <= 0)
+        return -1;
+    return 0;
+}
+
+void ev_dispatch(void)
+{
+    unsigned n;
+//    int ret;
+
+    for (n = 0; n < ev_count; n++) {
+        ev_callback cb = ev_fdinfo[n].cb;
+        if (cb && (ev_fds[n].revents & ev_fds[n].events))
+            cb(ev_fds[n].fd, ev_fds[n].revents, ev_fdinfo[n].data);
+    }
+}
+
+int ev_get_input(int fd, short revents, struct input_event *ev)
+{
+    int r;
+
+    if (revents & POLLIN) {
+        r = read(fd, ev, sizeof(*ev));
+        if (r == sizeof(*ev))
+            return 0;
+    }
+    return -1;
+}
+
+bool event_process(struct input_event ev)
+{
+    LOGI("Event:%d,%d,%d\n", ev.type, ev.code, ev.value);
+
+//    if(ev.type != EV_KEY){
+//        return false;
+//    }
+
+    bool is_touch = true;
+    // Touch Down/Up
+    if(ev.type == EV_KEY && ev.code == BTN_TOUCH) {
+        if(!!ev.value) { // Down
+            action_down_get = true;
+            action_touched = true;
+        }
+        else // UP
+        {
+            action_down_get = false;
+            action_touched = false;
+        }
+    } else if(ev.type == EV_ABS) { // Touch move
+        if(!action_touched) // No down
+            return false;
+    } else if(ev.type != EV_KEY) {
+        return false;
+    } else {
+        is_touch = false;
+    }
+
+    if (!is_touch && ev.value < 2){ // 2 is long press events
+        int down = !!ev.value;
+        if (down){
+            LOGI("LongPress : DOWN.");
+            //if(!l->onKeyDown(ev.type, ev.code)) return false;
+        }else{
+            //if(!l->onKeyUp(ev.type, ev.code)) return false;
+            LOGI("LongPress : UP.");
+        }
+    } else if (is_touch) {
+        touch_event m_event;
+        if(ev.type == EV_ABS) { // Move
+            if(ev.code == KEY_SLASH) { // X
+                move_x = ev.value;
+            } else if(ev.code == KEY_RIGHTSHIFT) { // Y
+                if(action_down_get)
+                {
+                    m_event.action = ACTION_DOWN;
+                    action_down_get = false;
+                } else {
+                    m_event.action = ACTION_MOVE;
+                }
+                m_event.x = move_x;
+                m_event.y = ev.value;
+
+                if(event_pre.x != m_event.x
+                    || event_pre.y != m_event.y)
+                {
+                    event_pre.x = m_event.x;
+                    event_pre.y = m_event.y;
+                #ifdef MBTK_TP_RESIZE_SUPPORT
+                    point_resize(getScreenWidth(),
+                        getScreenHeight(),
+                        mStatusBar->isVisibility() ? mStatusBar->getHeight() : 0,
+                        &m_event);
+                #endif
+                    LOGI("Window onTouchEvent action:%d (%d,%d) -> (%d,%d)",
+                        m_event.action, event_pre.x, event_pre.y, m_event.x, m_event.y);
+
+                }
+            } else {
+                // Do nothing
+            }
+        } else if(!action_down_get){ // UP
+            m_event.action = ACTION_UP;
+            m_event.x = event_pre.x;
+            m_event.y = event_pre.y;
+
+        #ifdef MBTK_TP_RESIZE_SUPPORT
+            point_resize(getScreenWidth(),
+                getScreenHeight(),
+                mStatusBar->isVisibility() ? mStatusBar->getHeight() : 0,
+                &m_event);
+        #endif
+
+            LOGI("Window onTouchEvent action:%d (%d,%d) -> (%d,%d)",
+                m_event.action, event_pre.x, event_pre.y, m_event.x, m_event.y);
+
+        } else {
+            // Do nothing
+        }
+    } else {
+        // Do nothing
+    }
+
+    //invalidate();
+
+    return true;
+}
+
+int main(int argc, char *argv[])
+{
+    // mbtk_log_init(NULL, "MBTK_EVENT");
+
+    if(ev_init(NULL)) {
+        LOGE("ev_init() fail.");
+        return -1;
+    }
+
+    LOGI("event getting...");
+    while(1) {
+        if(!ev_wait(-1))
+            ev_dispatch();
+    }
+
+    LOGI("exit!!!");
+    return 0;
+}
diff --git a/mbtk/test/others/uart_read_demo.c b/mbtk/test/others/uart_read_demo.c
new file mode 100755
index 0000000..1b7eea4
--- /dev/null
+++ b/mbtk/test/others/uart_read_demo.c
@@ -0,0 +1,185 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <string.h>
+
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+
+#define DATABITS    CS8
+#define STOPBITS    0
+#define PARITYON    0
+#define PARITY      0
+
+int uart_baud_get(int baud)
+{
+    int rate = 0;
+    switch(baud)
+    {
+        case 300:
+            rate = B300;
+            break;
+        case 600:
+            rate = B600;
+            break;
+        case 1200:
+            rate = B1200;
+            break;
+        case 2400:
+            rate = B2400;
+            break;
+        case 4800:
+            rate = B4800;
+            break;
+        case 9600:
+            rate = B9600;
+            break;
+        case 19200:
+            rate = B19200;
+            break;
+        case 38400:
+            rate = B38400;
+            break;
+        case 57600:
+            rate = B57600;
+            break;
+        case 115200:
+            rate = B115200;
+            break;
+        case 230400:
+            rate = B230400;
+            break;
+        case 460800:
+            rate = B460800;
+            break;
+        case 921600:
+            rate = B921600;
+            break;
+        case 1500000:
+            rate = B1500000;
+            break;
+        case 2000000:
+            rate = B2000000;
+            break;
+        case 3000000:
+            rate = B3000000;
+            break;
+        case 4000000:
+            rate = B4000000;
+            break;
+        default:
+            rate = B115200;
+            break;
+    }
+
+    return rate;
+}
+
+int gnss_port_open(const char *dev, int flag, int baud, bool tty)
+{
+
+    int fd = -1;
+    if((fd = open(dev, flag)) < 0)
+    {
+        printf("Open %s fail errno = [%d].\n", dev, errno);
+        return -1;
+    }
+
+    printf("Open %s success.\n", dev);
+    if (tty)
+    {
+        int rate = uart_baud_get(baud);
+        /* set newtio */
+        struct termios newtio;
+        memset(&newtio, 0, sizeof(newtio));
+        //(void)fcntl(fd, F_SETFL, 0);
+        /* no flow control for uart by default */
+        newtio.c_cflag = rate | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
+        newtio.c_iflag = IGNPAR;
+        //newtio.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
+        newtio.c_oflag = 0;
+        newtio.c_lflag = 0;    /* disable ECHO, ICANON, etc... */
+
+        newtio.c_cc[VERASE]   = 0x8;      /* del */
+        newtio.c_cc[VEOF]     = 4;      /* Ctrl-d */
+        newtio.c_cc[VMIN]     = 1;      /* blocking read until 1 character arrives */
+        newtio.c_cc[VEOL]     = 0xD;      /* '\0' */
+
+        tcflush(fd, TCIOFLUSH);
+        tcsetattr(fd, TCSANOW, &newtio);
+    }
+
+    return fd;
+}
+
+int main(int argc, char *argv[])
+{
+    if(argc != 2) {
+        printf("%s <dev>\n", argv[1]);
+        return -1;
+    }
+
+    int fd = gnss_port_open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY, 115200, TRUE);
+    if(fd < 0) {
+        printf("gnss_port_open(%s) fail:%d\n", argv[1], errno);
+        return -1;
+    }
+
+    char buff[1024];
+    int len, ret;
+    fd_set fdr;
+    FD_ZERO(&fdr);
+    FD_SET(fd, &fdr);
+
+    while(1) {
+        ret = select(fd + 1, &fdr, NULL, 0, NULL);
+        if (ret < 0)
+        {
+            if (errno == EINTR)
+            {
+                continue;
+            }
+            printf("select error, errno = %d (%s)\n", errno, strerror(errno));
+            break;
+        }
+        else if (ret == 0)
+        {
+            printf("select ret == 0\n");
+            break;
+        }
+
+        if (FD_ISSET(fd, &fdr))
+        {
+            memset(buff, 0, sizeof(buff));
+            len = read(fd, buff, sizeof(buff));
+            if(len > 0) {
+
+
+            } else if(len ==0 ){
+                printf("Read end : len = 0\n");
+                break;
+            } else {
+                if(EAGAIN == errno) {
+                    usleep(50000);
+                    continue;
+                } else {
+                    printf("Read ret = -1 ,errno = %d\n", errno);
+                    break;
+                }
+            }
+        }
+        else
+        {
+            printf("Unknown select event.\n");
+            continue;
+        }
+    }
+
+    printf("exit.\n");
+    return 0;
+}
+
+
diff --git a/mbtk/test/others/ubus_demo.c b/mbtk/test/others/ubus_demo.c
new file mode 100755
index 0000000..4806be3
--- /dev/null
+++ b/mbtk/test/others/ubus_demo.c
@@ -0,0 +1,79 @@
+#include <unistd.h>
+
+#include <libubox/blobmsg_json.h>
+#include "libubus.h"
+#include "mbtk_audio.h"
+
+void receive_call_result_data(struct ubus_request *req, int type, struct blob_attr *msg)
+{
+    printf("receive_call_result_data()\n");
+	if (!msg)
+		return;
+
+	printf("len - %d,data - %s\n", msg->id_len, msg->data);
+}
+
+
+int main(int argc, char *argv[])
+{
+#if 1
+    if(argc != 3) {
+        printf("ubus_demo switch/mode 0/1/-2/2\n");
+        return -1;
+    }
+    char *type = NULL;
+    int value = atoi(argv[2]);
+    if(!strcmp(argv[1], "switch")) {
+        type = "switch_pcm";
+        if(value != 0 && value != 1) {
+            printf("ubus_demo switch/mode 0/1/-2/2\n");
+            return -1;
+        }
+    } else if(!strcmp(argv[1], "mode")) {
+        type = "audio_mode_set";
+        if(value != -2 && value != 2) {
+            printf("ubus_demo switch/mode 0/1/-2/2\n");
+            return -1;
+        }
+    } else {
+        printf("ubus_demo switch/mode 0/1/-2/2\n");
+        return -1;
+    }
+
+    static struct ubus_context *ctx;
+    ctx = ubus_connect(NULL);
+	if (!ctx) {
+		printf("Failed to connect to ubus\n");
+		return -1;
+	}
+
+    static struct blob_buf b;
+    uint32_t id;
+	int ret;
+    ret = ubus_lookup_id(ctx, "audio_if", &id);
+	if (ret) {
+        printf("ubus_lookup_id() fail.\n");
+		return ret;
+	}
+
+
+
+    blob_buf_init(&b, 0);
+    blobmsg_add_u32(&b, "param0", value);
+	if((ret = ubus_invoke(ctx, id, type, b.head, NULL/*receive_call_result_data*/, NULL, 0)) != UBUS_STATUS_OK) {
+        printf("ubus_invoke fail:%d.\n", ret);
+	} else {
+        printf("ubus_invoke success.\n");
+	}
+#else
+
+    int handler = 0;
+    mbtk_audio_ubus_client_init(&handler, NULL);
+
+    mbtk_audio_switch_pcm(1);
+    mbtk_audio_mode_set(2);
+
+#endif
+
+    return 0;
+}
diff --git a/mbtk/test/others/usb_check.c b/mbtk/test/others/usb_check.c
new file mode 100755
index 0000000..7a8fc43
--- /dev/null
+++ b/mbtk/test/others/usb_check.c
@@ -0,0 +1,39 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "mbtk_utils.h"
+
+static int running = 0;
+
+static void sig_handler(int sig)
+{
+    printf("Signal : %d\n", sig);
+    running = 0;
+}
+
+
+int main(int argc, char *argv[])
+{
+    int fd = open("/tmp/usb.info", O_CREAT | O_WRONLY, 0666);
+    signal(SIGINT, sig_handler);
+    signal(SIGTERM, sig_handler);
+    if(fd > 0) {
+        char buff[1024];
+        running = 1;
+        while(running){
+            memset(buff, 0, 1024);
+            if(mbtk_cmd_line("cat /sys/class/android_usb/android0/state", buff, 1024)) {
+                mbtk_write(fd, buff, strlen(buff));
+                mbtk_write(fd, "\n", 1);
+            }
+            sleep(1);
+        }
+        close(fd);
+    }
+    return 0;
+}
+